📄 进程调度模拟程序.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 + -