处理器调度之动态优先数调度算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 处理机调度
实验内容及要求
实验内容:按优先数调度算法实现处理器调度。
实验要求:能接受键盘输入的进程数、进程标识、进程优先数及要求运行时间,能显示每次进程调度的情况:运行进程、就绪进程和就绪进程的排列情况。
实验目的
本实验模拟在单处理器环境下的处理器调度,加深了解处理器调度工作。
实验环境
本实验的设计基于Windows7操作系统DevC++环境,用C语言实现编程。
实验思路
(1) 每个进程用一个PCB来代表。PCB的结构为:
进程名——作为进程标识。
优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。
要求运行时间——假设进程需要运行的单位时间数。
状态——假设两种状态:就绪和结束,用R表示就绪,用E表示结束。
初始状态都为就绪状态。
指针——按优先数的大小把5个进程连成队列,用指针指出下一个进程PCB的首地址。
(2) 开始运行之前,为每个进程确定它的“优先数”和“要求运行时间”。通过键盘输入这些参数。
(3) 处理器总是选择队首进程运行。采用动态改变优先数的办法,进程每运
行1次,优先数减1,要求运行时间减1。
(4) 进程运行一次后,若要求运行时间不等于0,则将它加入就绪队列,否则,将状态改为“结束”,退出就绪队列。
(5) 若就绪队列为空,结束,否则转到(3)重复。
数据结构与全局变量
typedef struct pcb{
int pname;
.\n", >pname);
printf("%s ends after %d slice(s).", >pname, >runTime);
}
else
while!=NULL)
{
sortProcess();
printProcessInfo();
printProcessLink();
runProcess();
}
return 0;
}
void createProcess()
{
PCB *p, *prior;
printf("How many process do you want to run:");
scanf("%d", &num);
while(num<=0)
{
printf("Number is invalid. Input again:\n");
scanf("%d", &num);
}
p = (PCB*)malloc(sizeof(PCB));
prior = &readyHead;
prior->next=p;
for (int i = 0; i < num; i++)
{
printf("Input NO.%2d process name:", i+1);
scanf("%s", p->pname);
printf(" priority:");
scanf("%d", &(p->priority));
printf(" runTime:");
scanf("%d", &(p->runTime));
p->state = 'R';
p->next = (PCB*)malloc(sizeof(PCB));
prior=p;
p=p->next;
}
free(p);
p = NULL;
prior->next=NULL;
readyEnd=prior;
printf("\n");
}
void sortProcess()
{
char name[N];
int i,j, priorityNum, timeNum;
PCB *p, *rear;
for(p=; p!=NULL; p=p->next)
for(rear=p->next; rear!=NULL; rear=rear->next) if(p->priority
{
strcpy(name, p->pname);
priorityNum=p->priority;
timeNum=p->runTime;
strcpy(p->pname, rear->pname);
p->priority=rear->priority;
p->runTime=rear->runTime;
strcpy(rear->pname, name);
rear->priority=priorityNum;
rear->runTime=timeNum;
}
}
void printProcessLink()
{
PCB *p=;
printf("process link: \n");
while(p!=NULL)
{
printf("%s",p->pname);
p=p->next;
if(p!=NULL) printf("->");
}
printf("\n");
}
void printProcessInfo()
{
PCB *p=;
printf("process information before running:\n");
printf("=================================================\n");
printf("NAME PRIORITY RUNTIME STATUS NEXT\n");
printf("=================================================\n");
while(p!=NULL)
{
printf("%-16s %-8d %-8d %-8s %s\n",p->pname, p->priority, p->runTime, (p->state=='R')"ready":"end", p->next->pname);
p=p->next;
}
}
void runProcess()
{
PCB *p=;
printf("process run:\n");
printf("%s\n",p->pname);