资源下载地址:https://download.csdn.net/download/sheziqiong/85751932
实验目的
实验内容:
6.实现一个能够实现分时进程调度和事件触发的进程调度系统,并对所实现的调度进行性能评测分析。
实验环境及实验步骤
实验环境:
- VMware Workstation 12 Pro
- Ubuntu 12.04.4 LTS 32 位
实验步骤
- 阅读教材
- 理解代码
- 实现要求
实验过程
(一)构造进程的关键技术,并解释核心流程
- 进程状态的保存(保存现场),包括哪些状态需要保存、何时进行保存、怎样保存。
- 进程状态的恢复(恢复现场)
- 进程表的引入
- 进程栈和内核栈
- 特权级的变换:ring0 和ring1之间的切换
(二)核心流程:
1、准备好进程体
- 初始化GDT中的TSS和LDT两个描述符,并初始化TSS
- 准备进程表(PCB)
填充PCB中的相关信息,如pid、ldt selector即段、eip esp寄存器等
- 完成跳转,实现ring0到ring1
将cpu交给p_proc_ready这个pcb指向的进程
关键数据结构:
- 先要将所有的寄存器保存到pcb
- 判断当前所处于的堆栈
若是当前处于用户堆栈则需要切换,若处于内核堆栈就不需要再进行切换
步骤:(以时钟中断调度为例)
-
进入中断后,先保存全部寄存器
-
判断当前所在堆栈,是否需要切换
-
屏蔽当前中断
-
置EOI位,开启中断,使cpu能接受其他中断。
-
进行中断处理,如进行进程调度、计算进程占用cpu时间等等
-
恢复接收当前中断
-
中断处理结束,恢复寄存器,iret
答:
- 扩展单进程到多进程
添加一个进程体
添加任务数组,方便我们对pcb进行初始化
添加新加入的进程
设置进程栈大小
扩展初始化进程表,使之能为所有进程填充pcb
- 扩展中断支持多进程
需要用一个宏定义来统一中断例程的入口,方便我们扩充。
答:
- 规定好系统调用的调用号及对应功能的功能号
系统调用号为0x90,功能号有两个,实现了两个功能
- 编写入口程序
- 初始化系统调用的中断门
- 编写int 90h中断例程
- 编写系统调用功能程序表
- 编写功能程序
-
添加函数声明
-
调用系统调用
在进入中断时,会对当前进程的堆栈进行存储;在退出中断时,会对当前进程的堆栈进行恢复。如下图所示。
在restart时进行堆栈的切换。
所以要实现进程的切换,只需要在中断中将p_proc_ready切换成目标进程即可。
以我实现的动态优先级时间片轮转调度算法为例,在中断中计时,并当时间片用完时,切换至下一个进程以实现进程调度。(下图红框所示,实现当前进程切换)
在中断退出时,restart函数中,恢复了p_proc_ready的堆栈,至此,实现了进程的调度。
6.实现一个能够实现分时进程调度和事件触发的进程调度系统,并对所实现的调度进行性能评测分析。
使用说明:
Schedule/中有四个子文件夹,分别实现了四种调度算法:
Final-dyna_prio: 动态优先级时间片轮转调度算法
Final-fcfs: 先来先服务算法
Final-nomal: 静态优先级时间片轮转调度算法
Final-sfj: 短进程优先调度算法
(由于不同调度算法是通过宏定义来进行选择的,为了方便后续检查,每种调度算法均编译了一次,故有四个文件夹)
接下来以final-dyna_prio为例,展示接下来的操作。
进入文件夹后,直接bochs即可启动
启动后System_Idle_Process开始运行,等待我们下一步操作。
以下为功能说明:
仅接收按键0-9,各按键功能如下
0:清空屏幕
1-5号进程为实现生产者消费者模型
1:启动生产者进程;若生产者进程已经启动,再按下1则挂起生产者进程
2:启动消费者1进程;若消费者1进程已经启动,再按下2则将它挂起
3:启动消费者2进程;若消费者2进程已经启动,再按下3则将它挂起
4:启动消费者3进程;若消费者3进程已经启动,再按下4则将它挂起
5:启动消费者4进程;若消费者4进程已经启动,再按下5则将它挂起
6-9号进程为进行调度算法性能统计分析,在不同模式下其优先级及所需要的运行时间可能不同。
6:占用固定运行进程1
7:占用固定运行进程2
8:占用固定运行进程3
9:占用固定运行进程4
启动bochs后,按下12345678,启动8个进程
其中,Ready、HangOn、Finish代表各进程现在的状态:就绪、挂起或者结束。
在不同调度算法中,展示出的效果稍有不同,是由于各个调度算法的特性决定的
FCFS:(先来先服务不需要太多信息,故显示的较少)
SFJ:(多出来的一列为剩余运行时间)
Normal:
Dyna_Prio:
代码说明:
由于实现的功能较多,代码也很多,故只选取有代表性的几个地方进行截图说明。
- 生产者消费者的实现
来保护缓冲区。
- 固定运行时间测试进程的实现
使用这两个数组进行占用cpu时间的计数,仅当进程在运行时才会计数。
- 按键就绪挂起进程的实现
位于keyboard.c 键盘中断处理例程。
1-5号进程就绪/挂起直接将其加入/移除进程链表即可,6-9号进程因为会退出就绪时,需要重新填充pcb
- 退出进程的系统调用实现:
- FCFS调度:
-
SFJ
-
静态优先级时间片轮转调度