⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xj.cpp

📁 支持多个进程并发运行的简单进程管理模拟系统。本系统的同步机构采用的信号量上的P
💻 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 + -