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