img
share 分享

VIP会员

作者:CSDN

出版社:CSDN《程序员》

ISBN:1111111111117

VIP会员免费 (仅需0.8元/天) ¥ 40000.0

温馨提示: 价值40000元的1000本电子书,VIP会员随意看哦!

电子书推荐

更多资源 展开

操作系统课程设计 评分:

题目四 单处理器系统的进程调度 一 、 课 程 设 计 目 的 1. 加深对进程概念的理解,明确进程和程序的区别。 2. 深入了解系统如何组织进程、创建进程。 3. 进一步认识如何实现处理器调度。 二 、 课 程 设 计 内 容 编写程序完成单处理器系统中的进程调度,要求实现时间片轮转、优先数、最短进程优 先和最短剩余时间优先四种调度算法。实验具体包括:首先确定进程控制块的内容,进程控 制块的组成方式;然后完成进程创建原语和进程调度原语;最后编写主函数对所作工作进行 测试。 模拟程序只对你所设置的“虚拟 PCB”进行相应的调度模拟操作,即每发生“调度” 时,显示出当前运行进程的“进程标识符” 、 “优先数” 、 “剩余运行时间”等,而不需要对系 统中真正的 PCB 等数据进行修改。 三 、 要 求 及 提 示 本题目必须单人完成。要求能够动态地随机生成新进程添加到就绪队列中。 主要考虑三个问题:如何组织进程、如何创建进程和如何实现处理器调度。 1、组织进程 考虑如何组织进程,首先要设定进程控制块的内容。进程控制块 PCB 记录各个进程执 行时的情况。不同的操作系统,进程控制块记录的信息内容不一样。操作系统功能越强,软 件也越庞大,进程控制块的内容也就越多。这里只使用必不可少的信息。一般操作系统中, 无论进程控制块中信息量多少,信息都可以大致分为以下四类: (1)标识信息每个进程都要有一个唯一的标识符,用来标识进程的存在和区别于其他进程。这个标识 符是必不可少的,可以用符号或编号实现,它必须是操作系统分配的。例如采用编号方式, 也就是为每个进程依次分配一个不相同的正整数。 (2)说明信息 用于记录进程的基本情况,例如进程的状态、等待原因、进程程序存放位置、进程数据 13 存放位置等等。实验中,因为进程没有数据和程序,仅使用模拟的进程控制块,所以这部分 内容仅包含进程状态。 进程状态可假设只有就绪、运行、终止三种。如果要设置“等待(阻塞) ”状态,需要 随机生成“阻塞时间” ,阻塞时间到时转为就绪态。 (3)现场信息 现场信息记录各个寄存器的内容。当进程由于某种原因让出处理器时,需要将现场信息 记录在进程控制块中,当进行进程调度时,从选中进程的进程控制块中读取现场信息进行现 场恢复。现场信息就是处理器的相关寄存器内容,包括通用寄存器、程序计数器和程序状态 字寄存器等。在本实验中,本部分可忽略。 (4)管理信息 管理信息记录进程管理和调度的信息。例如进程优先数、进程队列指针等。 另外,本实验为了模拟进程的不同运行时间,再添加一个“剩余运行时间”属性。 因此可将进程控制块结构定义如下: struct pcb { int name; //进程标识符 int status; //进程状态 int pri; //进程优先数 int time; //剩余运行时间,以时间片为单位,当减至 0 时该进程终止 int next; //下一个进程控制块的位置 } 确定进程控制块内容后,要考虑的就是如何将进程控制块组织在一起。多道程序设计系 统中,往往同时创建多个进程。在单处理器的情况下,每次只能有一个进程处于运行态,其 它的进程处于就绪状态或者等待状态。为了便于管理,通常把处于相同状态的进程的进程控 制块链接在一起组成就绪队列和等待队列。 由于实验模拟的是进程调度,没有对等待队列的操作,所以实验中只有一个指向正在运 行进程的进程控制块指针和一个就绪进程的进程控制块队列指针。操作系统实现中,系统往 往在主存中划分出一个连续的专门区域存放系统的进程控制块, 实验中应该用数组模拟这个 专门的进程控制块区域,定义如下: #define n 10 //假定系统允许进程个数为 n struct pcb pcbarea[n]; //模拟进程控制块区域的数组 14 这样,进程控制块的链表实际上是数据结构中使用的静态链表。实验中,进程控制块队 列采用单向不循环静态链表。为了管理空闲进程控制块,还应该将空闲控制块链接成一个队 列。 进程调度其实就是一个排队的过程, 不同的算法区别在于按照什么样的次序将就绪队列 里面的进程进行排序,比如时间片轮转调度算法,是将进程控制块按照进入就绪队列的先后 次序排队。 关于就绪队列的操作就是从队头摘下一个进程控制块和从队尾挂入一个进程控制 块。因此为就绪队列定义两个指针,一个头指针,指向就绪队列的第一个进程控制块;一个 尾指针,指向就绪队列的最后一个进程控制块。 实验中指向运行进程的进程控制块指针、 就绪队列指针和空闲进程控制块队列指针定义 如下: int run; //定义指向正在运行进程的进程控制块的指针 struct { int head; int tail; //定义指向就绪队列的头指针 head 和尾指针 tail }ready; int pfree; //定义指向空闲进程控制块队列的指针 2、创建进程 进程创建是一个原语,因此在实验中应该用一个函数实现,进程创建的过程应该包括: (1)申请进程控制块 进程控制块的数量是有限的,如果没有空闲进程控制块,则进程不能创建,如果申请成 功才可以执行第二步。 (2)填写进程控制块 将该进程信息写入进程控制块内。进程标识符应该随机生成并且是唯一,优先数和剩余 运行时间随机生成,刚刚创建的进程为就绪态,然后转去执行第三步。 (3)挂入就绪队列 如果原来就绪队列不为空,则将该进程挂入就绪队列尾部,并修改就绪队列尾部指针; 如果原来就绪队列为空,则将就绪队列的头指针、尾指针均指向该进程控制块,进程创建完 成。 多道程序设计的系统中,处于就绪状态的进程往往是多个,它们都要求占用处理器,可 是单处理器系统的处理器只有一个,进程调度就是解决这个处理器竞争问题的。进程调度的 15 任务就是按照某种算法从就绪进程队列中选择一个进程,让它占有处理器。因此进程调度程 序就应该包括两部分,一部分是在进程就绪队列中选择一个进程,并将其进程控制块从进程 就绪队列中摘下来,另一部分工作就是分配处理器给选中的进程,也就是将指向正在运行进 程的进程控制块指针指向该进程的进程控制块, 并将该进程的进程控制块信息写入处理器的 各个寄存器中。 提醒注意的是:在实际的系统中,当一个进程被选中运行时,必须恢复进程的现场,让 它占有处理器运行,直到出现等待事件或运行结束。在本实验里省去了这些工作。 以时间片轮转调度算法为例说明如何挂入就绪队列。 时间片轮转调度算法让就绪进程按 就绪的先后次序排成队列,每次总是选择就绪队列中的第一个进程占有处理器,但是规定只 能使用一个“时间片” 。时间片就是规定进程一次使用处理器的最长时间。实验中采用每个 进程都使用相同的不变时间片。每被调度 1 次,将其剩余运行时间-1。 进程运行一次后,若剩余运行时间不等于 0,则再将它加入就绪队列尾;若剩余运行时 间等于 0,则把它的状态修改成“终止” ,且退出队列。 若就绪进程队列不为空,则重复调度,直到所有进程都“终止” 。 3、调度 完成上述功能后,编写主函数进行测试:首先建立一个就绪队列,随机生成信息建立若 干个进程;然后进行进程调度;将正在运行进程指针指向的进程控制块的内容以及调度一次 后进程队列的现状输出,查看结果。题目要求模拟实现四种调度方法,要求和提示如下: (1) 时间片轮转调度 时间片轮转调度的要求和提示已经在上述过程中进行了说明,请参看。 (2) 优先数调度 要求动态改变优先数,假设大数代表高优先级,进程每运行一次优先数就减“1” ,即被 调度时执行:优先数-1,剩余运行时间-1,来模拟进程的一次运行。 进程运行一次后,若剩余运行时间不等于 0,则再将它加入队列(按优先数大小插入, 且置队首标志);若剩余运行时间等于 0,则把它的状态修改成“终止” ,且退出队列。 若就绪进程队列不为空,则重复调度,直到所有进程都“终止” 。 (3) 最短进程优先 按照进程执行时间的长短进行排队,优先调度短进程,因为该调度不抢占,因此调度到 的进程就可以运行完,其状态修改成“终止” ,且退出队列。

...展开详情
上传时间:2015-11 大小:465KB
热门图书