目录
1.实验目的
分析处理器实施进程调度的前提条件,理解并掌握各类处理器调度算法的设计原理和实现机制。
2.实验内容
分析和探索处理器实施进程调度的前提条件,理解并掌握处理器调度算法的设计原理和实现机制,随机发生和模拟进程创建及相关事件,编程实现基于特定处理器调度算法(三种以上,譬如先来先服务调度算法、短进程优先调度算法、高优先权优先调度算法、高响应比优先调度算法、时间片轮转调度算法、多级反馈队列调度算法、等等)的系统调度处理过程,并加以测试验证。
3.实验要求
本实验课题主要功能设计要求包括:
(1)选取和设计实现三种以上的处理器调度算法;
(2)针对特定的处理器调度算法,分析处理器实施进程调度的前提条件和要求(譬如进程创建时刻、运行时间长短、各【集中计算运行/输入输出操作】时间段长短、优先级),并随机发生和模拟处理对应的进程创建及相关事件;
(3)编程实现处理器调度机制,针对特定的处理器调度算法和随机事件序列,给出相应的调度处理过程,主要涵盖进程相关事件、处理器调度操作或处理措施以及各状态进程列表;
(4)测试验证处理器调度机制的有效性及有关处理器调度算法设计方案的正确性。
4.实验环境
开发环境 |
Visual Studio |
运行环境 |
windows |
测试环境 |
终端(笔记本) |
5.实验设计与实现
5.1实验设计
5.1.1 FSFS先来先服务算法设计
作业控制管理块设计
- JobName:一个字符数组,长度为50,用来存储作业名称。
- reachtime:一个整型变量,用来存储作业到达时间。
- CPUTime:一个整型变量,用来存储CPU使用时间。
- waitingTime:一个整型变量,用来存储等待时间。
- turnaroundTime:一个整型变量,用来存储周转时间。
-
FSFS算法设计:根据到达时间对作业排序
- JobName:一个字符数组,长度为50,用来存储作业名称。
- reachtime:一个整型变量,用来存储作业到达时间。
- CPUTime:一个整型变量,用来存储CPU使用时间。
- waitingTime:一个整型变量,用来存储等待时间。
- turnaroundTime:一个整型变量,用来存储周转时间。
5.1.2 SJF短进程优先算法设计
作业管理控制块设计
核心算法设计:根据每个作业使用CPU的时间排序
5.1.3 PS高优先权算法设计
作业管理控制块设计
- JobName:一个字符数组,长度为50,用来存储作业名称。
- reachtime:一个整型变量,用来存储作业到达时间。
- CPUTime:一个整型变量,用来存储CPU使用时间。
- waitingTime:一个整型变量,用来存储等待时间。
- turnaroundTime:一个整型变量,用来存储周转时间。
- prority:一个整型变量,用来存储作业的优先级。
核心算法设计
5.1.4 HRRN高响应比算法设计
作业管理控制块设计
核心算法设计
5.1.5 RR时间片轮转算法设计
- 作业管理控制块设计
- JobName:一个字符数组,长度为20,用来存储作业名称。
- arrivalTime:一个整型变量,用来存储作业的到达时间。
- serviceTime:一个整型变量,用来存储作业的服务时间,即CPU时间。
- remainingTime:一个整型变量,用来存储作业的剩余服务时间。
- completionTime:一个整型变量,用来存储作业的完成时间。
- turnaroundTime:一个整型变量,用来存储作业的周转时间。
- waitingTime:一个整型变量,用来存储作业的等待时间。
- isCompleted:一个布尔型变量,用来表示作业是否已经完成。
- 核心算法设计(其中时间片长度为4s)
5.2实验实现
5.2.1 FSFS先来先服务
(1)代码实现
1.自定义结构体
- //创建JCB
- typedef struct{
- char JobName[50]; //作业名称
- int reachtime; //作业到达时间
- int CPUTime; //CPU使用时间
- int waitingTime; //等待时间
- int turnaroundTime; //周转时间
- }JCBFCFS;
- 核心算法实现
- void FCFS() {
- int time = 0;
- for (int i = 0; i < Jobcount; i++) {
- if (jobqueue[i].reachtime > time) {
- time = jobqueue[i].reachtime;
- }
- jobqueue[i].waitingTime = time - jobqueue[i].reachtime;
- jobqueue[i].turnaroundTime = jobqueue[i].waitingTime + jobqueue[i].CPUTime;
- // 模拟作业执行
- printf("正在执行作业: %s,所需时间: %d,当前时间: %d\n",
- jobqueue[i].JobName, jobqueue[i].CPUTime, time);
- Sleep(jobqueue[i].CPUTime * 100); // 模拟 CPU 时间,单位为秒
- printf("作业 %s 执行完毕!\n", jobqueue[i].JobName);
- // 更新当前时间
- time += jobqueue[i].CPUTime;
- printf("当前时间为%d\n", time);
- Time = time;
- printf("------------------------------------------------------------------------\n");
- }
- }
5.2.2 SJF短进程优先
(1)代码实现
1.自定义结构体
- //创建JCB
- typedef struct {
- char JobName[50]; //作业名称
- int reachtime; //作业到达时间
- int CPUTime;