回 帖 发 新 帖 刷新版面

主题:你能改吗?

这是一个三个进程的调度,能改成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;为系统设置的公用数据被三个进程共享使用。

回复列表 (共1个回复)

沙发

还可以用动画实现哦

我来回复

您尚未登录,请登录后再回复。点此登录或注册