主题:你能改吗?
这是一个三个进程的调度,能改成5个进程的吗?看看~~~~~
#include <stdio.h>
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,ep;
char addr;
void init();
int find();
int w2();
int process1();
int process2();
int process3();
int p(int,int ,char);
int v(int,int ,char);
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;
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';
}
}
int find() //找准备的线程的编号
{
int j;
for(j=1;j<=3;j++)
if(pcb[j].status=='r') return(j);
return(0);
}
int w2(){ //主函数
int pd;
pd=find();
if(pd==0) return(0);
else if(ep==0){
pcb[pd].status='e';
ep=pd;
printf("进程%d正在执行\n",ep);
}
else if(pcb[pd].priority<pcb[ep].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){
case 1:process1();
break;
case 2:process2();
break;
case 3:process3();
break;
default:printf("当前进程出现错误%d\n",ep);
break;
}
}
int process1(){ //调用各线程的函数
if(addr=='m') goto m;
i=1;
a:
printf("进程1在信号量sem[1]上调用P操作\n");
if(p(1,1,'m')==0) return(0);
else goto m;
m:
printf("打印进程1...m1=%d\n",m1);
printf("打印进程1...i=%d\n",i);
i+=5;
goto a;
}
int process2(){
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=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;
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--;
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);
}
int v(int se,int p,char ad){ //释放信息量
int w;
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);
}
碓三个进程进行模拟调度,对各进程的优先数静态设置,P1,P2,P3三个进程的优先数为1,2,3,并指定P1的优先数最高,P3的优先数最低,每个进程都处于执行态“e”,就绪态“r”,等待态“w”三种状态之一,并假定初始态为“r”
int i; 用以模拟一个通用寄存器 //初始化赋值
char addr; 用以模拟程序计数器
int m1,m2;为系统设置的公用数据被三个进程共享使用。
#include <stdio.h>
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,ep;
char addr;
void init();
int find();
int w2();
int process1();
int process2();
int process3();
int p(int,int ,char);
int v(int,int ,char);
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;
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';
}
}
int find() //找准备的线程的编号
{
int j;
for(j=1;j<=3;j++)
if(pcb[j].status=='r') return(j);
return(0);
}
int w2(){ //主函数
int pd;
pd=find();
if(pd==0) return(0);
else if(ep==0){
pcb[pd].status='e';
ep=pd;
printf("进程%d正在执行\n",ep);
}
else if(pcb[pd].priority<pcb[ep].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){
case 1:process1();
break;
case 2:process2();
break;
case 3:process3();
break;
default:printf("当前进程出现错误%d\n",ep);
break;
}
}
int process1(){ //调用各线程的函数
if(addr=='m') goto m;
i=1;
a:
printf("进程1在信号量sem[1]上调用P操作\n");
if(p(1,1,'m')==0) return(0);
else goto m;
m:
printf("打印进程1...m1=%d\n",m1);
printf("打印进程1...i=%d\n",i);
i+=5;
goto a;
}
int process2(){
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=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;
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--;
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);
}
int v(int se,int p,char ad){ //释放信息量
int w;
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);
}
碓三个进程进行模拟调度,对各进程的优先数静态设置,P1,P2,P3三个进程的优先数为1,2,3,并指定P1的优先数最高,P3的优先数最低,每个进程都处于执行态“e”,就绪态“r”,等待态“w”三种状态之一,并假定初始态为“r”
int i; 用以模拟一个通用寄存器 //初始化赋值
char addr; 用以模拟程序计数器
int m1,m2;为系统设置的公用数据被三个进程共享使用。