操作系统课程设计——进程管理

上传人:ji****72 文档编号:37753813 上传时间:2018-04-21 格式:DOC 页数:28 大小:219KB
返回 下载 相关 举报
操作系统课程设计——进程管理_第1页
第1页 / 共28页
操作系统课程设计——进程管理_第2页
第2页 / 共28页
操作系统课程设计——进程管理_第3页
第3页 / 共28页
操作系统课程设计——进程管理_第4页
第4页 / 共28页
操作系统课程设计——进程管理_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《操作系统课程设计——进程管理》由会员分享,可在线阅读,更多相关《操作系统课程设计——进程管理(28页珍藏版)》请在金锄头文库上搜索。

1、 学年论文(课程设计)学年论文(课程设计)题目: 操作系统课程设计模拟操作系统操作系统课程设计模拟操作系统2012 年 06 月 05 日一:课程设计题目一:课程设计题目实现一个模拟操作系统。二:课程设计目的二:课程设计目的通过模拟操作系统的实现,加深对操作系统工作原理的理解,进一步了解操作系统的实现方法,并可练习合作完成系统的团队精神和提高程序设计能力。三:小组人数三:小组人数小组内有四个人共同完成实验。四:编程语言和系统环境四:编程语言和系统环境采用的是 C+语言,在 windows 系统环境下的 Microsoft Visual Studio 软件下设计的程序语言。五:课程设计内容五:课

2、程设计内容模拟采用多道程序设计方法的单用户操作系统,爱操作系统包括进程管理、存储管理、设备管理、文件管理和用户接口 4 部分。进程调度采用时间片轮转调度算法,存储管理采用可变分区存储管理方式,文件系统采用 FAT 方法。我所设计的部分为程序管理部分。七:课程设计具体内容七:课程设计具体内容1 1)进程调度:进程调度:1 1、任务分析:、任务分析:时间片轮转的主要思想就是按顺序为每一个进程一次只分配一个时间片的时间。算法要完成的功能就是将各个进程按照时间片轮转运行的动态过程显示出来。时间片轮转算法的主要实现过程是首先为每一个进程创建一个进程控制块,定义数据结构,说明进程控制块所包含的内容,有进程

3、名、进程所需运行时间、已运行时间和进程的状态以及指针的信息。实现的过程即运用指针指向某一个进程,判断当前的进程是否是就绪状态“r”,如果是,则为该进程分配一个时间片,同时,已运行时间加一且要求运行的时间减一,如此循环执行,当某一个进程的所需要运行的时间减少至 0 时,则将该进程的状态设置为“e”。然后,将指针指向下一个未运行完成的进程,重复判断,直至所有的进程都运行结束。进程调度算法采用的是时间片轮转法。时间片轮转法就是按一定时间片(记为 q)轮番运行各个进程。如果 q 是一个定值,则轮转法是一种对各进程机会均等的调度方法。轮转法本质上是剥夺的,因为一轮内,每个进程不能获得比一个时间片 q 更

4、长的运行时间。正是由于这一特点,轮转法特别适用于分时操作系统。轮转法的关键问题是如何确定 q 的大小。如果时间片太大以致每个进程的 CPU 周期都能在一个时间片内完成,则轮转法实际上脱化为 FCFS。如果 q 太小以致 CPU 切换过于频繁,则会增加 CPU 的额外开销,降低了 CPU 的有效利用率。这是因为,每次CPU 切换涉及到保存原运行进程的现场和恢复新运行进程的现场,这些操作一般需要10ms100ms 的时间。例如,设有一个 CPU 周期为 10 单位的进程,在 q 取 12,6,1时的调度次数分别为 0,1,9。令时间单位为 1ms(1ms=1000ms),1 次调度的开销为100m

5、s,则在 q=1 时 CPU 的额外开销和有效开销之比为 1:10,这是不容忽视的。每个进程的状态可以是就绪(Wait)、运行(Run)或完成(Finish)三种状态之一。就绪进程获得 CPU 后都只能运行一个时间片,用已占用 CPU 时间加 1 来表示。如果运行一个时间片后,进程的已占用 CPU 时间已达到所需的运行时间,则撤销该进程;如果运行一个时间片后进程的已占用 CPU 时间还未达到所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减 1(即降低一级),然后把它插入就绪队列等待 CPU。每进行一次调度程序都打印一次运行进程、就绪队列以及各个进程的 PCB,以便进行检查。重

6、复以上过程,直到所有进程都完成为止。2 2、概要设计:、概要设计:(1)所用数据结构及符号说明typedef struct PCBchar name10; /进程名struct PCB *next; /循环链指针int need_time; /要求运行时间int worked_time; /已运行时间,初始为 0char condition; /进程状态,只有“就绪”和“结束”两种状态int flag; /进程结束标志,用于输出PCB;PCB *front,*rear; /循环链队列的头指针和尾指针 int N; /N 为进程数(2)主程序的流程图:进程是否r开始输入进程数 N输入各进程信息为

7、每个进程创建 PCB 并初始化形成一个循环链队列指针指向循环链队列第一个进程运行时间+1 且剩余时间-1剩余时间=0?将进程状态置为e(完成)所有进程是否完成指针指向队列中下个进程结束(3)程序说明:处理器调度总是选择指针指示的进程运行。由于本实验是模拟处理器调度的功能,所以,对被选中的进程并不实际的启动运行,而是执行:已运行时间+1 来模拟进程的一次运行,表示进程已经运行过一个单位的时间。3 3、详细设计、详细设计(1)首先每一个进程用一个进程控制块 PCB 来代表。进程控制块的格式为:进程名指针要求运行时间已运行时间状态其中,进程名作为进程的标识,如 Q1、Q2 等。指针进程按顺序排成循环

8、链队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程的指针指出第一个进程的进程控制块首地址。要求运行时间假设进程需要运行的单位时间数。已运行时间假设进程已经运行的单位时间数,初始值为“0”。状态有两种状态,“就绪”和“结束”,初始状态都为“就绪”,用“R”表示。当一个进程运行结束后,它的状态为“结束”,用“E”表示。(2)每次运行所设计的处理器调度程序前,为每个进程任意确定它的“要求运行时间”。把五个进程按顺序排成循环链队列,用指针指出队列连接情况。用指针表示轮到运行的进程,如下图描述所示: K1Q1K2Q2K3Q3K4Q4K5Q5K2K3K4K5K12 4 3 1 20 0 0 0

9、 0R R R R RPCB1PCB2PCB3PCB4PCB5(3)程序详细设计步骤:a.首先建立 PCB 的数据结构,为了便于正确输出,加上了进程结束标志 flag。输入进程信息(包括进程名和要求运行的时间),并为每个进程创建一个 PCB 并初始化形成一个循环链队列,用函数 creatPCB()来实现。b.建立函数 judge()用来判断进程全部运行结束标志,即当所有进程的状态变为e(即完成状态)后,循环结束,表示所有进程都已运行成功。c.建立时间片轮转算法 creatProcess()对进程进行轮转运行,首先指针 s 指向第一个进程 PCB,即 s=front,判断该进程的状态是否为r(就

10、绪状态),即if(s-condition = r),若是则表示此进程尚未执行结束,则执行 s-worked_time+且 s-need_time-,if(s-need_time=0),则表示此进程已运行结束,将其状态置为结束,即 s-condition=e,并根据状态位输出完成信息,且以后不会再运行此进程。将指针指向下个进程,s=s-next,并判断所有进程是否已全部运行结束,没有则重复上面算法。当所有进程的状态位都变成e表示所有进程运行完成,则循环结束。d.建立主函数 main(),输入进程数 N,调用初始化循环链队列函数 creatPCB()和时间片轮转算法 creatProcess(N)

11、,每次选中进程的进程名以及运行一次后进程队列的变化,实现处理器的调度。4 4、调试分析:、调试分析:a调试过程中遇到的问题及解决方案开始运行到 Q5 运行完成后显示错误,如下图所示:原因:经检查程序发现语句 if(s-condition=e )printf(“进程%s 已经运行完成!nn“,s-name);有错误,因为当某个进程运行完成后,其状态标志已修改为e,所以再次循环运行未完成的进程时,当运行到此句时仍会将前面已完成的进程重新输出一遍完成信息,导致输出错误。解决方案:为每个进程加上一个结束标志 flag,并赋初值为 0,当进程运行完成后,将 flag 改为 1,再将后面输出改为 if(s

12、-condition=e | s-flag=0 )printf(“进程%s 已经运行完成!nn“,s-name);s-flag=0;,这样在前面进程运行完成输出后,后面再循环时就不会重新输出一遍了。b改进设想:本实验较简单,但还不够完善,如未实现插入进程功能,即进程在运行过程中可以插入其他的进程再运行。还有未进行进程优先级判别,本实验默认进程的优先级按输入的先后顺序从大到小排列的,还有其他功能等,希望在以后的实验中逐步完善。5 5、测试结果:、测试结果:a首先输出五个进程的初始状态b开始从进程 Q1 开始按时间片轮转运行进程,Q4 先运行完成c.接着 Q1 运行完成d.接着 Q5 运行完成e.

13、再 Q3 运行完成f.最后 Q2 运行完成时间片轮转法调度进程代码:#include“stdio.h“#include“conio.h“#include“malloc.h“#include“string.h“#define NULL 0typedef struct PCBchar name10; /进程名struct PCB *next; /链指针int need_time; /要求运行时间int worked_time; /已运行时间char condition; /进程状态,只有“就绪“和“结束“两种状态int flag; /进程结束标志PCB;PCB *front,*rear; int

14、N; /N 为进程数void creatPCB() /为每个进程创建一个 PCB 并初始化形成一个循环链队列PCB *p,*l;l = (PCB *)malloc(sizeof(PCB);printf(“请输入各进程名和要求运行时间n“);scanf(“%s%d“,l-name,l-condition = r; /进程初始状态为就绪l-worked_time = 0;l-next=NULL;l-flag=0;front=l;for(int i = 1;i name,p-condition = r; p-worked_time = 0;p-flag=0;l-next = p;l=l-next;r

15、ear=l;rear-next=front;void output() /进程输出函数printf(“进程名 已运行时间 需要时间 状态n“);for(int j=1;jname, front-worked_time, front-need_time, front-condition);front=front-next;printf(“n“);int judge(PCB *p) /判断所有进程运行结束int flag = 1;for(int i=0;icondition != e)flag = 0;break;p=p-next;return flag;void creatProcess(int n) /时间片轮转算法PCB *s,*p;int i,j,flag1=0;s = (PCB *)malloc(sizeof(PCB);s=front;printf(“n-n“);output();printf(“请按任意键继续nn“);getch(); /按任意键继续s=front;while(flag1 != 1)if(s-condition = r)s-worked_time+;s-need_time-;if(s-need_time=0)s-condition=e;ou

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

当前位置:首页 > 行业资料 > 其它行业文档

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