操作系统进程调度

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.实验目的:

进程是操作系统最重要的概念之一,进程调度又是操作系统核心的重要内容。通过该实验,要求同学们了解各进程在执行过程中的状态和参数的变化情况,以便于观察诸进程的调度过程

2.内容与要求:

按剥夺式优先数法对三个进程P1,p2,p3进行模拟调度,各进程的优先数静态设置,其中P1的优先数最高,P3的优先数最低。每个进程都处于执行E(execute),就绪R(ready)和等待W(wait)三种状态之一,并假定初始状态均为R.。

三个进程有如下同步关系:P1因等待事件1被阻塞后由P2发现并唤醒之,P2因等待事件2被阻塞后由P3发现并唤醒之。

当系统进入运行,在完成必要的初始化工作以后便进入进程调度,首先选择优先数最高的进程使其进入执行(分配CPU)。当执行进程因等待某个事件被阻塞或唤醒某个等待进程时,转入进程调度。

如果被唤醒的进程的优先数大于现行的执行进程,则剥夺现行进程的执行权,而将CPU分配给被唤醒的进程。当系统处于死锁或三个进程都执行完毕时系统退出运行。

系统中应用到如下数据结构:

*进程控制块PCB;

*信号量sem;

*其它需要的数据结构。由自己设计。

3.流程图:

根据现代操作系统的特征

1.并发性(concurrence);

2.共享性(sharing);

3.虚拟性(virtual);

4.异步性(asynchronism) 。

模拟出进程在执行中的状态变化过程;

体会进程申请资源、使用资源、归还资源;

体会死锁。

4.部分代码及截图:

#include

#include

#include

int find();

void find1();

void find2(int j);

void find3(int i);

int totaltime=0;

int lockpcb[3]={0};

int success[4]={0};

struct pcb{

int name;

char state;

int ntime;

int rtime;

int priority;

}pcb[4];

void main()

{

printf("

========================================================\n");

printf(" 进程调度演示\n");

printf("

========================================================\n");

printf("\n");

printf(" 1.演示算法\n");

printf(" 2.退出程序\n");

printf("\n");

printf("\n");

printf(" 选择进程调度方法:");

int choose;

scanf("%d",&choose);

int j;

for(j=1;j<=3;j++)

{

pcb[j].name=j;

pcb[j].state='r';

pcb[j].rtime=0;

pcb[j].ntime=3;

pcb[j].priority=abs(4-j);

}

for(j=1;j<=3;j++)

{

printf("进程%d\n",pcb[j].name);

printf(" 进程长度%d\n",pcb[j].ntime);

printf(" 进程优先级%d\n",pcb[j].priority);

}

srand((unsigned) time(NULL));

if(choose == 1)

{

printf("================================================================= =\n");

find1();

}

else

{

return;

}

}

int find()

{

int j;

for(j=1;j<=3;j++)

if(pcb[j].state=='r')

{

return(j);

}

else

{

if(pcb[j+2].state=='w')

return 4;

}

return(0);

}

void find3(int i)

{

pcb[i].state='r';

printf("进程%d被唤醒\n",i);

}

void find1()

{

int j;

j=find();

if(j==0)

{

exit(0);

}

else

{

find2(j);

}

}

void find2(int j)

{

if(j<4)

{

while(pcb[j].rtime < pcb[j].ntime)

{

totaltime++;

printf("时间:%d\t",totaltime);

printf("运行进程:%d ",j);

for(int k=3;k>=0;k--)

{

if(totaltime==lockpcb[k])

{

printf("有等待进程%d被唤醒\n",k);

success[j]=0;

find3(k);

find1();

}

}

int number = rand() % 4;

printf("时间:%d\t",totaltime);

printf("运行进程: %d",j);

if(number != 0)

{

printf(" 运行结果:成功\n");

pcb[j].rtime++;

}

else

{

printf("运行结果:阻塞\t");

pcb[j].state='w';

相关文档
最新文档