操作系统实验一 处理器调度/调度系统 |
您所在的位置:网站首页 › 操作系统进程调度程序流程图 › 操作系统实验一 处理器调度/调度系统 |
目录
一、实验内容二、实验目的三、实验题目四、实验报告(1)实验题目(2)程序中使用的数据结构及符号说明(3)流程图(4)打印一份源程序并附上注释1.算法说明2.完整代码
五、运行结果六、实验感悟
一、实验内容
选择一个调度算法,实现处理器调度。 二、实验目的在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪状态进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实验模拟在单处理器情况下处理器调度,帮助学生加深了解处理器调度的工作。 三、实验题目设计一个按优先数调度算法实现处理器调度的进程。 (1)假定系统有5个进程,每一个进程用一个进程控制块PCB来代表。进程控制块的格式为: 进程名指针要求运行时间优先数状态 其中, 进程名——作为进程的标识,假设五个进程的进程名分别是P1,P2,P3,P4,P5。 指针——按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块首地址,最后一个进程中的指针为“0”。 要求运行时间——假设进程需要运行的单位时间数。 优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。 状态——可假设有两种状态,“就绪”状态和“结束“状态,五个进程的初始状态都为“就绪”状态,用“R”表示,当一个进程运行结束后,它的状态变为“结束”,用“E”表示。 (2)在每次运行你所设计的处理器调度程序之前,为每个进程任意地确定它的“优先数”和“要求运行时间”。 (3)为了调度方便,把五个进程按给定的优先数从大到小连成队列,用一单元指出队首进程,用指针指出队列的连接情况。例: 见上文 (2)程序中使用的数据结构及符号说明系统有5个进程,用PCB结构体表示,如图2。这5个进程都存放在一个数组中。但PCB结构体自带next指针,所以PCB结构体也是自带了头指针的、用链表实现的队列结构。队列头指针为head。PCB的name表示进程名,reqtime表示要求运行时间,rank表示优先级,state表示状态。 需要说明的是,实验指导书并未规定进程的优先级是否能够为负数。 State字符有两种值,R表示正在运行,E表示已经结束,不需要加入就绪进程的队列。 class PCB{//进程块 public: PCB* next;//指针 string name;//进程名 int reqtime;//要求运行时间 int rank;//优先级 char state;//状态,R running E end }; PCB* head; PCB* runningprocess; PCB P[N];在对PCB指针进行“比较”时,需要比较其优先级大小,也需要比较剩余运行时间。 bool cmprank(PCB a, PCB b){//优先级从大到小比较函数 return a.rank > b.rank; } bool cmpreqtime(PCB a, PCB b){ return a.reqtime > b.reqtime; }利用cnt变量进行计数,记录当前有几个变量没有运行结束。 int cnt=0; (3)流程图在main函数中,开始时运行init()置进程数为0,队列head指针为空,正在运行进程为空。运行input()输入进程,输入进程名、优先级、时间,并置状态为“就绪”。将各进程按照优先级排序后,形成队列。打印程序运行时的初值。运行run()函数,对cpu的工作进行模拟。 初始化代码如下 void init() { head = NULL;//进程队列队首 runningprocess = NULL;//正在运行的进程 cnt = 0;//进程数 }Main函数中,初始化完成、输入完成后,就能模拟cpu进行处理、调度、工作了。 模拟cpu工作时,每次选优先数最大的一个进程,将其运行一个时间单位并降低优先级后再打印各进程状态。运行完成后对进程按优先数和时间排序,对优先级进行排序时直接调用c++ stl中的algorithm库的sort,并重新按优先级对进程队列进行连接。时间为0的自动退出队列。如此循环直到所有进程运行完成,如流程图所示。 void run(PCB* head, PCB* runningprocess){ if (cnt == 0) { cout //进程块 public: PCB* next;//指针 string name;//进程名 int reqtime;//要求运行时间 int rank;//优先级 char state;//状态,R running E end }; PCB* head; int cnt=0; PCB* runningprocess; PCB P[N]; bool cmprank(PCB a, PCB b){//优先级从大到小比较函数 return a.rank > b.rank; } void print(PCB* pcb) { cout if (cnt == 0) { cout head = NULL;//进程队列队首 runningprocess = NULL;//正在运行的进程 cnt = 0;//进程数 } void input() { for (int i = 0; i init(); input(); sort(P, P + cnt, cmprank);//按照进程优先级排序 for (int i = 1; i |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |