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

📄 text1.cpp

📁 操作系统的进程调度
💻 CPP
字号:
#include "stdio.h" 
#include <stdlib.h> 
#include "conio.h"
#include <time.h>     //用来产生随机函数的
#define getpch(type) (type*)malloc(sizeof(type)) 
#define NULL 0 

struct pcb { /* 定义进程控制块PCB */ 
	char name[4]; 
	char state; /*进程的状态是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一*/
	int super; 
	int ntime;   //need time 
	int rtime;   //run time
	struct pcb* link; 
}*ready=NULL,*p; 

typedef struct pcb PCB;

void printname(PCB*);
void disp();

void sort() /* 建立对进程进行优先级排列函数*/ 
{ 
	PCB *first, *second; 
	int insert=0; 
	if((ready==NULL)||((p->super)>(ready->super))) /*优先级最大者,插入队首*/ 
	{ 
		p->link=ready; 
		ready=p; 
	} 
	else /* 进程比较优先级,插入适当的位置中*/ 
	{ 
		first=ready; 
		second=first->link; 
		while(second!=NULL) 
		{ 
			if((p->super)>(second->super)) /*若插入进程比当前进程优先数大,*/ 
			{ /*插入到当前进程前面*/ 
				p->link=second; 
				first->link=p; 
				second=NULL; 
				insert=1; 
			}
			else /* 插入进程优先数最低,则插入到队尾*/ 
			{
				first=first->link; 
				second=second->link; 
			}
		}
		if(insert==0) first->link=p; 
	} 
}

void input() /* 建立进程控制块函数*/ 
{ 
	int i,j,num;
	system("cls"); /*清屏*/ 
	printf("\n 请输入进程块数?"); 
	scanf("%d",&num); 
	for(i=0;i<num;i++) 
	{
		p=getpch(PCB);
		for(j=0; j < 4; j++)
		{
			p->name[j]=65+rand()%26;
		}
		p->super=1+rand()%10;//最高优先级为10
		p->ntime=1+rand()%5;
		printf("\n");
		p->rtime=0;p->state='w';
		p->link=NULL;
		sort(); /* 调用sort函数*/ 
	}
} 

int space()
{
	int l=0; PCB* pr=ready;
	while(pr!=NULL)
	{
		l++;
		pr=pr->link;
	}
	return(l);
} 

void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/ 
{
	//int j;
	printf("\tqname \t state \t super \t ndtime\truntime \n"); 
	printf("\t");
	printname(pr); 
    printf("\t| %c\t",pr->state); 
	printf("| %d\t",pr->super); 
	printf("| %d\t",pr->ntime); 
	printf("| %d\t",pr->rtime); 
	printf("\n"); 
}

void printname(PCB *pr)
{ 
	int j;
	printf("[");
	for(j=0;j<4;j++) printf("%c",pr->name[j]);
	printf("]");
}
void check() /* 建立进程查看函数 */ 
{
	PCB* pr; 
	printf("\n **** 当前正在运行的进程是:"); /*显示当前运行进程*/
    printname(p);
	printf("\n");
	disp(p); 
	pr=ready; 
	printf("\n ****当前就绪队列状态为:\n"); /*显示就绪队列状态*/ 
	while(pr!=NULL) 
	{ 
		disp(pr); 
		pr=pr->link;
	}
} 

void destroy(int len) /*建立进程撤消函数(进程运行结束,撤消进程)*/ 
{
	printf("\n 进程 ");
    printname(p);
    printf(" 已完成.\n"); 
	free(p);
    len--;
} 

void running(int len) /* 建立进程就绪函数(进程运行时间到,置就绪状态*/ 
{
	(p->rtime)++; 
	if(p->rtime==p->ntime)   //进程达到时间运行了,该撤销了
	{destroy(len);}          /* 调用destroy函数*/
	else 
	{ 
		(p->super)--; 
		p->state='w'; 
		sort(); /*调用sort函数*/ 
	} 
}

void sort2()
{
    PCB *first; 
	if(ready==NULL) /*优先级最大者,插入队首*/ 
	{ 
		ready=p; 
	} 
	else /* 插入队尾*/ 
	{ 
		first=ready; 
		while(first->link!=NULL) 
		{ 
			first=first->link; 
			
		}
		first->link=p; 
	} 
}

void input2()
{
    int i,j,num;
	system("cls"); /*清屏*/ 
	printf("\n 请输入进程块数?"); 
	scanf("%d",&num); 
	for(i=0;i<num;i++) 
	{
		p=getpch(PCB);
		for(j=0; j < 4; j++)
		{
			p->name[j]=65+rand()%26;
		}
		p->super=1+rand()%10;//最高优先级为10
		p->ntime=1+rand()%5;
		printf("\n");
		p->rtime=0;p->state='w';
		p->link=NULL;
		sort2(); /* 调用sort函数*/ 
	}
}

void sleep(int n)
{
	time_t temp=time(NULL);
	while(time(NULL)<temp+n) ;
}
void main() /*主函数*/ 
{ 
	int len,h=0;
	int slect;
	char ch;
	
	srand(time(0));

	printf("用最高优先级算法1\n时间片轮转算法  2\n\t");
	scanf("%d",& slect);
	if(slect==1)
	{
		input();
		printf("当前产生的进程:\n");
		PCB* pr; 
		pr=ready; 
		while(pr!=NULL) 
		{ 
			disp(pr);
			pr=pr->link;
		}
		getchar();
		len=space();
		printf("\n开始运行调度请按任意键。。。\n");
		getchar();
		while((len!=0)&&(ready!=NULL)) 
		{ 
			h++;
			system("cls");
			printf("\n The execute number:%d \n",h);
			p=ready; 
			ready=p->link;
			p->link=NULL; 
			p->state='R';
			check();
			running(len);
			printf("************************************************");
			sleep(2);
		} 
		printf("\n\n 全部进程已经完成.\n");
	}
	else if(slect==2)
	{
		input2();
		printf("当前产生的进程:\n");
		PCB* pr; 
		pr=ready; 
		while(pr!=NULL) 
		{ 
			disp(pr);
			pr=pr->link;
		}
		getchar();
		len=space();
		printf("\n开始运行调度请按任意键。。。\n");
		getchar();
		while((len!=0)&&(ready!=NULL)) 
		{ 
			h++;
			system("cls");
			printf("\n The execute number:%d \n",h);
			p=ready; 
			ready=p->link;
			p->link=NULL; 
			p->state='R';
			check();
			running(len);
			printf("************************************************");
			sleep(2);
		} 
		printf("\n\n 全部进程已经完成.\n");
	}
	else
	{
		printf("输入的号码不对\n");
	}

	ch=getchar(); 
}

⌨️ 快捷键说明

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