处理器调度之动态优先数调度算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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->prioritypriority)

{

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);

相关文档
最新文档