实验二 进程调度 1 .目的和要求 通过这次实验,理解进程调度的过程,进一步掌握进程状态的转变、进程调度的策略,进一步体会多道程序并发执行的特点,并分析具体的调度算法的特点,掌握对系统性能的评价方法。 2 .实验内容 阅读教材《计算机操作系统》第二章和第三章,掌握进程管理及调度相关概念和原理。 编写程序模拟实现进程的轮转法调度过程,模拟程序只对PCB 进行相应的调度模拟操作,不需要实际程序。假设初始状态为:有 n 个进程处于就绪状态,有 m 个进程处于阻塞状态。采用轮转法进程调度算法进行调度(调度过程中,假设处于执行状态的进程不会阻塞),且每过t 个时间片系统释放资源,唤醒处于阻塞队列队首的进程。 程序要求如下: 1)输出系统中进程的调度次序; 2)计算 CPU 利用率。 3 .实验环境 Windows 操作系统、VC++6.0 C 语言 4 设计思想: (1) 程序中进程可用 PCB 表示,其类型描述如下: struct PCB_type { int pid ; //进程名 int state ; //进程状态 2——表示“执行”状态 1——表示“就绪”状态 0——表示“阻塞”状态 int cpu_time ; //运行需要的 CPU 时间(需运行的时间片个数) } 用 PCB 来模拟进程; (2)设置两个队列,将处于“就绪”状态的进程PCB 挂在队列 ready 中;将处于“阻塞”状态的进程PCB 挂在队列 blocked 中。 队列类型描述如下: struct QueueNode{ struct PCB_type PCB; Struct QueueNode *next; } 并设全程量: struct QueueNode *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 struct PCB_type { int pid ; //进程名 int state ; //进程状态 //2--表示"执行"状态 //...