www.pudn.com > OS.zip > OS.cpp


#include  
#include  
#include  
#include 
#include 
#include 
#include 
#include 
#include 
#include "stdio.h" 
using namespace std; 
HANDLE hstdout,hstdin; 
#define OK 1 
#define TRUE 1 
#define FALSE 0 
typedef int status; 
typedef struct LNode 
{ 
	char   name;	//进程标识符(进程名) 
    char   state;		//进程状态,B-就绪,R-运行,w-阻塞 
	int    needtime;	//进程到完成还需要的CPU时间 
	int    cputime;		//进程占用的CPU时间 
	int	   lastime;		//进程剩余时间 
	int	   number;		 
	//进程占用资源数,number==5 进程运行;number == 4 进程就绪;number == 3 进程阻塞 
}Elemtype; 
 
typedef struct QNode 
{ 
	LNode  pdata; 
	struct QNode *next; 
}QNode,*QueuePtr; 
 
typedef struct  
{ 
	QueuePtr front; 
	QueuePtr rear; 
}LinkQueue; 
 
status InitQueue(LinkQueue &Q) 
{ 
	Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)); 
	if(!Q.front)return ERROR; 
	Q.front->next=NULL; 
	return OK; 
} 
 
status EnQueue(LinkQueue &Q,Elemtype e) 
{ 
	QueuePtr p; 
	p=(QueuePtr)malloc(sizeof(QNode)); 
	if(!p)return ERROR; 
	p->pdata=e; 
	p->next=NULL; 
	Q.rear->next=p; 
	Q.rear=p; 
	return OK; 
} 
 
status DeQueue(LinkQueue &Q,Elemtype &e){ 
	QueuePtr p; 
	if(Q.front==Q.rear)return ERROR; 
	p=Q.front->next; 
	e=p->pdata; 
	Q.front->next=p->next; 
	if(Q.rear==p)Q.rear=Q.front; 
	free(p); 
	return OK; 
} 
status QueueEmpty(LinkQueue Q) 
{//运行队列为空 
	if(Q.front == Q.rear) 
		return TRUE; 
	return FALSE; 
} 
status Beready(LinkQueue &Ready,LinkQueue &Run,	Elemtype &e) 
{//就绪状态------>运行状态	 
	if(!(QueueEmpty(Ready)) && QueueEmpty(Run)) 
	{ 
		DeQueue(Ready,e); 
		e.number=5; 
		int t=rand()%10+1; 
		if(t<=e.lastime) 
			e.cputime=t; 
		else e.cputime=e.lastime; 
		e.lastime=e.lastime-e.cputime; 
		e.state='R'; 
		EnQueue(Run,e); 
		return TRUE; 
	} 
	return FALSE; 
} 
status CPURun(LinkQueue &Ready,LinkQueue &Run,LinkQueue &Block,Elemtype &e)  
{//进程:运行---->阻塞,运行----->就绪,运行------>完成 
	if(QueueEmpty(Run)) 
		if(!(QueueEmpty(Ready))) 
			Beready(Ready,Run,e); 
	if(!QueueEmpty(Run)) 
	{ 
		DeQueue(Run,e);				 
		if(e.cputime == 0) 
		{ 
			if(e.lastime == 0) 
				return 4;				//4进程运行完成 
			e.number=4; 
			e.state='B'; 
			EnQueue(Ready,e); 
			return 3;			//3进程调入就绪队列		 
		} 
		int t=rand()%9+1; 
		e.number=t>=5?5:3; 
		if(e.number<5) 
		{	 
			e.lastime=e.lastime+e.cputime; 
			e.state='W'; 
			e.cputime = 0; 
			EnQueue(Block,e); 
			return 2;			//2进程调入阻塞队列 
		} 
		e.cputime=e.cputime - 1; 
		EnQueue(Run,e); 
		return 1; 
	} 
	return FALSE; 
} 
status Weakup(LinkQueue &Block,LinkQueue &Ready,Elemtype &e) 
{//阻塞----->就绪 
	QueuePtr wait; 
	int i=0,t; 
	wait=Block.front; 
	if(!(QueueEmpty(Block))) 
	{ 
		e.number = wait->pdata.number; 
		t = rand()%6+1; 
		e.number = t>=4?4:e.number; 
		if(e.number >= 4) 
		{ 
			DeQueue(Block,e); 
			e.state = 'B'; 
			e.number=4; 
			EnQueue(Ready,e); 
			return OK; 
		} 
	} 
	return FALSE; 
} 
void CreatPcb(LinkQueue &Ready,LinkQueue &Block,int n)  
{//创建进程,使进程入就绪队列 
	Elemtype p; 
	int i,t; 
	char str='a'; 
	for(i=1;i<=n;i++)  
	{  
		p.name = str; 
		p.cputime=0; 
		p.needtime=rand()%15+5; 
		p.lastime=p.needtime; 
		t=rand()%7; 
		p.number=t>=4?4:t; 
		if(p.number<4) 
		{ 
			p.state='W'; 
			EnQueue(Block,p); 
		} 
		else 
		{ 
			p.state='B'; 
			EnQueue(Ready,p); 
		} 
		cout<>t; 
	cout<<"********************************************************************************"<