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<<"********************************************************************************"<