引言

最近学习了操作系统内诸多进程调度算法,动手实现了抢占式优先级调度算法

知识点

该算法又称为优先权调度算法,他既可以用于作业调度,又可用于进程调度。该算法中的优先级用于描述作业运行的紧迫程度。

两种类型:

  1. 非剥夺式(非抢占式)优先级调度算法。当一个进程正在处理上运行时,即使有某个更为重要或紧迫的进程进入就绪队列,仍然让正在进行的进程继续运行,直到由于其自身原因而主动让出处理机(任务完成或等待事件),才把处理机分配给更为重要或紧迫的进程。
  2. 剥夺式(抢占式)优先级调度算法。当一个进程正在处理机上运行时,若有某个更为重要或紧迫的进程进入就绪队列,则立即暂停正在运行的进程,将处理机分配给更重要或紧迫的进程。

两种优先级:

  1. 静态优先级。优先级是在创建进程时确定的,且在进程的整个运行期间保持不变。确定静态优先级的主要依据有进程类型、进程对资源的要求、用户要求。
  2. 动态优先级。在进程运行过程中,根据进程情况的变化动态调整优先级。动态调整优先级的主要依据有进程占有 CPU 时间的长短、就绪进程等待 CPU 时间的长短。

一般来说,进程优先级的设置有下面几点原则:

  1. 系统进程 > 用户进程。系统进程作为系统的管理者,理应拥有更高的优先权。
  2. 交互型进程 > 非交互型进程。与用户进行交互的进程需要被优先处理,即要有更高的优先级。
  3. I/O型进程 > 计算型进程。频繁使用 I/O 设备的进程称为 I/O 型进程,I/O 设备的处理速度要比 CPU慢很多,所以将 I/O 型进程的优先级设置得更高,就有可能让 I/O 设备尽早开始工作,进而提升系统的整体效率。

代码实现(C++)

本程序使用两个栈,分别储存运行进程和进程优先级。
使用栈是为了解决一个进程被另一个进程抢占后的恢复问题,之所以 不用一个栈来存储,是为了避免配有相同优先级但不同进程相遇的情况。

#include<iostream>
#include<string>
#include<windows.h>
#include<stack>       //  用来存储优先权
#include<list>        //  使用list存储PCB,考虑到无法模拟事件的顺序发生,故不使用队列 #define MAXNUM 1000 using namespace std;typedef struct pcb {int pID;            //  进程编号int level;          //  进程优先权float needTime;        //  需要运行时间   float reachTime;   //  到达时间float leftTime;     //  剩余运行时间
}PCB;void createProcess(int n, list<PCB> &plist) {        //  创建一个进程队列cout<<"请输入相应进程的进程编号、优先权、到达时间、运行时间(类似:1 1 0 4)"<<endl;for(int i=0;i<n;i++) {PCB p;cout<<"请输入第"<<i+1<<"个进程的信息:"; cin>>p.pID>>p.level>>p.reachTime>>p.needTime;plist.push_front(p);}
}   int getWholeTime(list<PCB> &plist) {  //  获取所有任务的总时间 list<PCB>::iterator i;int sumTime = 0;for(i=plist.begin();i!=plist.end();i++) {sumTime += i->needTime;}return sumTime;
}void runProcess(int n, list<PCB> &plist) {       //  运行进程 int Clocker = 0;  //  定义一个计时器 stack<int> id_stack;  //  定义一个存放进程ID的栈 stack<int> level_stack;  //  定义一个存放优先权的栈 level_stack.push(0);id_stack.push(0);int sumTime = getWholeTime(plist);    //  获取总共运行时间 cout<<endl;while(Clocker<sumTime) {cout<<"时间片轮转一个单位..."<<endl;//    遍历找出当前时刻优先权最高的进程 list<PCB>::iterator i;for(i = plist.begin();i != plist.end();i++) {if(i->reachTime<=Clocker && i->level>=level_stack.top() && i->needTime>0) {if(i->pID != id_stack.top()) {id_stack.push(i->pID);level_stack.push(i->level);  }i->needTime--;  //  剩余运行时间减少1个单位 if(i->needTime == 0) {    //  若运行结束,对应优先权出栈 level_stack.pop();id_stack.pop();}cout<<"本次执行了进程: "<<i->pID<<endl;cout<<endl;break;} }Sleep(1500);Clocker++;    }
}/*测试用例:pID   level   reachTime   needTime1      2         0          32     4         2          13     1         4          34     3         6          2
*/  int main() {cout<<"请输入进程数量:";int n;cin>>n;if(n>MAXNUM) {        //过热保护 cout<<"CPU 即将爆炸,倒计时..."<<endl;Sleep(1000);cout<<"3..."<<endl;Sleep(1000);cout<<"2..."<<endl;Sleep(1000);cout<<"1..."<<endl;Sleep(1000);cout<<"喵~"<<endl; return 0;}list<PCB> plist;createProcess(n,plist);runProcess(n,plist);cout<<"结束!"<<endl; return 0;
}

操作系统进程调度---优先级调度算法(抢占模式)相关推荐

  1. 【JAVA操作系统——进程调度】非抢占式短作业优先算法

    测试要求 进程信息如下: 进程 到达时间 服务时间 A 0 3 B 1 6 C 2 4 D 3 9 E 4 1 请输出进程的调度过程,以及系统平均带权周转时间. 代码实现 package com.zj ...

  2. FCFS、SJF、HRRN调度算法以及时间片轮转、优先级调度算法、多级反馈队列算法总结

    先来先服务(FCFS) 算法思想 主要从"公平"角度考虑 算法规则 按照作业/进程到达的先后顺序进行服务 用于作业/进程调度? 用于作业调度时,考虑哪个作业先到达后备队列: 用于进 ...

  3. 优先级调度算法实现_《操作系统原理》实验一:进程调度

    操作系统原理实验-进程调度实验报告 一.目的与要求 (1)进程是操作系统最重要的概念之一,进程调度是操作系统内核的重要功能,本实验选用XX语言编写了一个进程调度模拟程序,使用优先级或时间的轮转法实现进 ...

  4. C#进程调度的模拟实现:模拟先来先服务调度算法、短作业优先调度算法和优先级调度算法(考虑非抢占式和抢占式),进行算法评价,输出调度结果和算法评价指标。

    没什么水平,希望能帮到你 环境:visual studio 2019 附带工程资源:C#进程调度的模拟实现附带资源-C#文档类资源-CSDN下载 先来先服务的调度算法:是一种非抢占式的算法,先来先服务 ...

  5. 2.2.5 操作系统之调度算法(时间片轮转调度算法、优先级调度算法、多级反馈队列调度算法)

    文章目录 0.思维导图 1.时间片轮转---RR 2.优先级调度算法 3.多级反馈队列调度算法 4.三种算法的对比总结 0.思维导图 1.时间片轮转-RR Round-Robin 时间片为2举例 以时 ...

  6. 进程调度 优先级c语言,按优先级调度算法实现进程调度的程序

    一.实验目的 在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态.当就绪进程个数大于处理机数时,就必须依照某种策略来决定哪些进程优先占用处理机.本实验模拟在单处理机情况下的进程调度,帮助学生 ...

  7. 非抢占模式下故障后优先级降低却不切换问题--使用Keepalived实现非抢占模式主备切换

    使用Keepalived实现非抢占模式主备切换–解释非抢占模式下故障后优先级降低却不切换问题 背景 最近在用keepalived时发现,配置为非抢占模式后,主节点的服务检测脚本返回非0后,不发生切换, ...

  8. 时间片轮转(RR)、优先级调度算法以及多级反馈队列调度算法

    一.调度算法 (一)时间片轮转(RR, Round-Robin) 例题:各进程到达就绪队列的时间.需要的运行时间如下表所示.使用时间片轮转调度算法,分析时间片大小分别是2.5时的进程运行情况. 常用于 ...

  9. 【操作系统之进程调度算法习题】

    操作系统之进程调度算法习题 1.第一题 解答: 2. 第二题 解答: 3. 第三题 解答: 1.第一题 在一个具有三道作业的批处理系统中,作业调度采用先来先服务(FCFS) 调度算法,进程调度采用 短 ...

最新文章

  1. controller接收json数据_答疑 | 前后端分离,如何接收json数据?
  2. map,filter,reduce函数总结
  3. linux 系统网络服务器组建,配置和管理实训教程 pdf,Linux网络服务器配置管理项目实训教程2...
  4. java web项目里ehcache.xml的参数说明
  5. C++ 大话数据结构 09: 中缀表达式 转后缀表达式 计算器
  6. java10个基础错误_我们处理了10亿个Java记录的错误-这是导致97%的错误的原因
  7. 一日三项令人兴奋的Lucene功能
  8. 【51nod - 1076】2条不相交的路径(Tarjan无向图判环)
  9. python生成shell脚本_Python设置在shell脚本中自动补全功能的方法
  10. c语言程序设计实验指导实验报告,C语言程序设计实验指导及报告.doc
  11. 将 React 作为 UI 运行时
  12. [COGS2639]偏序++
  13. hal库串口dma卡死_HAL库版DMA循环模式串口数据收发
  14. 完全卸载Oracle10
  15. c语言对字符串逆序,【C语言】 字符串逆序
  16. 企业微信和钉钉的区别
  17. Unity3D中的对齐
  18. 厉害,被马赛克的图片竟然还可以恢复
  19. 学习四旋翼(三):DMP姿态解算和串级PID控制姿态
  20. [Python笔记_2]循环、字符串、列表、函数、异常处理

热门文章

  1. Nginx打开目录浏览功能(autoindex)并设置访问验证
  2. 【Java基础】循环、嵌套、跳转控制break/continue、调试器、函数
  3. mooc网站 常用的10个地址
  4. 金属牙科烧瓶的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  5. java匹配IP正则表达式
  6. 搞懂钩子方法和模板方法,看完这篇就够了
  7. 如何在github下载别人的代码到本地的unity
  8. P4363 [九省联考2018]一双木棋
  9. webservice mysql配置文件_在WebService中使用Microsoft.Practices.EnterpriseLibrary.Data配置数据库...
  10. 万元华为新旗舰P40 Pro+发布:后置5摄100倍变焦,AI拍照自动消除路人,饭圈可以告别单反了...