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

📄 operation.cpp

📁 操作系统中各个进程执行顺序的控制算法。如先来先服务
💻 CPP
字号:
#include"stdio.h"
#define running 1										//用running 表示进程处于进行状态
#define aready 2										//用aready 表示进程处于就绪状态
#define block 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 prior;											//优先数
	int next;											//下一个进程控制块的位置
}pcbarea[n];											//模拟进程控制块区域的数组
int PSW,AX,BX,CX,DX,PC,TIME;
//模拟寄存器
int run;												//定义指向正在运行进程的进程控制块指针
struct
{
	int head;
	int tail;
}ready;													//定义就绪队列的头指针head尾指针tail
int pfree;												//定义指向空闲控制块的队列的指针

void sheduling()												//进程调度函数
{
	int i;
	if(ready.head==-1)									//空闲进程控制块队列为空,退出
	{
		printf("无就绪进程\n");
		run=-1;
		return;
	}
	i=ready.head;										//就绪队列头指针赋给i
	ready.head=pcbarea[ready.head].next;				//就绪队列头指针后移
	if(ready.head==-1) ready.tail=-1;					//就绪队列为空,修正尾指针ready.tail
	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;
	run=i;												//修改指向运行进程的指针
}//进程调度函数结束

void create(int x,int y)
{//创建进程
	int i,j;
	if(pfree==-1)
	{
		printf("无空闲进程控制块,进程创建失败\n");
		return;
	}
	if(pfree!=0)
	{
		for(i=0;i<pfree;i++)
		{
			if(pcbarea[i].prior<y)
			{
				for(j=pfree;j>=i;j--)
				{
					pcbarea[j].name=pcbarea[j-1].name;
					pcbarea[j].status=pcbarea[j-1].status;
					pcbarea[j].ax=pcbarea[j-1].ax;
					pcbarea[j].bx=pcbarea[j-1].bx;
					pcbarea[j].cx=pcbarea[j-1].cx;
					pcbarea[j].dx=pcbarea[j-1].dx;
					pcbarea[j].pc=pcbarea[j-1].pc;
					pcbarea[j].psw=pcbarea[j-1].psw;
					pcbarea[j].prior=pcbarea[j-1].prior;
				}
				break;				
			}
		}
	}
	else i=pfree;										//取空闲进程控制块的第一个
	j=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(ready.head!=-1)									//就绪队列不空时,挂入就绪队列方式
	{
		pcbarea[ready.tail].next=j;
		ready.tail=j;
		pcbarea[ready.tail].next=-1;
	}
	else												//就绪队列不空时,挂入就绪队列方式
	{
		ready.head=j;
		ready.tail=j;
		pcbarea[ready.tail].next=-1;
	}
}//进程创建函数结束

void main()
{//系统出始化
	int num,j,p;
	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");
	printf("p=");
	scanf("%d",&p);
	printf("N=");
	scanf("%d",&num);
	while(num>=0)
	{
		create(num,p);
		printf("p=");
		scanf("%d",&p);
		printf("N=");
		scanf("%d",&num);
	}
	do
	{	
		sheduling();									//进程调度
		if(run!=-1)
		{
			printf("进程标识符 进程状态 寄存器内容:ax bx cx dx pc psw:\n");
			printf("%d%16d%4d%4d%4d%4d%4d%4d\n",pcbarea[run].name,pcbarea[run].status,pcbarea[run].ax,pcbarea[run].bx,pcbarea[run].cx,pcbarea[run].dx,pcbarea[run].pc,pcbarea[run].psw);
		}
	}while(run!=-1);
}//main()结束

⌨️ 快捷键说明

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