计算机操作系统实验:进程调度实验
目录
前言
二、实验目的
三、实验要求
四、实验原理
五、实验过程
六、代码详解
总结
前言
计算机操作系统是管理计算机硬件和软件资源的核心软件,它负责为用户提供一个友好、高效、安全的使用环境。进程调度是操作系统的一个重要功能,它决定了进程在处理器上的执行顺序和时间,从而影响了系统的性能和用户的体验。本实验旨在通过模拟不同的进程调度算法,比较它们的优缺点,加深对操作系统原理和设计的理解和掌握。
一、开发语言及实验平台
C++/JAVA
Turbo C / Microsoft Visual Studio 6.0 / Microsoft Visual Studio .NET 2010
在本文中使用的是c语言(?),使用的平台是devc++
二、实验目的
(1)加深对进程的概念及进程调度算法的理解;
(2)在了解和掌握进程调度算法的基础上,编制进程调度算法通用程序,将调试结果显示在计算机屏幕上,并检测机算和笔算的一致性。
三、实验要求
(1)了解进程调度;
(2)理解利用进程调度算法进行调度的原理;
(3)使用某种编程语言进行算法模拟。
四、实验原理
- 例题:设计一个有N个进程的进程调度算法。
进程调度算法:采用最高优先数的调度算法(即把处理机分配给优先数最高的进程)。
每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
进程的优先数及需要的运行时间可以事先人为的指定(也可以由随机数产生)。进程的到达时间为进程的输入的时间。进程的运行时间以时间片为单位进行计算。
每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。就绪进程获得CPU后都只能运行一个时间片。用已占用CPU时间加1表示。
如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤销该进程,如果运行一个时间片后,进程的已占用CPU时间还未达到所需要的运行时间,也就是进程还需要继续运行,此时应该将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。
每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。
重复以上过程,直到所要的进程都完成为止。
分析:
使用固定队列与静动态优先级结合,每个优先级为0~0xFF,并且以小的数字为高优先级,大的数字为低优先级,每次皆使用循环得到最高优先级的进程并执行,然后将其动态优先级设置为最低,并将其他进程动态优先级提高,以使得每个进程都有机会运行。进程的优先级与运行时间由随机数产生。
五、实验过程
代码如下:
#include #include #include /*常量和状态定义*/ #define PRO_NUM 0x05 #define MAX_TIME 0xFF /*状态宏*/ #define WAIT 0x01 #define RUN 0x02 #define FINISH 0x03 #define ID_ERROR 0x10 #define MIN_PRIOR 0xFF //255 #define MAX_PRIOR 0x00 0 typedef unsigned int Uint32; /*进程PCB*/ struct PCB_Info { Uint32 s_id; Uint32 s_static_prior; Uint32 s_dynamic_prior; Uint32 s_start_time; Uint32 s_need_time; Uint32 s_used_time; Uint32 s_state; }; /*进程队列*/ PCB_Info g_queue[5]; Uint32 g_time = 0; /*模拟进程执行函数*/ void Simulator(); /*初始化5个进程函数*/ void Init_Process(); /*初始化进程队列函数*/ void Init_Queue(); /*创建进程函数*/ Uint32 Create_Process(Uint32 pri,Uint32 needtime); /*系统运行函数*/ void Run_Process(); /*得到最高优先级进程 ID函数*/ Uint32 Get_PriProcess(); /*进程时间片执行函数*/ void Work_Process(Uint32 id); /*改变进程状态和优先级函数*/ void Change_Process(Uint32 id); /*打印进程状态函数*/ void Print_State(); /*结束系统函数*/ void End_Process(); /*入口函数*/ int main( int argc, char *argv[ ]) { Simulator(); return 0; } void Simulator() { Init_Process(); Run_Process(); End_Process(); } void Init_Process() { int i; Uint32 id; srand( (unsigned)time( NULL ) ); Init_Queue(); for(i=0;i
还没有评论,来说两句吧...