模拟thread

上传人:j****9 文档编号:45504864 上传时间:2018-06-17 格式:DOC 页数:17 大小:114KB
返回 下载 相关 举报
模拟thread_第1页
第1页 / 共17页
模拟thread_第2页
第2页 / 共17页
模拟thread_第3页
第3页 / 共17页
模拟thread_第4页
第4页 / 共17页
模拟thread_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《模拟thread》由会员分享,可在线阅读,更多相关《模拟thread(17页珍藏版)》请在金锄头文库上搜索。

1、操作系统设计报告一一 需求分析需求分析在多道处理程序运行环境下,进程数目一般多于处理机数目,使得进程要通过竞争来使用处理机。这就要求系统能按照某种算法,动态地把处理机分配给就绪队列中的一个进程,使之运行,分配处理机的任务是由进程调度程序完成的。一个进程被创建后,系统为了便于对进程进行管理,将系统中的所有进程按照其状态,将其组成不同的进程队列。于是系统中有运行进程队列、就绪队列和各种事件的进程等待队列。进程调度的功能就是从就绪队列中挑选一个进程到处理机上运行。进程调度的算法有多种,常用的有优先级调度算法、先来先服务算法、时间片轮转算法。二二 概要设计概要设计最高优先级优先调度算法最高优先级优先调

2、度算法 动态优先数是指在进程创建时先确定一个初始优先数, 以后在进程运行中随着进程特 性的改变不断修改优先数,这样,由于开始优先数很低而得不到 CPU 的进程,就能因为 等待时间的增长而优先数变为最高而得到 CPU 运行。 例如:在进程获得一次 CPU 后就将其优先数减少 3。或者,进程等待的时间超过某一 时限时增加其优先数的值,等等。简单轮转法调度算法简单轮转法调度算法所有就绪进程按 FCFS 排成一个队列,总是把处理机分配给队首的进程,各进程占用 CPU 的时间片相同。即将 CPU 的处理时间划分成一个个相同的时间片,就绪队列的诸进 程轮流运行一个时间片。当一个时间片结束时,如果运行进程用

3、完它的时间片后还未完 成,就强迫运行机制进程让出 CPU,就把它送回到就绪队列的末尾,等待下一次调度。 同时,进程调度又去选择就绪队列中的队首进程,分配给它一时间片,以投入运行。直 至所有的进程运行完毕。短作业优先调度算法短作业优先调度算法所有就绪进程按所需时间由少到多排成一个队列,依次运行队列中的进程,并列表 显示出来,每个进程的开始运行时间减去进入内存时间就是该进程的等待时间,每个进 程的结束运行时间减去进入内存时间就是该进程的周转时间,每个进程的周转时间除于 服务时间就是带权周转时间。三三 详细设计详细设计一一优优先先权调权调度算法:度算法:1、用户可以自行输入进程的数量,每一个进程由进

4、程控制块( PCB)表示,各种队 列均采用链表数据结构。 2、 进程控制块包含如下信息:进程号、cpu 时间、所需要时间、优先数、状态 等等。3、 在每次运行程序时都要输入“进程数量” 、 “进程名称及占用时间” 。 4、 按照优先数的高低进行排列 5、 处理机调度队首元素运行。采用动态优先数办法,进程每运行一次优先数减“3” , 同时将已运行时间加“1” 。 6、 进程运行一次后,若要求运行时间不等于已运行时间,则再将它加入就绪队列; 否则将其状态置为“F”,且退出就绪队列。 7、 “R”状态的进程队列不为空,则重复上面步骤,直到所有进程都成为“F”状态。流程图流程图: : 开始初始化 PC

5、B,输入各进程信息按优先级加入就绪队列就绪队列空结束就绪队列中首进程运行标为Cpu 时间+1,进入下一个进程进程运行时间 满足所需时间进程运行完 成。 进程优先数减 3,插入 就绪队列中。NYN图.最高优先级优先调度算法流程图主要代码主要代码: void priority(char algo)PCB q; prt1(algo); for(int i = 0; i0) q.needtime-; if(q.needtime = 0) q.state = 3; if(q.state!=3) q.prio-=3; pp.push(q); while(!pq.empty() q = pq.top();

6、pq.pop(); if(q.needtime = 0) q.state = 3; prt2(algo , q);prt1(algo); pp.push(q); pq = pp; pp = pqempty; printf(“* *n“); printf(“ 输出结束n“); getchar(); 二二时间时间片片轮转轮转算法:算法:1、 用户可以自行输入进程的数量,每一个进程由进程控制块( PCB)表示,各种队列均 采用链表数据结构。 2、 按照进程输入的先后顺序排成一个队列。再设一个队首指针指向第一个到达进程的首 址。 3、 执行处理机调度时,开始选择队首的第一个进程运行。另外,再设一个当前

7、运行进程 的指针,指向当前正在运行的进程。 4、 考虑到代码的可重用性, 轮转法调度程序和最高优先级优先调度是调用同一个模快进 行输出 5、 在规定的时间片内进程是根据先来先服务的方式配列的,每个进程只运行时间片大小 的时间然后转到下一个进程运行。直到所有进程运行完为止。流程图流程图图. 简单轮转法调度算法流程图主要代码主要代码:void Roundrun(int timeSlice) while(run != NULL) run-cputime = run-cputime + timeSlice; run-needtime = run-needtime - timeSlice; run-ro

8、und+=timeSlice; run-count+; if(run-needtime needtime = 0; run-next = finish;初始化 PCB、输入进程信息和 时间片大小开始进程按输入顺序插入到队列中就绪队列空结束就绪队列首进程运行运行进程占用 cup 时间到达 所需时间进程完成把运行进程插入到队尾NYNfinish = run; if(run != tail) tail-next = ready; else ready = NULL; run-state = F; run = NULL; if(ready != NULL) firstin(); else if(rea

9、dy != NULL) run-state = W; tail = run; run = ready; /就绪队列的头指针赋值给运行 run - state = R; /进程状态变为等待状态 ready = ready - next; /就绪队列头指针移到下一个进程 prt(r);三短作三短作业优业优先先调调度算法度算法1,用户可以自行输入进程的数量,每一个进程由进程控制块( PCB)表示,各种队列均采 用链表数据结构。 2,按照进程服务时间由少到多顺序排成一个队列。再按顺序依次执行。主要代码主要代码:void short_timefirst(char algo) PC q;int t;prt

10、3(); for(int j = 0; j#include#include#includeusing namespace std;typedef struct nodechar name10;int prio;int round;int needtime;int cputime;int count;int state;struct node *next;bool operator o.state;PCB;priority_queue pq,pqempty,pp,qq;PCB *finish,*ready,*tail,*run;int N , Num;typedef struct nodchar

11、 name10;int needtime;int cputime;int waittime;int state;struct node *next;PC;PC p10;PC p110;int Tim=0;void firstin() run=ready;run-state=R;ready=ready-next;void prt1(char a)if(a=P)printf(“* 进程号 cpu 时间 所需要时间 优先数 状态 *n“);else printf(“* 进程号 cpu 时间 所需时间 记数 时间片 状态 *n“); void prt2(char a,PCB q)if(a=P) pri

12、ntf(“* %-10s %-10d %-10d %-10d %-10d *n“,q.name,q.cputime,q.needtime+Tim,q.prio,q.state);else printf(“* %-10s %-10d %-10d %-10d %-10d %-10c *n“,q.name,q.cputime,q.needtime+Tim,q.count,q.round,q.state);void prt22(char a,PCB *q)printf(“* %-10s %-10d %-10d %-10d %-10d %-10c*n“,q-name,q-cputime,q-needti

13、me,q-count,q-round,q-state);void prt(char algo)PCB *q;prt1(algo);if(run!=NULL) prt22(algo,run); q=ready; while(q!=NULLif(q-next = run) break;else q = q-next;q=finish;while(q!=NULL)prt22(algo,q);q=q-next;getchar();void priority(char algo)PCB q;prt1(algo);for(int i = 0; i0)q.needtime-;if(q.needtime =

14、0)q.state = 3;if(q.state!=3)q.prio-=3;pp.push(q);while(!pq.empty()q = pq.top();pq.pop(); if(q.needtime = 0)q.state = 3;prt2(algo , q);prt1(algo);pp.push(q);pq = pp;pp = pqempty; printf(“*n“); printf(“ 输出结束n“);getchar();void create1(char algo)PCB p;int i,time;char na10;ready=NULL;finish=NULL;run=NULL;printf(“ 输入进程号和运行时间:n“);printf(“);for(i=1;inext =q;tail=tail-next;void create2(char algo)PCB *p;int i,time;char na10;ready=NULL;finish=NULL;run=NULL;printf(“ 输入进程号和运行时间:nn“);printf(“);for(i=1;iname,na);p-cputime=0; p-needtime=time; p-state=W; p-round =0;p-count =0;if(ready!=NULL)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 初中教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号