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

📄 进程调度模拟程序.c

📁 操作系统进程调度模拟程序vc实现
💻 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 + -