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

📄 单处理器系统的进程调度.c

📁 操作系统C编程——单处理器系统的进程调度
💻 C
字号:
#include <stdio.h>

struct pcb
{
	int name;  				/*进程标识符*/
	int status;  			/*进程状态*/
	int ax, bx, cx,dx; 		/*进程现场信息,通用寄存器内容*/
	int pc;         		/*进程现场信息,程序计数器内容*/
	int psw;       			/*进程现场信息,程序状态字寄存器内容*/
	int next;       		/*下一个进程控制块的位置*/
};

int  run;    		/*定义指向正在运行进程的进程控制块的指针*/
struct
{
	int  head;
	int  tail;
} ready;   		/*定义指向就绪队列的头指针head和尾指针tail*/
int  pfree;


struct pcb  pcbarea[10];
int life[10];

void Init();
void Print();
void SelectRun();
int IsNotIn(int v,int *array);
int IsUniqe(int v,struct pcb *array);
void Run();

int main(void)
{
	Init();
	printf("现在系统中有10个等待的进程:\n");
	while(1)
	{
		Print();
		SelectRun();
		Run();
	}
	return 0;
}

void Init()
{
	int count;
	int i;
	int max=0;
	int tmp;
	ready.head = -1;
	ready.tail = -1;
	pfree = 0;
	run = -1;
	for (i=0;i<10;i++)
		life[i] = 0;
	printf("请输入您将输入的进程数目(2~10):\n");
	scanf("%d",&count);
	while (count<2 || count>10)
	{
		printf("输入数据不符,请重新输入:\n");
		scanf("%d",&count);
	}
	for(i=0;i<10;i++)
		pcbarea[i].name = 0;
	for( i=0;i<count;i++)
	{
		printf("请输入第%d个进程ID\n",i+1);
		scanf("%d",&tmp);
		while(tmp <1 || !IsUniqe(tmp,pcbarea))
		{
			printf("输入不符。请重新输入:\n");
			scanf("%d",&tmp);
		}
		pcbarea[i].name=tmp;
		if(pcbarea[i].name>max)
			max = pcbarea[i].name;
		pcbarea[i].next=i+1;
		pcbarea[i].pc=0;
		pcbarea[i].status=0;  /*等待*/
	}
	if (count <10)
	{
		printf("此时系统中还有 %d个其他等待的进程.\n",10-count);
		for(;i<10;i++)
		{
			pcbarea[i].name=i+max;
			pcbarea[i].next=i+1;
		}
	}
	pcbarea[9].next=-1;
}

void Print()
{
	int i ;
	for(i=pfree;i!=-1;i=pcbarea[i].next)
		printf("%d.进程ID %d\n",i,pcbarea[i].name);
}

void SelectRun()
{
	int selected[10],lifetmp[10];
	int select[10];
	int m=1,n;
	char c;
	int i=0;
	int tmp;
	for(;i<10;i++)
	{
		selected[i]=0;
		lifetmp[i]=0;
		select[i]=-1;
	}
	printf("输入想要调度的进程ID和生命周期(\"n,12\"):\n");
	scanf("%d,%d",&selected[0],&lifetmp[0]);
	
	while (IsUniqe(selected[0],pcbarea))
	{
		printf("没有该进程存在!!");
		printf("输入想要调度的进程ID和生命周期(\"n,12\"):\n");
		scanf("%d,%d",&selected[0],&lifetmp[0]);
	}
	while(1)
	{
		if (m==10)
			break;
		getchar();
		printf("还要继续激活其他进程吗?(Y/N):");
		scanf("%c",&c);
		if (c=='N' || c=='n')
			break;		
		printf("输入想要调度的进程ID和生命周期(\"n,12\"):\n");
     	scanf("%d,%d",&tmp,&lifetmp[m]);
		if (!IsNotIn(tmp,selected))
		{
			printf("该进程不需再激活,本次操作失败!\n");
			selected[m] = 0;
			lifetmp[m] = 0;
			continue;
		}
		selected[m] = tmp;
		if (IsUniqe(selected[m],pcbarea))
		{
			printf("没有该进程存在!!\n");
			selected[m] = 0;
			lifetmp[m]=0;
			continue;
		}
		m++;
	}
	for (i=0,n=0;i<10 && selected[i] != 0;i++,n++)
	{
		for (m=0;m !=-1;m=pcbarea[m].next)
		{
			if(pcbarea[m].name == selected[i])
			{
				select[n]=m;
				life[n] = lifetmp[i];
				break;
			}
		}
		if(m==-1)
		{
			n--;
			printf("进程 %d 已经结束了。\n",pcbarea[selected[i]].name);
		}
	}
	ready.head = select[0];
	ready.tail = select[0];
	if (select[0]==pfree)
	{
		pfree = pcbarea[pfree].next;
		pcbarea[select[0]].next = -1;
	}
	else{
		for(m=pfree;m!=-1 && pcbarea[m].next !=select[0];m=pcbarea[m].next)
			;
		pcbarea[m].next = pcbarea[select[0]].next;
		pcbarea[select[0]].next = -1;
	}
	for(i=1;i<10 && select[i]!=-1;i++)
	{
		pcbarea[ready.tail].next = select[i];
		if (select[i]==pfree)
		{
			pfree = pcbarea[pfree].next;
			pcbarea[select[i]].next = -1;
		}
		else{
			for(m=pfree;m!=-1 && pcbarea[m].next !=select[i];m=pcbarea[m].next)
				;
			pcbarea[m].next = pcbarea[select[i]].next;
			pcbarea[select[i]].next = -1;
		}
		ready.tail = select[i];
	}
}

void Run()
{
	int point = 0;
	int total=0;
	int i = ready.head;
	for (;i!=-1;total++,i=pcbarea[i].next)
		;
	while(ready.head!=-1)
	{
		printf("进程 %d 被调度. PC = %d\n",pcbarea[ready.head].name,pcbarea[ready.head].pc);
		pcbarea[ready.head].pc++;
		if (pcbarea[ready.head].pc == life[point])
		{
			int tmp;
			printf("进程 %d 结束运行\n",pcbarea[ready.head].name);
			tmp = ready.head;
			ready.head = pcbarea[ready.head].next;
			if (ready.head==-1)
				continue;
			pcbarea[tmp].next=-1;
			total--;
			for (i=point;i<total;i++)
				life[i]=life[i+1];
			life[total] = 0;
		}else
		{
			 point++;
			 point %= total;
			 pcbarea[ready.tail].next = ready.head;
			 ready.tail = ready.head;
			 ready.head = pcbarea[ready.head].next;
			 pcbarea[ready.tail].next = -1;
		}
	}
}

int IsNotIn(int v,int *array)
{
	int i=0;
	for (;i<10;i++)
	{
		if(array[i] == v)
			return 0;
	}
	return 1;
}

int IsUniqe(int v,struct pcb *array)
{
	int i=0;
	for (;i<10;i++)
	{
		if(array[i].name == v)
			return 0;
	}
	return 1;
}

⌨️ 快捷键说明

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