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

📄 优先数调度改进.cpp

📁 操作系统中各个进程执行顺序的控制算法。如先来先服务
💻 CPP
字号:
#include "stdio.h"
#define running 1									//用running表示进程处于运行态
#define aready 2									//用aready表示进程处于就绪态
#define blocking 3									//用blocking表示进程处于等待态
#define sometime 5									//用sometime表示时间片大小
#define n 10										//假定系统允许进程个数为n
struct
{
	int name;										//进程标识符
	int status;										//进程状态
	int ax,bx,cx,dx;								//进程现场信息,通用寄存器内容
	int pc;											//进程现场信息,程序计数器内容
	int psw;										//进程现场信息,程序状态字寄存器内容
	int next;										//下一个进程控制块的位置
	int prior;										//优先数
}pcbarea[n];										//模拟进程控制块的位置	
int PSW,AX,BX,CX,DX,PC,PRIOR,TIME;					//模拟寄存器	
int run;											//定义指向正在运行进程的进程控制块的指针	
int MIN=10000;									    //设置优先数最小的优先
int NUMBER;											//进程号									
struct
{
	int head;
	int tail;
}ready;												//定义就绪队列的头指针head和尾指针tail
int pfree;											//定义指向空闲进程控制块队列的指针	
sheduling()											//进程调度函数
{									
	int i;	
	if(ready.head==-1)								//空闲进程控制块队列为空,退出						
	{	
		printf("无就绪进程\n");
		return;
	}
	i=ready.head;									//就绪队列头指针赋给i
	ready.head=pcbarea[ready.head].next;			//就绪队列头指针后移
	if(ready.head==-1)								//就绪队列为空,修正尾指针ready.tail	
		ready.tail=-1;								//修改进程控制块状态
	pcbarea[i].status=running;						//设置相对时钟寄存器
	TIME=sometime;
	//恢复该进程现场信息:
	AX=pcbarea[run].ax;
	BX=pcbarea[run].bx;
	CX=pcbarea[run].cx;
	DX=pcbarea[run].dx;
	PC=pcbarea[run].pc;
	PSW=pcbarea[run].psw;
	PRIOR=pcbarea[run].prior;
	run=i;											//修改指向运行进程的指针
}//进程调度函数结束
create(int x,int y)
//创建进程
{
	int i;
	if(pfree==-1)									//空闲进程控制块队列为空
	{
		printf("无空闲进程控制块,进程创建失败\n");
		return;
	}
	i=pfree;										//取空闲进程控制块队列的第一个
	pfree=pcbarea[pfree].next;						//pfree后移
	//填写该进程控制块内容
	pcbarea[i].name=x;
	pcbarea[i].status=aready;
	pcbarea[i].ax=x;
	pcbarea[i].bx=x;
	pcbarea[i].cx=x;
	pcbarea[i].dx=x;
	pcbarea[i].pc=x;
	pcbarea[i].psw=x;
	pcbarea[i].prior=y;
	if(MIN>=y)										//进行优先数比较
	{
		MIN=y;
		NUMBER=x;
	}
	if(ready.head!=-1)								//就绪队列不空时,挂入就绪队列方式
	{
		pcbarea[ready.tail].next=i;
		ready.tail=i;
		pcbarea[ready.tail].next=-1;
	}
	else											//就绪队列空时,挂入就绪队列方式
	{
		ready.head=i;
		ready.tail=i;
		pcbarea[ready.tail].next=-1;
	}//进程创建函数结束
}//
main()
{
	//系统初始化
	int num,i,j,N;
	run=ready.head=ready.tail=-1;
	pfree=0;
	for(j=0;j<n-1;j++)
		pcbarea[j].next=j+1;
	pcbarea[n-1].next=-1;
	printf("输入进程编号 输入优先数(避免编号的冲突,以负数输入结束,最多可以创建10个进程):\n");
	scanf("%d%d",&num,&N);
	while(num>=0)
	{
		create(num,N);
		scanf("%d%d",&num,&N);
	}
	sheduling();									//进程调度
	if(run!=-1)
	{
		printf("进程标识符 进程优先号  进程状态  寄存器内容:ax  bx  cx  dx  pc  psw:\n");
		printf("%d%12d%16d%18d%4d%4d%4d%4d%4d\n",pcbarea[run].name,NUMBER,pcbarea[run].status,pcbarea[run].ax,pcbarea[run].bx,
			    pcbarea[run].cx,pcbarea[run].dx,pcbarea[run].pc,pcbarea[run].psw);
	}
}//main()结束


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -