操作系统实验报告 下载本文

操作系统实验报告

集团企业公司编码:(LL3698-KKI1269-TM2483-LUI12689-ITT289-

实验二进程调度

1.目的和要求

通过这次实验,理解进程调度的过程,进一步掌握进程状态的转变、进程调度的策略,进一步体会多道程序并发执行的特点,并分析具体的调度算法的特点,掌握对系统性能的评价方法。 2.实验内容

阅读教材《计算机操作系统》第二章和第三章,掌握进程管理及调度相关概念和原理。

编写程序模拟实现进程的轮转法调度过程,模拟程序只对PCB进行相应的调度模拟操作,不需要实际程序。假设初始状态为:有n个进程处于就绪状态,有m个进程处于阻塞状态。采用轮转法进程调度算法进行调度(调度过程中,假设处于执行状态的进程不会阻塞),且每过t个时间片系统释放资源,唤醒处于阻塞队列队首的进程。

程序要求如下:

1)输出系统中进程的调度次序; 2)计算CPU利用率。 3.实验环境

Windows操作系统、VC++6.0 C语言 4设计思想:

(1)程序中进程可用PCB表示,其类型描述如下:

structPCB_type

{

intpid;//进程名

intstate;//进程状态 2——表示“执行”状态 1——表示“就绪”状态 0——表示“阻塞”状态

intcpu_time;//运行需要的CPU时间(需运行的时间片个数) }

用PCB来模拟进程;

(2)设置两个队列,将处于“就绪”状态的进程PCB挂在队列ready中;将处于“阻塞”状态的进程PCB挂在队列blocked中。队列类型描述如下: structQueueNode{ structPCB_typePCB; StructQueueNode*next;

}

并设全程量:

structQueueNode*ready_head=NULL,//ready队列队首指针

*ready_tail=NULL,//ready队列队尾指针

*blocked_head=NULL,//blocked队列队

首指针

*blocked_tail=NULL;//blocked队列队尾指针

(3)设计子程序: start_state();

读入假设的数据,设置系统初始状态,即初始化就绪队列和阻塞队列。

dispath();

模拟调度,当就绪队列的队首进程运行一个时间片后,放到就绪队列末尾,每次都是队首进程进行调度,一个进程运行结束就从就绪队列中删除,当到t个时间片后,唤醒阻塞队列队首进程。

calculate();

就绪进程运行一次,usecpu加1,当就绪队列为空时unusecpu加1,CPU利用率为use_cpu/(use_cpu+unuse_cpu)。 5源代码:

#include #include structPCB_type {

intpid;//进程名

intstate;//进程状态 //2--表示\执行\状态 //1--表示\就绪\状态 //0--表示\阻塞\状态

intcpu_time;//运行需要的CPU时间(需运行的时间片个数) };

structQueueNode{ structPCB_typePCB; structQueueNode*next; };

structQueueNode*ready_head=NULL,//ready队列队首指针 *ready_tail=NULL,//ready队列队尾指针 *block_head=NULL,//blocked队列队首指针 *block_tail=NULL;//blocked队列队尾指针 intuse_cpu,unuse_cpu;

voidstart_state()//读入假设的数据,设置系统初始状态 { intn,m;

inti;

structQueueNode*p,*q;

printf(\输入就绪节点个数n:\ scanf(\