实验三 进程调度.docx
- 文档编号:9649407
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:10
- 大小:16.44KB
实验三 进程调度.docx
《实验三 进程调度.docx》由会员分享,可在线阅读,更多相关《实验三 进程调度.docx(10页珍藏版)》请在冰点文库上搜索。
实验三进程调度
实验三:
进程调度
一、实验内容
1.模拟批处理多道操作系统的进程调度;
2.模拟实现同步机构避免并发进程执行时可能与时间相关的错误;
二、实验目的
进程调度时进程管理的主要内容之一,通过设计,编制,调试一个简单的进程调度模拟系统,对进程调度,进程运行状态变换及PV操作加深理解和掌握。
三、实验题目
采用剥夺式优先算法,对三个进程进行模拟调度
模拟PV操作同步机构,用PV操作解决进程进入临界区的问题。
【提示】
(1)对三个进程进行模拟调度,对各进程的优先数静态设置,P1,P2,P3三个进程的优先数为1,2,3,并指定P1的优先数最高,P3的优先数最低,每个进程都处于执行态“e”,就绪态“r”,等待态“w”三种状态之一,并假定初始态为“r”。
(2)每一个进程用一个PCB表,PCB表的内容根据具体情况设置,该系统在运行过程中能显示或打印各进程和参数的变化情况,以便观察各进程的调度。
(3)在完成必要的初始化后,便进入进程调度程序,首先由P1进入执行,当执行进程因等待某各事件被阻塞或唤醒某个进程等待进程时,转进程调度。
(4)在进入临界区前后,调PV操作。
(5)如果被唤醒的进程优先数高于现有执行的进程,则剥夺现行进程的执行权。
(6)当三个进程都处于等待状态时,本模拟系统退出执行。
四、实验要求
1、仔细阅读程序,然后调试该程序;
2、将程序中进程的优先数改为随机数或者改为动态优先数,重新调试该程序;
3、将p1先执行改为p2或者p3先执行,并与p1先执行时的结果进行比较;
4、写好书面实验报告,于下次实验课时提交实验报告。
五、示例
1.数据结构:
(1)进程控制块PCB
struct{
intid;
charstatus;
intpriority;
intwaiter1;
}
(2)信号量
struct{
intvalue;
intwaiter2;
}sem[2]
(3)现场保护栈stack
charstack[11][4]
每个进程都有一个大小为10个字的现场保护栈,用来保护被中断时的断点地址等信息。
(4)全局变量
inti;用以模拟一个通用寄存器
charaddr;用以模拟程序计数器
intm1,m2;为系统设置的公用数据被三个进程共享使用。
六、程序框图:
略
七、程序说明:
本程序是用C语言编写,模拟三个进程的运行情况,过程在运行中要调用P操作申请信号量,如果该过程得到其申请的信号量,就继续运行,否则P操作阻塞该申请过程的运行,并将过程置为所申请信号量的等待者,如果已有其它过程在等待同一信号量则将该申请过程排在所有等待进程之后。
过程运行中除了调用P操作申请信号量外,还要调用V操作释放信号量,V操作在释放信号量之后,还将唤醒因申请此信号量而被阻塞的过程。
在程序运行的三个过程(PROCESS1,PROCESS2,PROCESS3),其中过程运行中通过P操作申请信号量1,过程2通过V操作释放信号量2,然后做一次操作申请信号量2。
三个过程之间存在这样一种关系:
过程1消耗的信号量1由过程2通过V操作产生,而过程3即释放信号量2也消耗信号量2。
三个过程的运行通过进程调度模块同意安排,调度模块通过FIND()函数找到第一个就绪过程,如果当前没有过程已在运行,就直接运行此过程,如果有,则比较两者的优先数,然后运行优先权高者。
七、源程序:
#include
intm1;
intm2;
struct{
intid;
intwaiter1;
intpriority;
charstatus;
}pcb[4];
struct{
intvalue;
intwaiter2;
}sem[3];
charstack[11][4];
inti,ep;
charaddr;
voidinit();
intfind();
intw2();
intprocess1();
intprocess2();
intprocess3();
intp(int,int,char);
intv(int,int,char);
main(){
init();
printf("系统程序开始执行\n");
for(;;){
if(find()!
=0)w2();
elsebreak;
}
printf("系统程序结束\n");
}
voidinit(){
intj,k;
pcb[0].status='w';
pcb[0].priority=4;
for(j=1;j<=3;j++){
pcb[j].id=j;
pcb[j].status='r';
pcb[j].waiter1=0;
pcb[j].priority=j;
}
for(j=1;j<=2;j++){
sem[j].value=1;
sem[j].waiter2=0;
}
i=0;
ep=0;
addr='0';
m1=0;
m2=0;
for(j=1;j<=10;j++){
for(k=1;k<=3;k++)
stack[j][k]='0';
}
}
intfind(){
intj;
for(j=1;j<=3;j++)
if(pcb[j].status=='r')return(j);
return(0);
}
intw2(){
intpd;
pd=find();
if(pd==0)return(0);
elseif(ep==0){
pcb[pd].status='e';
ep=pd;
printf("进程%d正在执行\n",ep);
}
elseif(pcb[pd].priority pcb[ep].status='r'; printf("读取进程%d\n",pcb[pd].id); pcb[pd].status='e'; ep=pd; } printf("运行进程%d\n",ep); i=stack[1][ep]; addr=stack[2][ep]; switch(ep){ case1: process1(); break; case2: process2(); break; case3: process3(); break; default: printf("当前进程出现错误%d\n",ep); break; } } intprocess1(){ if(addr=='m')gotom; i=1; a: printf("进程1在信号量sem[1]上调用P操作\n"); if(p(1,1,'m')==0)return(0); elsegotom; m: printf("打印进程1...m1=%d\n",m1); printf("打印进程1...i=%d\n",i); i+=5; gotoa; } intprocess2(){ if(addr=='m')gotom; if(addr=='n')goton; i=1; a: printf("进程2在信号量sem[2]上调用P操作\n"); if(p(2,2,'m')==0)return(0); m: m1=2*m2; printf("进程2在信号量sem[1]上调用V操作m1=%d\n",m1); if(v(1,2,'n')==0)return(0); else{ n: printf("打印进程2...i=%d\n",i); i+=10; gotoa; } } intprocess3(){ if(addr=='m')gotom; if(addr=='n')goton; i=1; a: if(i>4){ printf("进程3在信号量sem[2]上调用P操作\n"); if(p(2,3,'n')==0)return(0); } n: m2=i; printf("进程3在sem[2]信号量上调用V操作m=%d\n",m2); if(v(2,3,'m')==0)return(0); else{ m: i+=1; gotoa; } } intp(intse,intp,charad){ intw; sem[se].value--; if(sem[se].value==0)return (1); printf("阻塞当前进程%d\n",p); pcb[p].status='w'; ep=0; pcb[p].waiter1=0; w=sem[se].waiter2; if(w==0)sem[se].waiter2=p; else{ while(pcb[w].waiter1! =0)w=pcb[w].waiter1; pcb[w].waiter1=p; } stack[1][p]=i; stack[2][p]=ad; return(0); } intv(intse,intp,charad){ intw; sem[se].value++; if(sem[se].value>0)return (1); w=sem[se].waiter2; sem[se].waiter2=pcb[w].waiter1; pcb[w].status='r'; printf("唤醒进程%d\n",w); stack[1][p]=i; stack[2][p]=ad; return(0); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验三 进程调度 实验 进程 调度
![提示](https://static.bingdoc.com/images/bang_tan.gif)