陈泳鑫3110006379操作系统实验报告(2)

2018-12-24 12:38

按任意键继续运行进程:

运行若干次后的状态:

添加新的进程:

七、思考题

1、 分析不同调度算法的调度策略,比较不同调度算法的优缺点,总结它们的适用范围。 答:动态有限权算法:动态优先权是指在创建进程时所创建的优先权,会随进程的推进或者等待时间的增加而改变,以便获得更好的调度性能。处理机为每个进程分配一定的时间片,在就绪队列中,优先权高的进程将优先获得处理机,进程在进去运行完响应的时间片后,如没完成,优先权减1,从新回到就绪队列等待分配处理机。

时间片的轮转法:系统将所有进程排成一个队列,按照先来先服务的原则,对队列首的进程进行处理,每个进程在用完自己的时间片后,从新回到队尾进行排队。每运行一次,进程的需要时间减1,直到就绪队列为空!

八、源代码

#include #include #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();


陈泳鑫3110006379操作系统实验报告(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:苏教版小学语文六年级上册教材分析及解读

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: