
七、源程序:
#include <stdioh>
int m1; //共享变量
int m2; //共享变量
struct{
int id; //进程标号
int waiter1; //指针,用于标识等待队列的下一个进程
int priority; //进程优先级
char status; //进程状态
}pcb[4];
struct{
int value; //信号量的值
int waiter2; //指针,用于标识等待此信号量队列的第一个进程
}sem[3];
char stack[11][4]; //现场保护堆栈
int i; //cpu中的通用寄存器
int ep; //当前运行进程指针
char addr; //程序运行时的地址
void init(); //初始化
int find(); //找出就绪进程
int w2(); //
int process1(); //进程1
int process2(); //进程2
int process3(); //进程3
int p(int,int ,char); //P原语
int v(int,int ,char); //V原语
main()
{
init();
printf("系统程序开始执行\n");
for(;;){
if(find()!=0) //找出就绪进程
w2(); //进程调度
else break;//退出程序
}
printf("系统程序结束\n");
}
void init() //初始化进程
{
int j,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; //进程指针初始化为0
pcb[j]priority=j; //设置进程优先级
}
for(j=1;j<=2;j++){
sem[j]value=1; //信号量赋值为1
sem[j]waiter2=0; //等待信号量队列的初始化
}
i=0; //CPU通用寄存器初始化
ep=0; //
addr='0'; //程序运行地址
m1=0; //共享变量初始化
m2=0; //共享变量初始化
for(j=1;j<=10;j++){
for(k=1;k<=3;k++)
stack[j][k]='0'; //现场保护堆栈初始化
}
}
int find(){ //查找初始化变量
int j;
for(j=1;j<=3;j++)
if(pcb[j]status=='r') return(j); //如果pcb队列中有就绪进程,返回进程编号
return(0);
}
int w2(){ //进程调度程序
int pd;
pd=find(); //找出就绪进程编号
if(pd==0) return(0); //如果没有找到就绪进程,退出程序
else if(ep==0){ //如果当前运行进程是否为0
pcb[pd]status='e'; //直接将当前进程设置为运行状态
ep=pd; //当前运行进程设置为pd
printf("进程%d正在执行\n",ep);
}
else
if(pcb[pd]priority<pcb[ep]priority)//如果当前进程比待调入进程优先级进行比较
{//调入进程优先级别高
pcb[ep]status='r'; //把CPU运行进程执行状态设置为就绪
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){ //根据当前运行的进程选择运行
case 1:process1();
break;
case 2:process2();
break;
case 3:process3();
break;
default:printf("当前进程出现错误%d\n",ep);
break;
}
}
int process1(){//进程1
if(addr=='m') goto m; //如果当前运行地址是m,跳到m运行
i=1;
a:
printf("进程1在信号量sem[1]上调用P *** 作\n");
if(p(1,1,'m')==0) return(0); //进行p *** 作,m表示程序执行到m
else goto m;
m:
printf("打印进程1m1=%d\n",m1); //进程1的 *** 作,打印,寄存器i+5
printf("打印进程1i=%d\n",i);
i+=5;
goto a; //跳回a执行
}
int process2(){//进程分为3部分
if(addr=='m') goto m;
if(addr=='n') goto n;
i=1;
a:
printf("进程2在信号量sem[2]上调用P *** 作\n");
if(p(2,2,'m')==0) return(0);
m:
m1=2m2;
printf("进程2在信号量sem[1]上调用V *** 作m1=%d\n",m1);
if(v(1,2,'n')==0) return(0);
else{
n:
printf("打印进程2i=%d\n",i);
i+=10;
goto a;
}
}
int process3(){
if(addr=='m') goto m;
if(addr=='n') goto n;
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;
goto a;
}
}
int p(int se,int p,char ad){
int w;
sem[se]value--; //信号量减1
if(sem[se]value==0) return(1); //如果信号量=0,返回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);
}
int v(int se,int p,char ad){
int w;
sem[se]value++; //信号量加1
if(sem[se]value>0) return(1); //信号量>0,无等待进程
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);
}
以上就是关于处理机调度模拟程序:选择一个调度算法,实现处理机调度。全部的内容,包括:处理机调度模拟程序:选择一个调度算法,实现处理机调度。、、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)