操作系统 进程调度.doc_第1页
操作系统 进程调度.doc_第2页
操作系统 进程调度.doc_第3页
操作系统 进程调度.doc_第4页
操作系统 进程调度.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计一:进程调度12.1.1设计目的(1) 要求学生设计一个模拟进程调度的算法。(2) 理解进程控制块的结构。(3) 理解进程运行的并发性。(4) 掌握进程调度的三种基本算法。12.1.2设计要求在多道程序运行环境下,进程数目一般多于处理机数目,使得进程要通过竞争来使用处理机。这就要求系统能按某种算法,动态地把处理机分配给就绪队列中的一个进程,使之运行,分配处理机的任务是由进程调度程序完成的。一个进程被创建后,系统为了便于对进程进行管理,将系统中的所有进程按其状态,将其组织成不同的进程队列。于是系统中有运行进程队列、就绪队列和各种事件的进程等待队列。进程调度的功能就是从就绪队列中挑选一个进程到处理机上运行。进程调度的算法有多种,常用的有优先级调度算法、先来先服务算法、时间片轮转算法。进程是程序在处理机上的执行过程。进程存在的标识是进程控制块(PCB),进程控制块结构如下:typedef struct node char name10; /*进程标识符*/int prio; /*进程优先数*/int round; /*进程时间轮转时间片*/int cputime; /*进程占用CPU时间*/int needtime; /*里程到完成还需要的时间*/int count; /*计数器*/char state; /*进程的状态*/struct node *next; /*链指针*/ PCB;系统创建一个进程,就是由系统为某个程序设置一个PCB,用于对该进程进行控制和管理。进程任务完成,由系统收回其PCB,该进程便消亡。每个进程可以有三个状态:运行状态、就绪状态和完成状态。用VC编写一个程序实现进程调度的算法,模拟进程调度的过程,加深对进程控制块概念和进程调度算法的理解。1. 进程的调度采用优先数调度算法。2. 采用动态优先数法确定进程的优先级别。3. 设计三个链队列,分别用来表示运行队列、就绪队列和完成队列。4. 用户输入进程标识符以及进程所需的时间,申请空间存放进程PCB信息。优先数调度算法为每个进程设一个优先数,它总是把处理机给就绪队列中具有最高优先权的进程。常用的算法有静态优先数法和动态优先数法。动态优先数法,使进程的优先权随时间而改变。初始的进程优先数取决于进程运行所需要的时间,时间大,则优先数低。采取了将进程优先数定为用一个较大的数(50)减去进程运行所需要的时间。随着进程的运行对优先数进行调整,每次运行时都是从就绪队列中选取优先数最大的进程运行,所以将就绪队列按照优先数的大小从高到低排序,这样,每次取队头进程即可。进程每执行一次,优先数减一个数(自定),CPU时间数加1,进程还需要的时间数减1。如果进程所需要的时间为0,说明进程运行完毕,将其状态变为完成状态“F”,将此PCB插入到完成队列中,若就绪队列不空,就将绪队列中的第一个PCB变为运行状态。进程若没有完成,则将其优先数和就绪队列中第一个PCB的优先数作比较,如果小,则将其变为就绪态,插入到就绪队列中适当的位置,将就绪队列中的第一个PCB变为运行态投入运行,重复上述过程,直到就绪队列为空,所有进程成为完成态为止。12.1.3环境操作系统windows xp,开发工具vc+ 6.0 或者bcb 6.0。12.1.4步骤1. 打开VC,选择菜单项File-New,选择Project选项卡并建立一个名为processes的win32 console application工程。2. 在工程中创建原文件processes.cpp:选择菜单项Project-Add to Project-File,此时将打开一个新窗口,在其中输入想要创建的文件名字,这里是processes.cpp,在其中编辑好原文件并保存。3. 通过调用菜单项Build-Rebuild all进行编译连接,可以在指定的工程目录下得到debug-processes.exe程序,可以在控制台进入该debug目录运行程序了。12.1.5运行结果分析C: processes输入进程数:2输入进程号和运行时间:P1 3P2 2 优先数算法输出信息:* 进程号 cpu时间 所需时间 优先数 状态 P2 0 2 48 w P1 0 3 47 w 进程号 cpu时间 所需时间 优先数 状态 P1 0 3 47 R P2 1 1 45 W 进程号 cpu时间 所需时间 优先数 状态 P2 1 1 45 R P1 1 2 44 W 进程号 cpu时间 所需时间 优先数 状态 P1 1 2 44 R P2 2 0 42 F 进程号 cpu时间 所需时间 优先数 状态 P1 2 1 41 R P2 2 0 42 F 进程号 cpu时间 所需时间 优先数 状态 P1 3 0 38 F P2 2 0 42 F分析如下:创建2个进程其进程号和运行时间分别为P1 3和P2 2。进程P2运行的时间是2(优先数为50-2=48),进程P1运行的时间是3(优先数为50-2=47),所以P2优先数高,因此在就绪队列中排在P1的前面,先运行。 进程号 cpu时间 所需时间 优先数 状态 P2 0 2 48 w P1 0 3 47 wP2运行了一次,占用CPU时间1,完成还需时间1。在程序中设定进程每运行一次优先数减3,所以P2的优先数为48-3=45。 进程号 cpu时间 所需时间 优先数 状态 P1 0 3 47 R P2 1 1 45 WP1运行了一次,占用CPU时间1,完成还需时间2。在程序中设定进程每运行一次优先数减3,所以P1的优先数为47-3=44。 进程号 cpu时间 所需时间 优先数 状态 P2 1 1 45 R P1 1 2 44 WP2运行了二次,占用CPU时间2,完成还需时间0,P2进入完成队列。在程序中设定进程每运行一次优先数减3,所以P2的优先数为45-3=42。 进程号 cpu时间 所需时间 优先数 状态 P1 1 2 44 R P2 2 0 42 FP1运行了二次,占用CPU时间2,完成还需时间1。在程序中设定进程每运行一次优先数减3,所以P1的优先数为44-3=41。 进程号 cpu时间 所需时间 优先数 状态 P1 2 1 41 R P2 2 0 42 FP1运行了三次,占用CPU时间3,完成还需时间0,P1进入完成队列。在程序中设定进程每运行一次优先数减3,所以P1的优先数为41-3=38。 进程号 cpu时间 所需时间 优先数 状态 P1 3 0 38 F P2 2 0 42 F12.1.6参考原代码:#include stdio.h#include stdlib.h#include string.htypedef struct node char name10; /*进程标识符*/ int prio; /*进程优先数*/ int round; /*进程时间轮转时间片*/ int cputime; /*进程占用CPU时间*/ int needtime; /*进程到完成还要的时间*/ int count; /*计数器*/ char state; /*进程的状态*/ struct node *next; /*链指针*/PCB;PCB *finish,*ready,*tail,*run; /*队列指针*/int N; /*进程数*/*将就绪队列中的第一个进程投入运行*/firstin() run=ready; /*就绪队列头指针赋值给运行头指针*/ run-state=R; /*进程状态变为运行态*/ ready=ready-next; /*就绪对列头指针后移到下一进程*/*标题输出函数*/void prt1(char a) if(toupper(a)=P) /*优先数法*/ printf( 进程号 cpu时间 所需时间 优先数 状态n); else printf( 进程号 cpu时间 所需时间 记数 时间片 状态n);/*进程PCB输出*/void prt2(char a,PCB *q) if(toupper(a)=P) /*优先数法的输出*/ printf( %-10s%-10d%-10d%-10d %cn,q-name, q-cputime,q-needtime,q-prio,q-state); else/*轮转法的输出*/ printf( %-10s%-10d%-10d%-10d%-10d %-cn,q-name, q-cputime,q-needtime,q-count,q-round,q-state);/*输出函数*/void prt(char algo) PCB *p; prt1(algo); /*输出标题*/ if(run!=NULL) /*如果运行指针不空*/ prt2(algo,run); /*输出当前正在运行的PCB*/ p=ready; /*输出就绪队列PCB*/ while(p!=NULL) prt2(algo,p); p=p-next; p=finish; /*输出完成队列的PCB*/ while(p!=NULL) prt2(algo,p); p=p-next; getchar(); /*压任意键继续*/*优先数的插入算法*/insert1(PCB *q) PCB *p1,*s,*r; int b; s=q; /*待插入的PCB指针*/ p1=ready; /*就绪队列头指针*/ r=p1; /*r做p1的前驱指针*/ b=1; while(p1!=NULL)&b) /*根据优先数确定插入位置*/ if(p1-prio=s-prio) r=p1; p1=p1-next; else b=0; if(r!=p1) /*如果条件成立说明插入在r与p1之间*/ r-next=s; s-next=p1; else s-next=p1; /*否则插入在就绪队列的头*/ ready=s; /*优先数创建初始PCB信息*/void create1(char alg) PCB *p; int i,time; char na10; ready=NULL; /*就绪队列头指针*/ finish=NULL; /*完成队列头指针*/ run=NULL; /*运行队列指针*/ printf(输入进程号和运行时间:n); /*输入进程标识和所需时间创建PCB*/ for(i=1;iname,na); p-cputime=0; p-needtime=time; p-state=w; p-prio=50-time; if(ready!=NULL) /*就绪队列不空调用插入函数插入*/ insert1(p); else p-next=ready; /*创建就绪队列的第一个PCB*/ ready=p; /clrscr(); printf( 优先数算法输出信息:n); printf(*n); prt(alg); /*输出进程PCB信息*/ run=ready; /*将就绪队列的第一个进程投入运行*/ ready=ready-next; run-state=R;/*优先数调度算法*/priority(char alg) while(run!=NULL) /*当运行队列不空时,有进程正在运行*/ run-cputime=run-cputime+1; run-needtime=run-needtime-1; run-prio=run-prio-3; /*每运行一次优先数降低3个单位*/ if(run-needtime=0) /*如所需时间为0将其插入完成队列*/ run-next=finish; finish=run; run-state=F; /*置状态为完成态*/ run=NULL; /*运行队列头指针为空*/ if(ready!=NULL) /*如就绪队列不空*/ firstin(); /*将就绪对列的第一个进程投入运行*/ else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/ if(ready!=NULL)&(run-prioprio) run-state=W; insert1(run); firstin(); /*将就绪队列的第一个进程投入运行*/ prt(alg); /*输出进程PCB信息*/ /*主函数*/main() char algo; /*算法标记*/ /clrscr(); printf(选择算法:P/R(优先数算法/时间片轮转算法)n); scanf(%c,&algo); /*输入字符确定算法*/ printf(输入进程数:n); scanf(%d,&N); /*输入进程数*/ if(algo=P|algo=p) create1(algo); /*优先数法*/ priority(algo); else if(algo=R|algo=r) create2(algo); /*轮转法*/ roundrun(algo); 12.1.7选做内容时间片轮转算法完成进程的调度。设计要求:1) 进程的调度采用时间片轮转算法。2) 设计三个链队列,分别用来表示运行队列、就绪队列和完成队列。3) 用户输入进程标识符以及进程所需的时间,申请空间存放进程PCB信息。4) 输出的格式和上面的运行结果分析中的格式相同。时间片轮转调度:具体做法是调度程序每次把CPU分配给就绪队列首进程使用一个时间片。当这个时间片结束时,就强迫一个进程让出处理器,让它排列到就绪队列的尾部,等候下一轮调度。实现这种调度要使用一个间隔时钟。当一个进程开始运行时,就

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论