# process_scheduling **Repository Path**: calm_yucc/process_scheduling ## Basic Information - **Project Name**: process_scheduling - **Description**: 用高级语言编写模拟进程调度程序:优先数调度算法程序和循环轮转调度算法程序 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2021-05-18 - **Last Updated**: 2021-05-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # process_scheduling ## 项目介绍 进程调度是处理机管理的核心内容。本实验要求用高级语言编写模拟进程调度程序,以便加深理解有关进程控制快、进程队列等概念,并体会和了解优先数算法和时间片轮转算法 的具体实施办法。用高级语言编写模拟进程调度程序:优先数调度算法程序和循环轮转调度算法程序 ## 软件架构 Visual Studio 2010 ## 使用说明 ### 1. 预备知识 **(1) 查阅相关资料;** 参考《计算机操作系统》(第三版)、《计算机操作系统》(第四版)两本教材复习掌握优先数调度算法程序、循环轮转调度算法程序的基本原理和实现。 优先数调度算法:把cpu分配给就绪队列中优先级最高的进程,直到该进程结束。 循环轮转调度算法:系统根据FCFS策略,将所有的就绪进程排成一个就绪队列将cpu分配给队首进程,当时间片耗尽,若当前进程完成,将当前进程插入完成队列;若未完成,将当前进程插入就绪队列队尾。 **(2) 初步编写程序;** 整个程序可由主程序和如下 7 个过程组成: (1)INSERT1——在优先数算法中,将尚未完成的 PCB 按优先数顺序插入到就绪队列中; (2)INSERT2——在轮转法中,将执行了一个时间片单位(为 2),但尚未完成的进程 的 PCB,插到就绪队列的队尾; (3)FIRSTIN——调度就绪队列的第一个进程投入运行; (4)PRINT——显示每执行一次后所有进程的状态及有关信息。 (5)CREATE——创建新进程,并将它的 PCB 插入就绪队列; (6)PRISCH——按优先数算法调度进程; (7)ROUNDSCH——按时间片轮转法调度进程。 **(3) 准备测试数据;** A 4 B 3 C 5 D 2 E 4 **(4) 修改程序代码。** ### 2. 上机调试 ### 3. 主要流程和源代码 **(1) 程序设计主要流程** 每个进程有三种状:执行状态(RUN)、就绪状态(READY,包括等待状态)和完成状态(FINISH),并假定初始状态为就绪状态。 进程控制块结构如下: NAME——进程标示符 PRIO/ROUND——进程优先数/进程每次轮转的时间片数(设为常数2) CPUTIME——进程累计占用CPU的时间片数 NEEDTIME——进程到完成还需要的时间片数 STATE——进程状态 NEXT——链指针 **(2) 进程的就绪态和等待态均为链表结构,共有四个指针如下** RUN——当前运行进程指针 READY——就需队列头指针 TAIL—— 就需队列尾指针 FINISH—— 完成队列头指针 **(3) 实现过程** 优先数调度算法:首先创建就绪队列,按照优先级的降序排列,队头进程优先级最高把cpu分配给就绪队列中优先级最高的进程,直到该进程结束。 循环轮转调度算法:系统根据FCFS策略,将所有的就绪进程排成一个就绪队列将cpu分配给队首进程,当时间片耗尽,若当前进程完成,将当前进程插入完成队列;若未完成,将当前进程插入就绪队列队尾。 **(4) 输出** 程序开始运行后,首先提示:请用户选择算法,输入进程名和相应的 NEEDTIME 值。 每次显示结果均为如下 5 个字段: name cputime needtime priority state 注: 1.在 state 字段中,"R"代表执行态,"W"代表就绪(等待)态,"F"代表完成态。 2.应先显示"R"态的,再显示"W"态的,再显示"F"态的。 3.在"W"态中,以优先数高低或轮转顺序排队;在"F"态中,以完成先后顺序排队。 **(5) 数据结构** ``` typedef struct node { char name[20]; //进程名 int prio; //进程优先级 int round; //轮转时间片数 int cputime; //进程已占用的CPU时间 int needtime; //进程执行还需要的时间 char state; //进程的状态,W——就绪态,R——执行态,F——完成态 struct node *next; //链队指针 int count; //记录执行的次数 }PCB; //定义进程块结构体 ``` **(6) 全局变量** ``` PCB *run=NULL; //当前运行进程指针 PCB *ready=NULL; //就绪队列头指针 PCB *tail=NULL; //就绪队列尾指针 PCB *finish=NULL; //完成队列头指针 int num; // 进程数 ``` **(7) 函数** ``` void GetFirst(); //取得第一个就绪队列节点执行 void InsertPrio(PCB *in); //创建优先级队列,规定优先数越小,优先级越低 void InsertReady(PCB *in); //将进程插入到就绪队列尾部 void InsertFinish(PCB *in); //将进程插入到完成队列尾部 void PrioCreate(); //优先级调度输入函数 void RoundCreate(); //时间片输入函数 void PrioOut(); //优先级输出队列 void RoundOut(); //轮转法输出队列 void Priority(); //按照优先级调度,每次执行一个时间片 void RoundRun(); //时间片轮转调度算法 int main(void); //主函数 ```