设计一个按优先数调度算法实现处理器调度的进程.docx
《设计一个按优先数调度算法实现处理器调度的进程.docx》由会员分享,可在线阅读,更多相关《设计一个按优先数调度算法实现处理器调度的进程.docx(14页珍藏版)》请在冰豆网上搜索。
设计一个按优先数调度算法实现处理器调度的进程
实验报告
2012~2013学年第一学期
课程
操作系统原理
实验名称
设计一个按优先数调度算法实现处理器调度的进程
小组成员
阮广杰、陈智磊、高天翔、董云鹏
专业班级
10级计本三班
指导教师
屠菁
2012年11月29号
操作系统实验报告
实验目的:
在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。
当就绪状态进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。
本实验模拟在单处理器情况下处理器调度,设计一个按优先数调度算法实现处理器调度的进程,通过运行程序,能够清楚的表述优先数调度的过程,进一步掌握优先数调度算法的实现。
实验内容:
设计一个按优先数调度算法实现处理器调度的进程。
实验步骤:
概要设计:
(1)假定系统有5个进程,每个进程用一个PCB来代表。
PCB的格式为:
进程名、指针、要求运行时间、优先数、状态。
进程名——P1~P5。
指针——按优先数的大小把5个进程连成队列,用指针指出下一个进程PCB的首地址。
要求运行时间——假设进程需要运行的单位时间数。
优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。
状态——假设两种状态,就绪,用R表示,和结束,用E表示。
初始状态都为就绪状态。
(2)每次运行之前,为每个进程任意确定它的“优先数”和“要求运行时间”。
(3)处理器总是选队首进程运行。
采用动态改变优先数的办法,进程每运行1次,优先数减1,要求运行时间减1。
(4)进程运行一次后,若要求运行时间不等于0,则将它加入队列,否则,将状态改为“结束”,退出队列。
(5)若就绪队列为空,结束,否则,重复(3)。
详细设计:
1、程序中使用的数据结构及符号说明:
typedefstructPCB{
charname[50];//进程名以序号代替
LPVOIDlp;//指向进程的长指针,模拟的,所以没用到。
inttm;//需要运行的时间
intprior;//初始的优先数
charstate;//状态
structPCB*next;//指向下一个PCB块
}PCB;
2、程序主要部分流程图:
3、源程序清单:
//Main.cpp
//prior.cpp:
Definestheentrypointfortheapplication.
//
#include"stdafx.h"
#include"resource.h"
#include"MainDlg.h"
#include
intAPIENTRYWinMain(HINSTANCEhInstance,//当前进程句柄
HINSTANCEhPrevInstance,//前次进程句柄
LPSTRlpCmdLine,//启动信息
intnCmdShow)//
{
//EnableIPAddress、Calendar.etc
InitCommonControls();//系统调用函数
DialogBox(hInstance,MAKEINTRESOURCE(IDD_MAIN),NULL,Main_Proc);
return0;
}
//MainDlg.cpp
#include"stdafx.h"
#include
#include
#include"resource.h"
#include"MainDlg.h"
#include"cross.h"
#include"time.h"
intMAX_NUM;//用户输入进程数
char*pst1="------------------------------------------------------------------------------\r\n";
char*pst2="=======================================\r\n";
typedefstructPCB{
charname[50];//进程名以序号代替
LPVOIDlp;//指向进程的长指针,模拟的,所以没用到。
inttm;//需要运行的时间
intprior;//初始的优先数
charstate;//状态
structPCB*next;//指向下一个PCB块
}PCB;
intbegin(intp,HWNDhwnd);//开始模拟
PCB*initialize();//初始化PCB块,建立PCB链表
voidrun(PCB*head,HWNDhwnd);// 模拟运行优先数调度
voidoutput(PCB*head,PCB*select,HWNDhwnd);// 输出全部PCB块信息
voidaddText(HWNDhwnd,char*pstr);// 处理输出细节
BOOLWINAPIMain_Proc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam)
{
switch(uMsg)
{
HANDLE_MSG(hWnd,WM_INITDIALOG,Main_OnInitDialog);
HANDLE_MSG(hWnd,WM_COMMAND,Main_OnCommand);//处理按钮的消息
HANDLE_MSG(hWnd,WM_CLOSE,Main_OnClose);
}
returnFALSE;
}
BOOLMain_OnInitDialog(HWNDhwnd,HWNDhwndFocus,LPARAMlParam)
{
returnTRUE;
}
voidMain_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify)
{
switch(id)
{
caseIDC_SURE:
{
TCHARstrin[256];
unsignedinti=0;
intp=0;
SetDlgItemText(hwnd,IDC_EDITOUT,"");//输出文本框设置空
GetDlgItemText(hwnd,IDC_EDITIN,strin,sizeof(strin));//获取文本内容
if(strlen(strin)==0){
MessageBox(hwnd,TEXT("请输入数字"),TEXT("警告"),MB_OK);
}
while(i!
=strlen(strin))
{
if(isdigit(strin[i]))p=p*10+(int)strin[i]-48;//字符串变数字
else{MessageBox(hwnd,TEXT("请输入数字"),TEXT("警告"),MB_OK);return;}
i++;
}
if(0==p){MessageBox(hwnd,TEXT("请输入大于0的数字"),TEXT("警告"),MB_OK);return;}
begin(p,hwnd);
}
break;
caseIDC_CLEAR:
{
SetDlgItemText(hwnd,IDC_EDITIN,"");
SetDlgItemText(hwnd,IDC_EDITOUT,"");
}
break;
default:
break;
}
}
voidMain_OnClose(HWNDhwnd)
{
EndDialog(hwnd,0);
}
intbegin(intp,HWNDhwnd)
{
MAX_NUM=p;
PCB*head;
char*pstr=TEXT("序号时间优化数状态\r\n");//定义字符串指针,指向""里的内容
head=(PCB*)malloc(sizeof(PCB));
head=initialize();//初始化PCB块
addText(hwnd,pstr);//输出pstr内容
run(head,hwnd);//模拟运行
return0;
}
PCB*initialize()
{
inti=0,temp;
PCB*head;
PCB*ptemp,*qtemp;
srand((unsigned)time(NULL));//初始化随机数种子
while(i!
=MAX_NUM)
{
ptemp=(PCB*)malloc(sizeof(PCB));
itoa(i,ptemp->name,10);
temp=rand()%11+1;//获取随机数
ptemp->tm=temp;
temp=rand()%11+1;
ptemp->prior=temp;
temp=rand()%11+1;
ptemp->state='R';
if(i==0){head=ptemp;qtemp=ptemp;}
else{qtemp->next=ptemp;qtemp=ptemp;}
i++;
}
qtemp->next=NULL;
returnhead;
}
voidrun(PCB*head,HWNDhwnd)
{
PCB*h=head;//头指针
PCB*t=head;//最大优先数
PCB*p=h;//遍历链表
PCB*temp;
//intflag=0;
while(t!
=NULL)
{
p=h;
while(p!
=NULL)
{
if((p->state!
='E')&&(p->prior>t->prior))t=p;
p=p->next;
}//找最大的优先数进程
output(head,t,hwnd);//输出所有进程信息
t->prior--;//优先数减一
t->tm--;//运行时间减一
if(t->tm==0)t->state='E';//当进程运行时间为0,标志为E
temp=t;
t=NULL;
p=h;//p指向头
while(p!
=NULL)if(p->state=='R'){t=p;break;}elsep=p->next;//找到第一个就绪状态的进程
}
output(head,temp,hwnd);
}
voidoutput(PCB*head,PCB*select,HWNDhwnd)
{
PCB*h=head;
addText(hwnd,pst1);
while(h!
=NULL)
{
charch[256];
wsprintf(ch,"%-13s%-13d%-13d%c",h->name,h->tm,h->prior,h->state);
addText(hwnd,ch);
if(h==select){addText(hwnd,"****");}
addText(hwnd,"\r\n");
h=h->next;
}
addText(hwnd,pst2);
}
voidaddText(HWNDhwnd,char*pstr)//向文本框添加pstr内容
{
HWNDhEdit=GetDlgItem(hwnd,IDC_EDITOUT);//获取文本框句柄
intndx=GetWindowTextLength(hEdit);//获取文本框内容长度
SetFocus(hEdit);//设置文本框焦点
SendMessage(hEdit,EM_SETSEL,(WPARAM)ndx,(LPARAM)ndx);//设置文本框选定内容选定末尾
SendMessage(hEdit,EM_REPLACESEL,0,(LPARAM)((LPSTR)pstr));//以pstr替代上述选定内容
}运行结果截图:
四、实验总结:
本实验主要是用链表实现的,整个过程思路很简单,但是实现起来较困难。
实验难点在于:
怎么实现文本框的控制,怎么用指针的形式来指向每个要处理的优先数,怎样实现优先数的比较等。
通过本次实验:
我们更加清楚的认识到处理器调度的过程:
在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。
当就绪状态进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。
本实验模拟在单处理器情况下处理器调度,设计一个按优先数调度算法实现处理器调度的进程。