📄 xj.cpp
字号:
#include<stdio.h>
#include<iostream.h>
#define TRUE 1
#define FALSE 0
#define MAXPRI 100
#define NIL -1
struct{
int id;
char status;
int nextwr;
int priority;
}pcb[3];
struct{
int value;
int firstwr;
}sem[2];
char savearea[3][4],addr;
int i,s1,s2,seed,exe=NIL;
void init()
{
int j;
for(j=0;j<3;j++){
pcb[j].id=j;
pcb[j].status='r';
pcb[j].nextwr=NIL;
printf("\n process%d priority?",j+1);
scanf("%d",&i);
pcb[j].priority=i;
}
sem[0].value=1;sem[0].firstwr=NIL;
sem[1].value=1;sem[1].firstwr=NIL;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
savearea[i][j]='0';
}
double random()
{
int m;
if(seed<0) m=-seed;
else m=seed;
seed=(25173*seed+13849)%65536;
return(m/32767.0);
}
bool timeint(char ad)
{
double x;
x=random();
if((x<0.33)&&(exe==0)) return (FALSE);
if((x<0.33)&&(exe==1)) return (FALSE);
if((x<1.0) &&(exe==2)) return (FALSE);
savearea[exe][0]=i;
savearea[exe][1]=ad;
pcb[exe].status='t';
printf("Times silce interrupt\nprocess%d enter into ready.\n",exe+1);
exe=NIL;
return (TRUE);
}
int find()
{
int j,pd=NIL,w=MAXPRI;
for(j=0;j<3;j++)
if(pcb[j].status=='r')
if(pcb[j].priority<w){
w=pcb[j].priority;pd=j;
}
if(pd==NIL)
for(j=0;j<3;j++)
if(pcb[j].status=='t')
if(pcb[j].priority<w){
w=pcb[j].priority;pd=j;
}
return(pd);
}
int scheduler()
{
int pd;
if((pd=find())==NIL&&exe==NIL)
return (NIL);
if(pd!=NIL){
if(exe==NIL){
pcb[pd].status='e';
exe=pd;
printf("process%d is executing.\n",exe+1);
}
else if(pcb[pd].priority<pcb[exe].priority){
pcb[exe].status='r';
printf("process%d enter into ready \n",exe+1);
pcb[pd].status='e';
exe=pd;
printf("process%d is executing\n",exe+1);
}
}
i=savearea[exe][0];
addr=savearea[exe][1];
return(exe);
}
void block(int se)
{
int w;
printf("process%d is blocked\n",exe+1);
pcb[exe].status='w';
pcb[exe].nextwr=NIL;
if((w=sem[se].firstwr)==NIL)
sem[se].firstwr=exe;
else{
while(pcb[w].nextwr!=NIL);
pcb[w].nextwr=exe;
}
}
bool p(int se,char ad)
{
if(sem[se].value>=0) return (FALSE);
block(se);
savearea[exe][0]=i;
savearea[exe][1]=ad;
exe=NIL;
return(TRUE);
}
void wakeup(int se)
{
int w;
w=sem[se].firstwr;
if(w!=NIL) {
sem[se].firstwr=pcb[w].nextwr;
pcb[w].status='r';
printf("process%d is wakenup\n",w+1);
}
}
bool v(int se,char ad)
{
if(++sem[se].value>0) return (FALSE);
wakeup(se);
savearea[exe][1]=ad;
savearea[exe][0]=1;
return (TRUE);
}
void eexit(int n)
{
pcb[n].status='c';
printf("process%d is completed !\n",n+1);
exe=NIL;
}
void process1()
{
if(addr=='a') goto a1;
if(addr=='b') goto b1;
if(addr=='c') goto c1;
if(addr=='d') goto d1;
if(addr=='e') goto e1;
if(addr=='f') goto f1;
for(i=1;i<6;i++){
printf("process1 calls P on the semaphore 1\n");
if(p(0,'a')) break;
a1: printf("process1 is executing in the cretical section 1\n");
if(timeint('b')) break;
b1: printf("s1=%d\n",++s1);
printf("process1 calls V on semaphore1 and quit cretical section 1.\n");
if(v(0,'c')) break;
c1: printf("process1 callsP on semaphore 2.\n");
if(p(1,'d')) break;
d1: printf("process1 is execting is execting cretical section 2.\n");
if(timeint('e')) break;
e1: printf("s2=%d\n",++s2);
printf("process1 calls V on semaphore2 and quit section2. \n");
if(v(1,'f')) break;
f1: printf("process1 cycle count=%%d\n",i);
}
if(i<6) return;
eexit(0);
}
void process2()
{
if(addr=='a')goto a2;
if(addr=='b')goto b2;
if(addr=='c')goto c2;
if(addr=='d')goto d2;
if(addr=='e')goto e2;
if(addr=='f')goto f2;
for(i=1;i<6;i++){
printf("process2 calls P on semaphore2\n");
if(p(1,'a')) break;/*process l is blocked*/
a2:printf("process2 is executing in the cretical section2\n");
if(timeint('b')) break; /*time silce interrupt*/
b2:printf("s2=%d\n",++s2);
printf("process2 calls V on semaphorel and quit cretical section2.\n");
if(v(1,'c')) break;/*wake up a blocked process*/
c2:printf("process2 calls P on semaphorel2.\n");
if(p(0,'d')) break;/*proce2 is blocked*/
d2:printf("process2 is execting cretical section1.\n");
if(timeint('e')) break;
e2:printf("s1=%d\n",++s1);
printf("process2 call V on semaphore1 and quit cretical section1.\n");
if(v(0,'f')) break;/*wake up a block process */
f2:printf("process2 cycle count=%d\n",i);
}
if(i<6) return;
eexit(1);
}
void process3()
{
if(addr=='a')goto a3;
if(addr=='b')goto b3;
if(addr=='c')goto c3;
for(i=1;i<6;++i){
printf("process3 calls P on semaphore2\n");
if(p(1,'a')) break;/*process3 is blocked*/
a3:printf("process3 calls P on semaphore2\n");
if(timeint('b')) break;
b3:printf("s2=%d\n",++s2);
printf("process3 calls V on semaphore2 and quit cretical section.\n");
if(v(1,'c')) break;/*wake up a blocked process*/
c3:printf("process3 cyclen count=%d\n",i);
}
if(i<6) return;
eexit(2);
}
void main()
{
int k;
printf("****process management****\n");
init();
printf("s1=%d,s2=%d\n",s1,s2);
printf("process1,process2,process3 are all in ready!\n");
for(; ;)
if((k=scheduler())!=NIL)
switch(k){
case 0: process1();
break;
case 1:process2();
break;
case 2:process3();
break;
default:printf("process identifer error\n");
break;
}
else break;
printf("s1=%d,s2=%d\n",s1,s2);
printf("\n****END****\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -