题目:
编写并调试一个模拟的进程调度程序,采用优先级调度算法(含静态优先级和动态优先级)对五个进程进行调度。
优先级调度算法的基本思想是把CPU分配给就绪队列中优先数最高的进程。
静态优先数是在创建进程时确定的,并在整个进程运行期间不再改变。
动态优先数是指进程的优先数在创建进程时可以给定一个初始值,并且可以按一定原则修改优先数。例如:在进程获得一次CPU后就将其优先数减少1。或者,进程等待的时间超过某一时限时增加其优先数的值等等。可以自行设计动态改变优先级的策略。
/* @Process controlment with static and dynamic;
@author: Wayne;
@date:10/16/2007;
*/
#include <stdio.h>
#include <conio.h>
struct process/* 定义一个结构体 */
{
int pNum;
char pName[10];
int pPri;
}pro[5],array1[6],array2[6];
void Pcb1(struct process array1[ ],int n) /*静态调度方法主函数体*/
{
int i,t,k,tem,max;
for(t=0;t<n;t++)
{
max=t;
for(i=t+1;i<n;i++) /*算法:设一个变量max,根据不同的*/
if(array1[i].pPri>array1[max].pPri) /*Pri值,把最大值赋给max,再把max*/
max=i; /*的值按顺序赋到数组array1中,再*/
array1[5]=array1[t]; /*顺序输出,就相当于调度顺序*/
array1[t]=array1[max];
array1[max]=array1[5];
}
printf("Now the static attemmpering queue is:\n");
for(k=0;k<5;k++)
{
printf("%d,%s,%d\n",array1[k].pNum,array1[k].pName,array1[k].pPri);
}
}
void Pcb2(struct process array2[ ],int m) /*动态调度方法函数体*/
{
int i,t,k,st,l,tem,max;
for(st=0;st<10;st++)
{
for(t=0;t<m;t++)
{
max=t; /*前半部的算法同静态,动态与之不同的是*/
for(i=t+1;i<m;i++) /*只输出最先调用的进程即PRI最大的进程*/
if(array2[i].pPri>array2[max].pPri) /*采用的调度算法为,进程每被调度一次其*/
max=i; /*其优先级就变成1,与此同时其它的进程都*/
array2[5]=array2[t]; /*把优先级增加1,然后,再执行一遍函数体*/
array2[t]=array2[max]; /*再先出新的最大优先级的进程,被调用*/
array2[max]=array2[5];
}
printf("The dynamic control process:\n");
printf("Now the first process entering the CPU is:\n");
printf("%d,%s,%d\n",array2[0].pNum,array2[0].pName,array2[0].pPri); /*被调用的进程(Pri值最大),用输出表示被调用*/
array2[0].pPri=1;
for(l=1;l<5;l++)
array2[l].pPri++;
printf("Now changed PRI:\n");
for(k=0;k<5;k++)
printf("%d,%s,%d\n",array2[k].pNum,array2[k].pName,array2[k].pPri);
}
}
main() /*main函数主体*/
{
int i,j;
printf("Please input the list of processes:\n");
for (i=0;i<5;i++)
{
printf("Please input %d process Number:\n",i+1); /*为各结构体赋值*/
scanf("%d",&pro[i].pNum);
printf("Please input %d process Name:\n",i+1);
scanf("%s",&pro[i].pName);
printf("Please input %d process PRI:\n",i+1);
scanf("%d",&pro[i].pPri);
}
printf("the list is;\n");
for(j=0;j<5;j++)
printf("%d %s %d\t",pro[j].pNum,pro[j].pName,pro[j].pPri);
Pcb1(pro,5); /*调用两个函数*/
printf("\n");
Pcb2(pro,5);
getch();
}
[此贴子已经被作者于2007-10-19 22:59:04编辑过]