Linux进程调度算法
进程的状态
进程的基本状态
- 就绪:进程已获得除处理机以外的所需资源,等待分配处理机资源
- 执行:进程正在占用处理机资源执行
- 阻塞:进程等待某种条件,在条件满足之前无法执行。例如发起I/O系统调用,等待I/O中断发生
挂起
挂起指将暂不执行的进程换出到外存,节省内存空间。
与阻塞相比都是进程暂停执行的状态,但:
- 阻塞表示进程正在等待一个事件的发生,阻塞状态下收到信号会切换为就绪状态
- 挂起表示进程被换出到外存,挂起状态下被激活会被载入到内存,切换为非挂起状态
挂起状态进程按照是否阻塞分为:
- 挂起就绪状态:进程在外存中,但只要被载入内存就可执行
- 挂起阻塞状态:进程在外存中等待一个事件,即使被载入内存(激活)也无法执行
睡眠
Linux将进程的阻塞状态进一步细分为:
- 暂停:不需要等待资源
- 浅睡眠:需要等待资源且睡眠状态能被信号唤醒
- 深睡眠:需要等待资源且睡眠状态不能被信号唤醒
进程调度算法
分类
- 按照CPU分配方式:非抢占式,抢占式
- 按照系统分时方式:批处理系统,交互系统,实时系统和多处理机调度
进程饥饿
- 指某个进程无限等待,无法被调度
批处理系统调度算法
调度算法的目标:
- 吞吐量(每小时最大作业数)
- 周转时间(每作业从提交到完成时间的统计平均时间)
- CPU利用率(最好令CPU始终忙碌)
1.先来先服务算法(FCFS)
- 依据进程进入就绪状态的先后顺序排列,非抢占式 不公平
- 优点:易于理解,便于实现,只需一个就绪队列
- 缺点:平均等待时间波动大(例如短进程排在长进程后);I/O与CPU资源利用率低(CPU密集型进程会导致I/O设备闲置时,I/O密集型进程也等待)
2.最短进程优先算法(SPN或SJF)
- 预知就绪队列中执行时间最短进程占用CPU进入运行状态,非抢占式 不公平
- 优点:相对于FCFS提高了平均周转时间
- 缺点:可能导致饥饿;对长作业不公平;需要预知未来(预估下一个CPU计算的持续时间:询问用户或用历史的执行时间来预估未来的执行时间)
3.最短剩余时间优先算法(SRT或SRTN)
- 最短进程优先的抢占式版本,若新进程比正在执行的进程剩余时间短,则它优先执行, 抢占式 不公平
- 优缺点同SPN
4.最高响应比优先算法(HRRN)
- 响应比:作业等待时间/作业运行所需时间;响应比大的进程优先,非抢占式 不公平
- 优先:同时考虑了等待时间和执行时间,既优先考虑短作业(进程),也防止长作业(进程)无限等待的饥饿
交互系统(分时系统)调度算法
1.时间片轮转算法(RR)
- 将所有就绪进程排成一个队列,按照时间片轮转调度,用完时间片的进程排到队列末尾,抢占式 公平
- 优点:没有饥饿问题
- 缺点:当时间片太小时,产生大量的上下文切换,吞吐量低;当时间片太长时,等待时间过长,不能保证实时性,极限情况退化成FCFS
2.多级队列调度算法(MQ)
- 优先级高的进程先运行,同优先级的进程轮转。当高优先级队列中没有进程后,再调度下一级队列。
- 将就绪队列划分为多个独立的子队列,且每个队列拥有自己的调度策略(上述);队列间的调度采用固定的优先级:先处理前台队列,后处理后台队列。每个队列都得到一个确定的能够调度其进程的CPU总时间
- 缺点:可能导致饥饿问题
3.多级反馈队列算法(MLFQ)
- 进程可在不同队列间移动的多级队列算法(MQ);优先级高的队列先执行,优先级越高,时间片越短;若一个进程在当前队列规定时间片内无法执行完毕,则移动到下一个队列的队尾
- 特征:CPU密集型进程的优先级下降很快;I/O密集型进程停留在高优先级
- 缺点:可能导致饥饿问题:不断有新更高优先级的进程加入
4.公平共享调度(FSS)
- 保证不重要的组无法垄断资源:未使用的资源按比例分配;没有达到资源使用率目标的组获得更高的优先级 公平
5.彩票法
- 向进程提供各种系统资源的彩票。调度时随机抽取彩票,拥有该彩票的进程得到资源
- 可给重要进程更多的彩票;协作进程可能交换彩票
实时系统的调度算法
目标:满足任务的截止时间。即若有一个任务需要执行,实时系统会马上执行该任务,不会有较长的延时。
1.速率单调调度算法(RM)
- 通过周期安排优先级,周期越短优先级越高
- 执行周期最短的任务
2.最早截止时间优先算法(EDF)
- 截止时间越早优先级越高
- 执行截止时间最早的任务
多处理机的调度
特征:多个处理机组成一个多处理机系统;处理机间可负载共享
对称多处理机(SMP)调度
- 截止时间越早优先级越高,每个处理器运行自己的调度程序
- 调度程序对共享资源的访问需要进行同步
分为静态进程分配和动态进程分配(负载均衡):
- 静态进程分配:进程从开始到结束都被分配到一个固定的处理机上执行;每个处理机有自己的就绪队列;优点:调度开销小;缺点:但是各处理机可能忙闲不均
- 动态进程分配(负载均衡):进程在执行中可分配到任意空闲处理机执行;所有处理机共享一个公共的就绪队列;优点:各处理机的负载是均衡的;缺点:调度开销大
优先级反置
- 操作系统出现高优先级进程长时间等待低优先级进程所占用资源的现象
- 基于优先级的可抢占调度算法存在优先级反置
解决方法:
- 优先级继承:占用资源的低优先级进程继承申请资源的高优先级进程的优先级;
- 这种情况只在占有资源的低优先级进程被阻塞时,才提高占有资源进程的优先级
- 优先级天花板协议(PCP):占用资源进程的优先级和所有可能申请该资源的进程的最高优先级相同;
- 不管是否发生等待,都提升占用资源进程的优先级
- 优先级高于系统中所有被锁定的资源的优先级上限,任务执行临界区时就不会阻塞
Linux进程调度算法的更多相关文章
- 进程调度算法Linux进程调度算法
这次介绍一下操作系统的进程调度算法 操作系统的调度分为三种:1.远程调度(创建新进程):2.中程调度(交换功能的一部分):3.短程调度(下次执行哪个进程) 这次讲述的就是短程调度,可以简单的看作咱们平 ...
- 【Todo】Linux进程调度算法学习
参考这篇文章 http://blog.chinaunix.net/uid-27052262-id-3239260.html Linux支持三种进程调度策略,分别是SCHED_FIFO . SCHED_ ...
- Linux - 进程调度算法
进程调度: 无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数.这将导致它们互相争夺处理机.另外,系统进程也同样需要使用处理机. 这就要求进程调度程序按一定的策略,动态地把处理机分配给处于 ...
- Linux常见的进程调度算法
进程调度:在操作系统中调度是指一种资源分配. 调度算法是指: 根据系统的资源分配策略所规定的资源分配算法. 操作系统管理了系统的有限资源,当有多个进程(或多个进程发出的请求)要使用这些资源时,因为资源 ...
- Linux内核初探 之 进程(三) —— 进程调度算法
一.基本概念 抢占 Linux提供抢占式多任务,基于时间片和优先级对进程进行强制挂起 非抢占的系统需要进程自己让步(yielding) 进程类型 IO消耗型 经常处于可运行态,等待IO操作过程会阻塞 ...
- Linux 常见的进程调度算法
1.在介绍进程调度之前,先对进程的状态的概念应该有所了解,下面是关于进程状态的一些基本概念:进程的状态分为三种,分别为: 1).运行态:该状态表明进程在实际占用CPU 2).就绪态: 该状态下进程可以 ...
- Linux进程管理知识整理
Linux进程管理知识整理 1.进程有哪些状态?什么是进程的可中断等待状态?进程退出后为什么要等待调度器删除其task_struct结构?进程的退出状态有哪些? TASK_RUNNING(可运行状态) ...
- linux进程模型总结
Linux进程通过一个task_struct结构体描述,在linux/sched.h中定义,通过理解该结构,可更清楚的理解linux进程模型. 包含进程所有信息的task_struct数据 ...
- linux学习之八---Linux进程基础知识
一.linux进程 linux是一个多用户多任务的操作系统. 多用户是指多个用户能够在同一时间使用计算机. 多任务是指linux能够同一时候运行几个任务. 进程简单来说就是执行中的程序,Linux系统 ...
- Linux性能及调优指南(翻译)之Linux进程管理
本文为IBM RedBook的Linux Performanceand Tuning Guidelines的1.1节的翻译原文地址:http://www.redbooks.ibm.com/redpap ...
随机推荐
- JavaSE总结(1)
Java发展历史.HelloWorld.常量.变量类型转换.运算符.方法(函数)1.jdk版本: jdk1.2---J2EE/J2SE/J2ME jdk1.5---JavaSE/JavaE ...
- More exceptional c++读书笔记【附高清PDF下载】
Part1我是在读完Scott Meyers的<Effective c++>之后才读到这本书的.能够讨论特定的主题而不是将一门语言作为一个整体来看待是我理解c++的首选方式,所以Sutte ...
- SAP BW/4HANA学习笔记1
1.Master Data BW/4HANA BW/4HANA简介 BW/4HANA的前身是SAP BW(Business Warehouse),本质是一种数据仓库解决方案. 数据仓库解决方案: 1. ...
- 【Python】【算法】【排序】用Python实现排序的三种算法
class SortTest: def __init__(self): pass # 冒泡排序 def BubbleSort(self, value): if isinstance(value, li ...
- Software_programming_tools_IDEA
13:45:55 key promtoer 快捷键提示插件
- class的知识点
1. 在class类中,定义方法在constructor里面和外面的区别?? 定义在constructor里面是原型方法,定义在外边是实例方法. 里面的原型方法在new的时候会改变this指向 2. ...
- 【Linux】常用
查看端口占用 yum install lsof lsof -i:8080:查看8080端口占用 lsof abc.txt:显示开启文件abc.txt的进程 lsof -c abc:显示abc进程现在打 ...
- Kubernetes--容器重启策略和Pod终止过程
容器的重启策略 容器程序发生崩溃或容器申请超出限制的资源等原因都可能会导致Pod对象的终止,此时是否应该重建该Pod对象则取决于其重启策咯(restartPolicy)属性的定义. 1)Always: ...
- 如何在eclipse里的动态Web项目建立后缀为xml的文件
1.右击Dynamic Web Project类型项目的WEB-INF->new->Other->XML,选择XML File2 点击next改名字为web(后缀不要动哦)3. 点击 ...
- vue 添加代理
1.跟目录下新建vue.config.js文件,添加内容: module.exports = { assetsDir: 'static', parallel: false, publicP ...