linux内核 进程调度
概念:
进程调度决定那个进程投入运行,运行多长时间。
进程调度没有太复杂的原理,最大限度的利用处理器时间的原则是:只要有可执行的程序,那么总会有进程在执行,如果可运行的进程比处理器数目要多,那么注定要有部分进程在等待。
多任务操作系统:
抢占式多任务模式:由调度系统来决定那个进程在运行。
非抢占式多任务模式:进程自身决定何时停止对CPU的占用。
linux是抢占式的。
调度算法
linux上主要有两大类调度算法,CFS(完全公平调度算法)和实时调度算法。
CFS
cfs定义了一种新的模型,它给cfs_rq(cfs的run queue)中的每一个进程安排一个虚拟时钟,vruntime。如果一个进程得以执行,随着时间的增长(也就是一个个tick的到来),其vruntime将不断增大。没有得到执行的进程vruntime不变。
而调度器总是选择vruntime跑得最慢的那个进程来执行。这就是所谓的"完全公平"。为了区别不同优先级的进程,优先级高的进程vruntime增长得慢,以至于它可能得到更多的运行机会。
CFS使用红黑树来组织可运行的任务,可以想象为按照vruntime排序的红黑树,内容是进程的PID。这样保证CFS可以很快的找到vruntime最小的进程,并且拿出来投入运行。
了解一个大概就可以了,详细实现可以参考:http://www.cnblogs.com/tianguiyu/articles/6091378.html
实时调度算法
了解:实时调度算法是一种静态优先级的算法,为了满足快速响应。linux尽量保证这些进程总能在抢占中成功。
随眠和唤醒
睡眠(被阻塞)是一种特殊的不可执行状态。这点非常重要,如果没有睡眠状态,调度程序如果有可能选择出一个暂时不愿意被执行的进程,睡眠就必须使用轮询的方式来实现了。
linux的睡眠是通过等待队列来实现的。等待队列和任务队列一样,也是一个双端循环链表。进程执行睡眠操作,会把自己放入等待队列:下次调度的时候,调度器会忽略等待队列中的进程。
等待队列中的任务不会自动被唤醒,而是需要其他进程调用唤醒方法来唤醒,唤醒方法可以唤醒等待队列上随机一个进程,或者所有进程。唤醒操作会修改进程的状态为可运行,然后把此进程放入红黑树。
我的理解:一般是一个进程下的所有线程(对linux来说,也是进程)相互协调工作,举例来说,对于锁,阻塞在这个锁的所有线程都将进入同一个等待队列,一旦另外的线程释放了锁,那么其他线程(如主进程)会负责唤醒这个等待队列上的线程去抢占锁。
上下文切换
进程切换的时候,将上一个进程的处理器状态保存,然后切换到下一个进程的处理器状态,包含但不局限于:栈信息,程序计数器,寄存器信息。
linux内核 进程调度的更多相关文章
- Linux内核进程调度overview(1)
一.概述 决定何时.如何选择一个新进程运行的这组规则叫做:调度策略(scheduling policy). Linux的调度是基于分时技术(time sharing):多个进程以“时间多路复用”方式运 ...
- Linux内核分析:实验八--Linux进程调度与切换
刘畅 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 这篇文章主要分析Li ...
- 第3章(1) Linux内核相关概念
Linux内核的组成 1. Linux内核源代码的目录结构 arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录,如 i386.arm. arm64.powerpc.mips 等.Linu ...
- 《Linux内核设计与实现》读书笔记 第四章 进程调度
第四章进程调度 进程调度程序可看做在可运行太进程之间分配有限的处理器时间资源的内核子系统.调度程序是多任务操作系统的基础.通过调度程序的合理调度,系统资源才能最大限度地发挥作用,多进程才会有并发执行的 ...
- linux 内核学习之八 进程调度过程分析
一 关于进程的补充 进程调度的时机 中断处理过程(包括时钟中断.I/O中断.系统调用和异常)中,直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule() ...
- Linux内核分析——理解进程调度时机跟踪分析进程调度与进程切换的过程
20135125陈智威 +原创作品转载请注明出处 +<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验 ...
- Linux内核分析之理解进程调度时机跟踪分析进程调度与进程切换的过程
一.原理分析 1.调度时机 背景不同类型的进程有不同的调度需求第一种分类I/O-bond:频繁的进行I/O:通常会花费很多时间等待I/O操作的完成CPU-bound:计算密集型:需要大量的CPU时间进 ...
- Linux内核分析--理解进程调度时机、跟踪分析进程调度和进程切换的过程
ID:fuchen1994 姓名:江军 作业要求: 理解Linux系统中进程调度的时机,可以在内核代码中搜索schedule()函数,看都是哪里调用了schedule(),判断我们课程内容中的总结是否 ...
- 【读书笔记】《Linux内核设计与实现》进程管理与进程调度
大学跟老师做嵌入式项目,写过I2C的设备驱动,但对Linux内核的了解也仅限于此.Android系统许多导致root的漏洞都是内核中的,研究起来很有趣,但看相关的分析文章总感觉隔着一层窗户纸,不能完全 ...
随机推荐
- 【计算机视觉】【并行计算与CUDA开发】GPU硬解码---CUVID
问题描述:项目中,需要对高清监控视频分析处理,经测试,其解码过程所占CPU资源较多,导致整个系统处理效率不高,解码成为系统的瓶颈. 解决思路: 利用GPU解码高清视频,降低解码所占用CPU资源,加速解 ...
- 【VS开发】VC++ 获取系统时间、程序运行时间(精确到秒,毫秒)的五种方法
1.使用CTime类(获取系统当前时间,精确到秒) CString str; //获取系统时间 CTime tm; tm=CTime::GetCurrentTime();//获取系统日期 str=tm ...
- Java中对JSONArray中的对象进行排序
String jsonArrStr = "[ { \"ID\": \"135\", \"Name\": \"Fargo ...
- 插入排序的Python代码实现
是打扑克的时候了 那种按大小排序的扑克游戏 def insert_sort(arr): for i in range(1,len(arr)): for j in range(i,0,-1): #与左边 ...
- 大数据之Zookeeper概述
Zookeeper概述 Zookeeper是一个开放源码的分布式应用程序协调服务,是 Google的Chubby一个开源的实现,是 Hadoop和 HBASE的重要组件.主要解决分布式应用一致性问题. ...
- PAT A1036 Boys vs Girls(25)
AC代码 #include <cstdio> #include <algorithm> using namespace std; const int max_n = 11000 ...
- idea jar 中没有主清单属性
idea 中maven需要有插件 <build> <plugins> <plugin> <groupId>org.springframework.boo ...
- Selenium IDE for firefox
第一次接触selenium. 首先, selenium支持的 Firefox版本是17.0~34.x. 打开火狐历史版本:http://ftp.mozilla.org/pub/firefox/rele ...
- Linux之远程文件传输
1)scp scp命令用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器硬盘变为只读re ...
- echart tooltip问题(鼠标放上去显示所有和显示当个)
先看效果 两种方式只要修改一下 echat option里面tooltip的属性即可 第一种: tooltip : { show: true, trigger: 'item' // trigger: ...