Linux内核2.6的进程调度
Linux是多任务抢占操作系统,多任务就是指多个进程间通过分时切换来并发执行。非抢占的系统是对每个进程而言,除非时间片用完或主动放弃否则不会被剥夺CPU,主动放弃包括调用一些调度的系统调用(比如sched_yield)或者调用IO等阻塞操作。抢占式系统表示即使当前进程没有用完时间片,也没有主动放弃CPU,如果调度系统发现有更高动态优先级的进程,则强制剥夺当前进程的CPU,选择更高动态优先级的进程执行。
调度系统什么时候查看是否有更高优先级的进程呢?有这些情况:①时钟中断处理程序(Linux2.6的系统时钟频率默认是1000HZ,即每1ms调用一次时钟中断处理程序,具体系统配置的时钟频率可以通过cat /boot/config-* | grep "^CONFIG_HZ="来获取)。如果是多核处理器,则每个CPU都会执行时钟中断处理程序(其他中断处理程序只会映射到某个CPU上执行);②其他一些中断处理程序,会让某个CPU执行调度程序;③当前进程阻塞、睡眠等主动放弃处理器;④当前进程用完时间片;⑤创建了新进程;⑥执行一些调度相关的系统调用,比如改变进程的静态优先级等。
内核2.6的进程调度策略一共有三种:SCHED_NORMAL,SCHED_FIFO和SCHED_RR.其中SCHED_NORMAL用于普通进程的调度,后两种用于实时进程的调度。
Linux的进程有的属于IO消耗型进程,有的属于处理器消耗型进程。IO消耗型进程希望获得更多的处理器响应机会,每次响应不需要很长时间;处理器消耗型进程则相反。调度程序通常在系统响应速度和最大系统吞吐量之间寻求平衡。
Linux进程的静态优先级。静态优先级分为两个范围:0~99是实时进程的静态优先级(值越大优先级越高),100~139是普通进程的静态优先级(通过nice值表示,-20~19,值越大优先级越低)。
首先介绍普通进程的调度策略。Linux采用称为完全公平调度算法的调度策略(CFS),每个CPU都有个可运行队列,多个处理器的可运行队列会在调度时进行队列的平衡处理。对某个处理器而言,应该选取哪个进程投入执行是调度的核心问题,CFS根据当前可运行队列中普通进程的静态优先级给每个进程分配处理器使用比,确定周期时间T(T的选取和可运行进程个数相关,默认是20ms,这个时间T是用来控制进程切换频率的,如果太小会导致进程很快完成当前分配的处理比,而重新分配处理比,重新调度)。调度时计算虚拟运行时间,这个时间很关键,因为调度系统就是选择最小虚拟运行时间的进程投入执行。
虚拟运行时间是指每个进程的实际运行时间标准化后的时间,这个时间是相对的,可以理解为实际时间处理处理器使用比。调度思想是这样的,每个进程已经分配好处理器使用比了,调度系统希望各个进程差不多同时用完这个使用比,而不是有的进程很早完成,有的进程很晚完成。那么各个进程的完成的程度就是调度的依据,总是选择完成比最小的进程投入运行。
如果一个进程阻塞了,其他进程运行了一段时间,显然这个阻塞进程的完成比最小,那么当它醒过来的时候,会导致很长一段时间都只运行这个进程,所以在唤醒时会将完成比调整为当前可运行队列中完成比的最小值。新建的进程会根据优先级计算一个完成比,而不是简单的完成比赋为0.
再介绍实时进程的调度。SCHED_FIFO策略很简单,就是选取最高静态优先级的实时进程投入运行,并且直到进程运行完成或被更高优先级的实时进程抢占。SCHED_RR是带时间片的SCHED_FIFO.内核不为实时进程计算动态优先级。
Linux内核2.6的进程调度的更多相关文章
- Linux内核分析之理解进程调度时机跟踪分析进程调度与进程切换的过程
一.原理分析 1.调度时机 背景不同类型的进程有不同的调度需求第一种分类I/O-bond:频繁的进行I/O:通常会花费很多时间等待I/O操作的完成CPU-bound:计算密集型:需要大量的CPU时间进 ...
- (笔记)Linux内核学习(三)之进程调度
进程调度: 在可运行态进程之间分配有限处理器时间资源的内核子系统. 一 调度策略 1 进程类型 I/O消耗型进程:大部分时间用来提交I/O请求或是等待I/O请求,经常处于可运行状态,但运行时间短,等待 ...
- linux内核设计与实现--进程调度 系统调用
进程可以分为I/O消耗型和处理器消耗型. I/O消耗型指,进程的大部分时间用来提交I/O请求或者等待I/O请求. 处理器耗费型进程把时间大多用在执行代码上. linux采用了两种不同的优先级范围: 第 ...
- 操作系统 linux 内核的三种进程调度方法
1.SCHED_OTHER 分时调度策略: 2.SCHED_FIFO 实时调度策略.先到先服务: 3,SCHED_RR 实时调度策略,时间片轮转 . 实时进程将得到优先调用,实时进程依据实时优先级决定 ...
- Linux内核设计基础(十)之内核开发与总结
(1)Linux层次结构: (2)Linux内核组成: 主要由进程调度(SCHED).内存管理(MM).虚拟文件系统(VFS).网络接口(NET)和进程间通信(IPC)等5个子系统组成. (3)与Un ...
- Mooc总结——Linux内核分析
朱荟潼+ 原创作品转载请注明出处 :<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 学习笔记链接汇总 第 ...
- linux 内核学习之八 进程调度过程分析
一 关于进程的补充 进程调度的时机 中断处理过程(包括时钟中断.I/O中断.系统调用和异常)中,直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule() ...
- Linux内核分析——理解进程调度时机跟踪分析进程调度与进程切换的过程
20135125陈智威 +原创作品转载请注明出处 +<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验 ...
- Linux内核分析--理解进程调度时机、跟踪分析进程调度和进程切换的过程
ID:fuchen1994 姓名:江军 作业要求: 理解Linux系统中进程调度的时机,可以在内核代码中搜索schedule()函数,看都是哪里调用了schedule(),判断我们课程内容中的总结是否 ...
随机推荐
- [BZOJ]3110 K大数查询(ZJOI2013)
这大概是唯一一道小C重写了4次的题目. 姿势不对的树套树(Fail) → 分块(Fail) → 整体二分(Succeed) → 树套树(Succeed). 让小C写点心得静静. Description ...
- Mybatis中 collection 和 association 的区别
public class A{ private B b1; private List<B> b2;} 在映射b1属性时用association标签,(一对一的关系) 映射b2时用colle ...
- 原生js去掉所有的html标签,最终得到HTML标签中的所有内容
替换掉所有的 html标签,最终得到Html标签中的内容 <script> //替换掉所有的 html标签,最终得到Html标签中的内容 var req="<div sty ...
- Helm 架构 - 每天5分钟玩转 Docker 容器技术(161)
在实践之前,我们先来看看 Helm 的架构. Helm 有两个重要的概念:chart 和 release. chart 是创建一个应用的信息集合,包括各种 Kubernetes 对象的配置模板.参数定 ...
- Node.js 定时器
稳定性: 5 - 锁定 所有的定时器函数都是全局的.不需要通过 require() 就可以访问. setTimeout(callback, delay[, arg][, ...]) delay 毫秒之 ...
- pg备份恢复与设置编码
psql create database jasygl encoding='UTF8' TEMPLATE = template0; 命令行 备份 pg_dump dabase_name > ba ...
- 安卓高级EventBus使用详解
我本来想写但是在网上看了下感觉写得不如此作者写得好:http://www.jianshu.com/p/da9e193e8b03 前言:EventBus出来已经有一段时间了,github上面也有很多开源 ...
- Oracle导出表
方法一:利用PL/SQL Developer工具导出: 菜单栏-->Tools-->Export Tables,如下图,设置相关参数即可: 方法二:可以用cmd的操作命令导出,详情请去百度 ...
- Xcode在playground的quick look框中显示对象自定义视图
对于一般对象,playground中默认的quick look显示已经够用,比如简单的字符串,Int,或简单的自定义Class等等. 不过对于有些情况,我们需要自定义对象在playground中的显示 ...
- Android简易实战教程--第三十三话《 AsyncTask异步倒计时》
本篇小案例,完成一个倒计时.方式选择AsyncTask.代码贴在下面: 布局文件soeasy: <LinearLayout xmlns:android="http://schemas. ...