?? 進程調度模擬程序.c
字號:
#include "stdio.h"
#include "stdlib.h"
#define LEN sizeof(struct process)
int creat();//定義操作函數
struct process//定義進程控制塊為結構體類型
{
int id;//標志符
int state;//狀態域
int pri;//優先權
struct process *next;//隊列中的下一個進程控制塊
}*processr,*processb,*p,*p1,*p2;//processr為就緒隊列指針,processb為阻塞隊列指針,定義*p,*p1,*p2
int n1=0,n2=0,n;//初始化n1,n2,定義n
//主函數
void main()
{
creat();//調用操作函數
}
//子程序
int creat()//操作函數實現
{
struct process *a,*e,*f,*h;//定義進程控制塊*a,*e,*f,*h
printf(" 請輸入就緒隊列中進程的個數:");
scanf("%d",&n);//從鍵盤輸入n
p1=p2=(struct process*)malloc(LEN);//申請進程控制塊p1,p2
p1->id=n1;//p1的標志符為n1
p1->state=1;//p1狀態域為1
p1->pri=rand();//p1的優先權為一個隨機數
processr=NULL;//置就緒隊列為空
while(n1!=n)//p1的標志符n1不等于n時執行循環
{
n1=n1+1;//n1加1后再賦給n1
if(n1==1)
processr=p1;//把p1插入到就緒隊列中
else//n1不等于1
p2->next=p1;//把p1鏈接到p2后面
p2=p1;//p2指向p1
p1=(struct process *)malloc(LEN);//申請進程控制塊p1
p1->id=n1;//p1的標志符為n1
p1->state=1;//p1狀態域為1
p1->pri=rand();//p1的優先權為一個隨機數
}
p2->next=NULL;//p2的下一個進程控制塊為空
e=p2;//e指向p2
a=processr;//a指向就緒隊列
printf(" 就緒隊列中進程為:\n");
while(a!=NULL)//若就緒隊列中的進程控制塊不為空時
{
printf(" %d,%d,%d\n",a->id,a->state,a->pri);//打印就緒隊列中進程控制塊的標志符,狀態域,優先權
a=a->next;
}
n2=n;//把n賦給n2
printf(" 請輸入阻塞隊列進程個數:");
scanf(" %d",&n);//從鍵盤輸入n
n=n+n1;//n加n1后賦給n
p1=p2=(struct process*)malloc(LEN);//申請進程控制塊p1,p2
p1->id=n1;//p1的標志符為n1
p1->state=0;//p1狀態域為0
processb=NULL;//置阻塞隊列為空
while(n2!=n)//若n2不等于n時,執行循環
{
n2=n2+1;//把n2加1后再賦給n2
if(n2==n1+1)
processb=p1;//把p1插入到阻塞隊列中
else//若n2不等于n1加1時
p2->next=p1;//把p1鏈接到p2后面
p2=p1;//p2指向p1
p1=(struct process*)malloc(LEN);//申請進程控制塊p1
p1->id=n2;//p1的標志符為n2
p1->state=0;//p1狀態域為0
}
p2->next=NULL;//p2的下一個進程控制塊為空
a=processb;//a指向阻塞隊列
printf(" 阻塞隊列中進程為:\n");
while(a!=NULL)//若阻塞隊列中的進程控制塊不為空時
{
printf(" %d,%d\n",a->id,a->state);//打印阻塞隊列中的進程控制塊的標志符,狀態域
a=a->next;
}
do
{
printf(" ******************進程調度模擬程序******************\n");
printf(" ****************************************************\n");
printf(" 0:退出\n");
printf(" 1:從就緒隊列中選擇一個優先權最高的進程輸出\n");
printf(" 2:從阻塞隊列中選擇第一個進程加入就緒隊列中\n");
printf(" ****************************************************\n");
printf(" 請選擇:");
scanf("%d",&n);//從鍵盤輸入n
switch(n)//switch多分支選擇語句
{
case 0://退出
break;
case 1://從就緒隊列中選擇一個優先權最高的進程輸出
if(processr==NULL)
{
printf(" 就緒隊列中已無進程,請執行其他操作!!!\n");
}
else
{
f=p=processr;//f,p分別指向就緒隊列
printf(" 就緒隊列中進程為:\n");
a=f;//a指向就緒隊列
while(a!=NULL)//若就緒隊列中進程不為空時
{
printf(" %d,%d,%d\n",a->id,a->state,a->pri);//打印就緒隊列中進程控制塊的標志符,狀態域,優先權
a=a->next;
}
while(processr->next!=NULL)//若就緒隊列中進程控制塊的下一個進程控制塊不為空時
{
h=processr;//h指向就緒隊列
processr=processr->next;
if(p->pri<processr->pri)//若p指向的進程控制塊的優先權小于就緒隊列中進程控制塊的優先權
{
a=h;//a指向就緒隊列
p=processr;//p指向就緒隊列中優先權最高的進程控制塊
}
}
printf(" 就緒隊列中優先權最高的進程的標識符為:\n");
printf(" %d\n",p->id);
printf(" 就緒隊列中優先權最高的進程的狀態域為:\n");
printf(" %d\n",p->state);
printf(" 就緒隊列中優先權最高的進程的優先權為:\n");
printf(" %d\n",p->pri);
if(p==f)
{
f=processr=f->next;
free(p);//釋放p
p=f;
}
else if(p==e)
{
e=a;
e->next=NULL;
free(p);//釋放p
processr=p=f;
}
else
{
a->next=p->next;
free(p);//釋放p
processr=p=f;
}
if(processr==NULL)//若就緒隊列中進程控制塊為空時
printf(" 就緒隊列的進程已全部執行完畢,等待執行其他操作!!!\n");
}
break;
case 2:
if(processb==NULL)
printf(" 阻塞隊列中的進程已為空,請執行其他操作!!!\n");
else//若阻塞隊列中進程控制塊不為空時
{
e->next=processb;
e=processb;
processb=processb->next;
e->next=NULL;//e的下一個進程控制塊為空
e->state=1;//e的狀態域為1
e->pri=rand();//e的優先權為一個隨機數
printf(" 加入就緒隊列后進程的標識符為:\n");
printf(" %d\n",e->id);
printf(" 加入就緒隊列后進程的狀態域為:\n");
printf(" %d\n",e->state);
printf(" 加入就緒隊列后進程的優先權為:\n");
printf(" %d\n",e->pri);
if(processr==NULL)//若就緒隊列中進程控制塊為空時
{
processr=p=f=e;
}
if(processb!=NULL)//若阻塞隊列中進程控制塊不為空時
{
a=processb;//a指向阻塞隊列
printf(" 阻塞隊列中進程為:\n");
while(a!=NULL)//若阻塞隊列中進程控制塊不為空時
{
printf(" %d,%d\n",a->id,a->state);//打印阻塞隊列中進程控制塊的標志符,狀態域
a=a->next;
}
}
else
printf(" 阻塞隊列中的進程已為空,等待執行其他操作!!!\n");
}
break;
default://輸入的數不為0,1,2
printf(" 輸入有誤請重新輸入!!!\n");
}
}while(n!=0);//當輸入的n不為0時
return 1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -