printf(\
Display_Process(p); }
if(signal5&&p->P_Id==2) {
p->P_Requiry=1;
DeleteQueue(&Block_state,p);
strcpy(p->P_State,\
InsertQueue(&Ready_state,p);
printf(\ Display_Process(p); }
} }
void Create_Process() {
int i;
struct PCB *p;
char name[10];
strcpy(name,\
for(i=1;i<3;i++) //动态创建2个处于阻塞状态的进程 {
p=(struct PCB *)malloc(sizeof(struct PCB)); p->P_Id=i; name[7]=i+'0'; name[8]='\\0';
strcpy(p->P_Name,name);
strcpy(p->P_State,\ p->P_Runtime=1; p->P_Requiry=0;
Display_Process(p); Sleep(4000);
printf(\\\n process%d will be in the state of Block, waiting the resource ready \\n\\n\
DispatchToBlock(p); }
for(i=3;i<7;i++) {
//创建4个就绪状态的队列
//同时调度到阻塞队列
//创建进程函数
//所需要的时间片为1
p=(struct PCB *)malloc(sizeof(struct PCB)); p->P_Id=i;
name[7]=i+'0';
name[8]='\\0';
strcpy(p->P_Name,name);
strcpy(p->P_State,\
p->P_Requiry=1; if(i==6) p->P_Runtime=2; else
p->P_Runtime=1;
Display_Process(p); Sleep(4000);
printf(\ DispatchToReady(p); } }
void display(struct PCB **head) {
struct PCB *p; p=*head;
while(p!=NULL) {
Sleep(2000);
printf(\ printf(\
printf(\ printf(\
if(p->P_Requiry)
printf(\else
printf(\ p=p->next; } }
void Process_Run() {
//进程运行函数
//打印各个状态队列里进程数目
//在这里个进程6所需要的时间片为2
struct PCB *p;
while(Ready_state!=NULL) //就绪队列不空则继续执行 { p=Ready_state;
if(p->P_Runtime<=0) break; strcpy(p->P_State,\ Display_Process(p);
p->P_Runtime=p->P_Runtime-1; Sleep(4000); if(p->P_Runtime>0) {
//如果时间片执行完了,则跳出循环
//没有完成,则进入就绪队列
printf(\process is not finished,will be dispatch to the ready
queue!!\\n\
DeleteQueue(&Ready_state,p);
strcpy(p->P_State,\ InsertQueue(&Ready_state,p); Display_Process(p);
} else
//执行完成,则跳出,并发送相应的信息
{ printf(\is finished and will be in the state of exit!\\n\\n\
if(p->P_Id==4) signal4=1; if(p->P_Id==5) signal5=1;
DeleteQueue(&Ready_state,p); }
if(signal4||signal5)
DispatchBlockToReady(); //如果资源满足,则将进程调度到就绪队列 }
if(Ready_state==NULL)
printf(\}
void main(int argc,char * argv[]) {
char c='c';
//主函数
//界面
printf(\ printf(\ printf(\ scanf(\ while(1)
{
if(c=='s'||c=='S')break; scanf(\ }
Create_Process();
//调用创建进程函数
printf(\
printf(\ Sleep(5000);
display(&Ready_state); ////////////////显示就绪队列里的进程 printf(\
printf(\ Sleep(5000); //显示阻塞队列函数 display(&Block_state); /////////////////////
printf(\
printf(\ Sleep(5000); Process_Run(); }
//调用进程运行函数
六.程序使用说明:
1)输入字符‘s’启动程序
2)程序将自动执行,自动创建进程,运行进程和结束进程。 3)程序将自动显示每一步进程的执行状态。
七.实验结果分析
1) 写出各个进程被创建后的初始状态,并列出各进程初始时的PCB内容。
2) 阐述系统中各进程并发执行的过程,并分析就绪队列和等待队列的变化过程。 3) 描述Create_Process()函数和 Process_Run()函数的执行流程。
相关推荐: