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

📄 进程调度.cpp

📁 这是一个用C语言实现的操作系统进程调度模拟程序
💻 CPP
字号:
#include <stdlib.h>
#include <stdio.h>
#include <iostream.h>
#include <string.h>

const int MAXPCB=10;

struct pcb{
	char  name[20];
	int  status;
	int  time;
	int  AX,BX,CX,DX;
	int  PC;
	int  psw;
	int  next;
};

struct pready{
	int head;
	int tail;
};

 int i,run,pfree=0,slot,flag=1,pcb_number,count=1;
 pcb pcbarea[MAXPCB];
 pready ready;

void pcb_create(char *name, int time)
{   
    if(pfree==0) 
	{
		ready.head=-1;
		ready.tail=-1;
	}
	if(pfree==-1)    printf("Error!");
	i=pfree;
	
	pfree=pcbarea[pfree].next;
	strcpy(pcbarea[i].name,name);
	pcbarea[i].status=0;
	pcbarea[i].time=time;
	if(ready.head==-1||ready.tail==-1)
	{
		ready.head=i;
		ready.tail=i;
		pcbarea[ready.tail].next=-1;
	}
	else
	{
		pcbarea[ready.tail].next=i;
		ready.tail=i;
		pcbarea[ready.tail].next=-1;
	}
}//进程创建原语

void process_switch()
{
	
	flag=0;
	if(ready.head!=-1)
	{
		i=ready.head;
	    ready.head=pcbarea[ready.head].next;
	    if(ready.head==-1) ready.tail=-1;
		run=i;
	}

	pcbarea[run].status=1;

	printf("\n第%d个时间片--进程%s运行中:\n",count,pcbarea[run].name);

	for(i=int(float(pcbarea[run].AX)/pcbarea[run].time*100)+1;
	    i<=int(float(pcbarea[run].AX+slot)/pcbarea[run].time*100);
		i++)
		{
			int m=0;
			while(m<30000000) m++;
			printf("%d%%完成",i);
			printf("\b\b\b\b\b\b\b\b");
			
		}
	printf("%d%%完成\n",int(float(pcbarea[run].AX+slot)/pcbarea[run].time*100));

	

	pcbarea[run].AX=pcbarea[run].AX+slot;
	if(pcbarea[run].AX/pcbarea[run].time==1) pcbarea[run].psw=0;
	if(pcbarea[run].psw)
	{
		pcbarea[run].status=0;
		if(ready.tail!=-1)
		{
			pcbarea[ready.tail].next=run;
		    ready.tail=run;
		    pcbarea[ready.tail].next=-1;
		}
	}
	for(i=0;i<pcb_number;i++)
		if(pcbarea[i].psw==1) flag=1;
	count++;
}//进程调度原语

void main()
{
	for(i=0;i<MAXPCB-1;i++)	
		pcbarea[i].next=i+1;
	pcbarea[MAXPCB-1].next=-1;//进程组织
    
	for(i=0;i<MAXPCB;i++)
	{
		pcbarea[i].psw=1;
		pcbarea[i].AX=0;
	}

    printf("\t\t________________________________\n");
	printf("\t\t*                              *\n");
	printf("\t\t*          进程调度模拟        *\n");
	printf("\t\t*        copyright by HanYue   *\n");
	printf("\t\t*              2006            *\n");
    printf("\t\t*______________________________*\n\n");
	int j;
	int time;
	char name[20];
	printf("请输入需要创建的进程个数:");
	scanf("%d",&pcb_number);
	for(j=0;j<pcb_number;j++)
	{
		printf("\n输入第%d个进程相关信息\n",j+1);
		printf("进程名:");
		scanf("%s",name);
		printf("任务时间:");
		scanf("%d",&time);
		pcb_create(name,time);
	}//进程创建
    
	printf("\n已创建进程信息如下:\n\n");
	printf("\t\t\t进程名\t状态\t任务时间\n");
	for(j=0;j<pcb_number;j++)
	{	
		printf("\t\t\t%s\t",pcbarea[j].name);
	    if(pcbarea[j].status==0) printf("ready");
		else printf("running");
		printf("\t  %d\n",pcbarea[j].time);
	}
    
	printf("\n输入时间片长度:");
	scanf("%d",&slot);
	
    printf("\n\n\n\t\t\t\t--------------\n");
	printf("\t\t\t\t*进程调度模拟*\n");
	printf("\t\t\t\t--------------\n");
	while(flag) 
	process_switch();
}

⌨️ 快捷键说明

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