按任意键继续运行进程:
运行若干次后的状态:
添加新的进程:
七、思考题
1、 分析不同调度算法的调度策略,比较不同调度算法的优缺点,总结它们的适用范围。 答:动态有限权算法:动态优先权是指在创建进程时所创建的优先权,会随进程的推进或者等待时间的增加而改变,以便获得更好的调度性能。处理机为每个进程分配一定的时间片,在就绪队列中,优先权高的进程将优先获得处理机,进程在进去运行完响应的时间片后,如没完成,优先权减1,从新回到就绪队列等待分配处理机。
时间片的轮转法:系统将所有进程排成一个队列,按照先来先服务的原则,对队列首的进程进行处理,每个进程在用完自己的时间片后,从新回到队尾进行排队。每运行一次,进程的需要时间减1,直到就绪队列为空!
八、源代码
#include
#define getpch(type) (type*)malloc(sizeof(type)) #define NULL 0
#define TIME 2//时间片长度
typedef struct pcb{//进程管理块 char name[10];//进程名字 char state; //进程状态 int queue; //进程所在的队列 int ntime; //进程需要运行的时间 int rtime; //进程已经运行的时间 int etime; //进程在本队列可运行的时间片 struct pcb *link; }PCB;
PCB *ready = NULL, *pinsert = NULL, *pfend = NULL,*p =NULL; //就绪队列,进程插入位置的变量
int geti() //使用户仅能输入整数 { char ch; int i = 0; fflush(stdin); ch = getchar(); while(ch == '\\n'){ printf(\输入不能为空,请重新输入\\n\ fflush(stdin); ch = getchar(); } while(ch != '\\n'){ if(ch > '9' || ch < '0'){ printf(\输入有误!输入只能为正整数,请重新输入:\\n\ fflush(stdin); i = 0;
ch = getchar(); }else{ i = i*10 + (ch - '0'); ch = getchar(); } } return i; }
void findpos()//更新状态量 { PCB *ps = pfend; if(!ps || !ps -> link || (ps-> link->queue - ps->queue) > 1) pinsert = ps; else{ while (ps->link && ps ->link->queue != (pfend ->queue +2)) ps = ps->link; pinsert = ps; } }
void insert()//插入进程 { if(!ready ){ ready = p; pfend = p; pinsert = p; }else if(ready ->queue == 1){//第一队列存在 p->link = pfend->link; pfend->link = p; pfend = p; findpos(); } else{ p->link = ready; ready = p; findpos(); } }
void input()/*建立进程控制块函数*/ { int i,num; printf(\请输入进程的个数:\ num = geti(); for(i=0; i < num; i++) { printf(\进程号No.%d:\\n\ p=getpch(PCB); printf(\输入进程名:\
scanf(\ printf(\输入进程运行时间:\ p ->ntime = geti(); printf(\ p->rtime=0; p->state='w'; p->queue =1; p->etime = TIME; p->link=NULL; insert();/*调用insert函数*/ } }
void disp(PCB *pr)/*建立进程现实函数,用于显示当前进程*/ { printf(\在队列可停留时间\\t \\n\ printf(\ printf(\ printf(\ printf(\ printf(\ printf(\ printf(\}
void check()/*建立进程查看函数*/ { PCB *pr; printf(\当前正在运行的进程是:%s\显示当前运行的进程*/ disp(ready); pr= ready ->link; printf(\当前就绪队列状态为:\\n\显示就绪队列状态*/ while(pr!=NULL) { disp(pr); pr=pr->link; } }
void sort()//调整进程队列 { if(!ready->link ||ready->queue < ready->link->queue) return; p = ready ->link; ready ->link = pinsert ->link; pinsert ->link = ready; pinsert = ready; ready = p; if (ready && ready -> queue == pinsert ->queue){ findpos(); } }
void addnew()//添加新的进程 { if(ready ->queue != 1){ (ready -> queue)++; ready->etime *= 2; ready -> state='w'; sort();/*调用sort函数*/ input(); } else{ input(); } }
void destroy()/*建立进程撤销函数(进程运行结束,撤销进程)*/ { printf(\进程[%s]已完成.\\n\ p = ready; ready = ready->link; free(p); if (ready && ready -> queue == pinsert ->queue) findpos(); }
void running()/*建立进程就绪函数(进程运行时间到,置就绪状态)*/ { (ready -> rtime)++; ready ->etime --; if(ready->rtime == ready->ntime){ destroy(); return; }else if(ready ->etime == 0){ int time = 2; (ready -> queue)++; for(int i = 2; i != ready->queue; ++i) time *= 2; ready->etime = time; ready -> state='w'; sort();/*调用sort函数*/ } }
void main() { char ch; input(); while(ready != NULL) { printf(\ ready ->state = 'R'; check();