操作系统进程调度---优先级调度算法(抢占模式)
引言
最近学习了操作系统内诸多进程调度算法,动手实现了抢占式优先级调度算法
知识点
该算法又称为优先权调度算法,他既可以用于作业调度,又可用于进程调度。该算法中的优先级用于描述作业运行的紧迫程度。
两种类型:
- 非剥夺式(非抢占式)优先级调度算法。当一个进程正在处理上运行时,即使有某个更为重要或紧迫的进程进入就绪队列,仍然让正在进行的进程继续运行,直到由于其自身原因而主动让出处理机(任务完成或等待事件),才把处理机分配给更为重要或紧迫的进程。
- 剥夺式(抢占式)优先级调度算法。当一个进程正在处理机上运行时,若有某个更为重要或紧迫的进程进入就绪队列,则立即暂停正在运行的进程,将处理机分配给更重要或紧迫的进程。
两种优先级:
- 静态优先级。优先级是在创建进程时确定的,且在进程的整个运行期间保持不变。确定静态优先级的主要依据有进程类型、进程对资源的要求、用户要求。
- 动态优先级。在进程运行过程中,根据进程情况的变化动态调整优先级。动态调整优先级的主要依据有进程占有 CPU 时间的长短、就绪进程等待 CPU 时间的长短。
一般来说,进程优先级的设置有下面几点原则:
- 系统进程 > 用户进程。系统进程作为系统的管理者,理应拥有更高的优先权。
- 交互型进程 > 非交互型进程。与用户进行交互的进程需要被优先处理,即要有更高的优先级。
- 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;
}
操作系统进程调度---优先级调度算法(抢占模式)相关推荐
- 【JAVA操作系统——进程调度】非抢占式短作业优先算法
测试要求 进程信息如下: 进程 到达时间 服务时间 A 0 3 B 1 6 C 2 4 D 3 9 E 4 1 请输出进程的调度过程,以及系统平均带权周转时间. 代码实现 package com.zj ...
- FCFS、SJF、HRRN调度算法以及时间片轮转、优先级调度算法、多级反馈队列算法总结
先来先服务(FCFS) 算法思想 主要从"公平"角度考虑 算法规则 按照作业/进程到达的先后顺序进行服务 用于作业/进程调度? 用于作业调度时,考虑哪个作业先到达后备队列: 用于进 ...
- 优先级调度算法实现_《操作系统原理》实验一:进程调度
操作系统原理实验-进程调度实验报告 一.目的与要求 (1)进程是操作系统最重要的概念之一,进程调度是操作系统内核的重要功能,本实验选用XX语言编写了一个进程调度模拟程序,使用优先级或时间的轮转法实现进 ...
- C#进程调度的模拟实现:模拟先来先服务调度算法、短作业优先调度算法和优先级调度算法(考虑非抢占式和抢占式),进行算法评价,输出调度结果和算法评价指标。
没什么水平,希望能帮到你 环境:visual studio 2019 附带工程资源:C#进程调度的模拟实现附带资源-C#文档类资源-CSDN下载 先来先服务的调度算法:是一种非抢占式的算法,先来先服务 ...
- 2.2.5 操作系统之调度算法(时间片轮转调度算法、优先级调度算法、多级反馈队列调度算法)
文章目录 0.思维导图 1.时间片轮转---RR 2.优先级调度算法 3.多级反馈队列调度算法 4.三种算法的对比总结 0.思维导图 1.时间片轮转-RR Round-Robin 时间片为2举例 以时 ...
- 进程调度 优先级c语言,按优先级调度算法实现进程调度的程序
一.实验目的 在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态.当就绪进程个数大于处理机数时,就必须依照某种策略来决定哪些进程优先占用处理机.本实验模拟在单处理机情况下的进程调度,帮助学生 ...
- 非抢占模式下故障后优先级降低却不切换问题--使用Keepalived实现非抢占模式主备切换
使用Keepalived实现非抢占模式主备切换–解释非抢占模式下故障后优先级降低却不切换问题 背景 最近在用keepalived时发现,配置为非抢占模式后,主节点的服务检测脚本返回非0后,不发生切换, ...
- 时间片轮转(RR)、优先级调度算法以及多级反馈队列调度算法
一.调度算法 (一)时间片轮转(RR, Round-Robin) 例题:各进程到达就绪队列的时间.需要的运行时间如下表所示.使用时间片轮转调度算法,分析时间片大小分别是2.5时的进程运行情况. 常用于 ...
- 【操作系统之进程调度算法习题】
操作系统之进程调度算法习题 1.第一题 解答: 2. 第二题 解答: 3. 第三题 解答: 1.第一题 在一个具有三道作业的批处理系统中,作业调度采用先来先服务(FCFS) 调度算法,进程调度采用 短 ...
最新文章
- controller接收json数据_答疑 | 前后端分离,如何接收json数据?
- map,filter,reduce函数总结
- linux 系统网络服务器组建,配置和管理实训教程 pdf,Linux网络服务器配置管理项目实训教程2...
- java web项目里ehcache.xml的参数说明
- C++ 大话数据结构 09: 中缀表达式 转后缀表达式 计算器
- java10个基础错误_我们处理了10亿个Java记录的错误-这是导致97%的错误的原因
- 一日三项令人兴奋的Lucene功能
- 【51nod - 1076】2条不相交的路径(Tarjan无向图判环)
- python生成shell脚本_Python设置在shell脚本中自动补全功能的方法
- c语言程序设计实验指导实验报告,C语言程序设计实验指导及报告.doc
- 将 React 作为 UI 运行时
- [COGS2639]偏序++
- hal库串口dma卡死_HAL库版DMA循环模式串口数据收发
- 完全卸载Oracle10
- c语言对字符串逆序,【C语言】 字符串逆序
- 企业微信和钉钉的区别
- Unity3D中的对齐
- 厉害,被马赛克的图片竟然还可以恢复
- 学习四旋翼(三):DMP姿态解算和串级PID控制姿态
- [Python笔记_2]循环、字符串、列表、函数、异常处理
热门文章
- Nginx打开目录浏览功能(autoindex)并设置访问验证
- 【Java基础】循环、嵌套、跳转控制break/continue、调试器、函数
- mooc网站 常用的10个地址
- 金属牙科烧瓶的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- java匹配IP正则表达式
- 搞懂钩子方法和模板方法,看完这篇就够了
- 如何在github下载别人的代码到本地的unity
- P4363 [九省联考2018]一双木棋
- webservice mysql配置文件_在WebService中使用Microsoft.Practices.EnterpriseLibrary.Data配置数据库...
- 万元华为新旗舰P40 Pro+发布:后置5摄100倍变焦,AI拍照自动消除路人,饭圈可以告别单反了...