Linux内核初探 之 进程(三) —— 进程调度算法
一、基本概念
- 抢占
- Linux提供抢占式多任务,基于时间片和优先级对进程进行强制挂起
- 非抢占的系统需要进程自己让步(yielding)
- 进程类型
- IO消耗型
- 经常处于可运行态,等待IO操作过程会阻塞
- 提高调度频率,缩短运行时间
- CPU消耗型
- cpu时间用于计算
- 降低调度频率,延长运行时间
- Linux优先保证响应性能,倾向于优化IO消耗型
- IO消耗型
进程优先级
内核的优先级
静态优先级:
static_prio = MAX_RT_PRIO + nice + 20 [100, 139]
实时优先级 —— 值越大优先级越高
rt_prio = 99(High) ~ 0(Low)
动态优先级 —— 值越小优先级越高
rt
prio = MAX_RT_PRIO - 1 - rt_prio [0, 99] 用于实时进程
普通
prio = static_prio [100, 139] 用于普通进程
normal优先级
normal_prio = MAX_PRIO - 20 [120] 默认进程优先级,nice = 0
常量
MAX_RT_PRIO = 100
MAX_PRIO = 140
nice = [-20, 19]
关系图
(High) 0 1 ... 98 99 100 101 ... 120 ... 138 139 (Low)
|__|_____________|___|___|___|____________|______________|___|
(High) 99 98 ... 1 0 100 101 ... 120 ... 138 139 (Low)
|__|_____________|___| |___|____________|______________|___|
rt_prio static_prio
-20 -19 ... 0 ... 18 19
|___|____________|______________|___|
nice
120
|
normal_prio
RT RT ... RT RT 0 1 ... 20 ... 38 39 (Low)
大专栏 Linux内核初探 之 进程(三) —— 进程调度算法top(PR) |__|_____________|___|___|___|____________|______________|___|
- 时间片
- IO消耗型需要短时间片提高系统响应,CPU需要长时间片减小切换消耗以及提高cache命中
- Linux默认时间片较短,且不是直接分配到进程,CFS分配处理器使用比,当新任务的使用比小于当前进程的时候,可以抢占当前任务
- 比如响应界面输入的处理器时间小于执行复杂计算,则前者可以抢占后者,使用户输入迅速得到响应
- nice值作为权重调整处理器使用比
二、Linux调度算法
- 调度器类schedular class
- schedular class以模块方式提供调度器,可动态添加,按优先级选取
- 完全公平调度CFS
- Linux默认
SCHED_OTHER
策略
- Linux默认
- 按优先级分配时间片的问题
- 将nice值映射到绝对时间片,nice值差异越大,时间片差异越大。没有按照整个可用时间片的比例分配,导致优先级低的时候,时间片少,进程切换频繁
- 如nice值-20时间片100ms,20时间片5ms,则即使系统只有两个时间片20的进程,也各只有5ms
- 往往低优先级(高nice值)需要更长时间片,与策略相反
- 相对nice值的差异
- nice值1代表5ms处理器时间
- 为0和1,时间片为100和95,为19和20,时间片为10和5
- nice值加减1的效果取决于初始值
- nice值1代表5ms处理器时间
- 系统定时器决定了
- 时间片必需是定时器节拍的整数倍
- 两个时间片之间的差异
- 时间片会随定时器节拍改变
- 将nice值映射到绝对时间片,nice值差异越大,时间片差异越大。没有按照整个可用时间片的比例分配,导致优先级低的时候,时间片少,进程切换频繁
- 完全公平调度CFS
- 基于概念:将处理器时间平均分配给系统中的所有进程,每个进程的运行时间相当,运行时100%占有处理器
- 允许每个进程运行一段时间,选择运行最少的运行
- 按处理器使用比,nice值作为权重
- 小的调度周期交互性更好,但切换代价高,影响系统吞吐,被限制为1ms以避免切换消耗
- 进程所获得的处理器时间为其它可运行进程nice值的相对差
Linux内核初探 之 进程(三) —— 进程调度算法的更多相关文章
- 《Linux内核分析》 第八节 进程的切换和一般的执行过程
张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux内核分析 第八 ...
- Linux内核设计第六周 ——进程的描述和创建
Linux内核设计第六周 ——进程的描述和创建 第一部分 知识点总结 一.进程描述符task_struct数据结构 1.操作系统的三大功能: 进程管理.内存管理.文件系统 2.进程的作用: 将信号.进 ...
- Linux内核分析(四)----进程管理|网络子系统|虚拟文件系统|驱动简介
原文:Linux内核分析(四)----进程管理|网络子系统|虚拟文件系统|驱动简介 Linux内核分析(四) 两天没有更新了,上次博文我们分析了linux的内存管理子系统,本来我不想对接下来的进程管理 ...
- Linux内核分析第八周——进程的切换和系统的一般执行过程
Linux内核分析第八周--进程的切换和系统的一般执行过程 李雪琦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/cou ...
- Linux内核设计第八周 ——进程的切换和系统的一般执行过程
Linux内核设计第八周 ——进程的切换和系统的一般执行过程 第一部分 知识点总结 第二部分 实验部分 1.配置实验环境,确保menu内核可以正常启动 2.进入gdb调试,在shedule和conte ...
- 《Linux内核分析》第三周学习报告
<Linux内核分析>第三周学习报告 ——构造一个简单的Linux系统MenuOS 姓名:王玮怡 学号:201351 ...
- 《Linux内核分析》第三周学习笔记
<Linux内核分析>第三周学习笔记 构造一个简单的Linux系统MenuOS 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.stud ...
- Linux内核中影响tcp三次握手的一些协议配置
在Linux的发行版本中,都存在一个/proc/目录,有的也称它为Proc文件系统.在 /proc 虚拟文件系统中存在一些可调节的内核参数.这个文件系统中的每个文件都表示一个或多个参数,它们可以通过 ...
- 【读书笔记】《Linux内核设计与实现》进程管理与进程调度
大学跟老师做嵌入式项目,写过I2C的设备驱动,但对Linux内核的了解也仅限于此.Android系统许多导致root的漏洞都是内核中的,研究起来很有趣,但看相关的分析文章总感觉隔着一层窗户纸,不能完全 ...
随机推荐
- Angular ng-container ng-template 用法
ng-container本身不创建任何html代码,相当于一个容器. <ng-container *ngFor="let item of dataSource;let i=index& ...
- 吴裕雄--天生自然 PYTHON3开发学习:CGI编程
<Directory "/var/www/cgi-bin"> AllowOverride None Options +ExecCGI Order allow,deny ...
- 黑马eesy_15 Vue:04.Vue案例(ssm环境搭建)
黑马eesy_15 Vue:02.常用语法 黑马eesy_15 Vue:03.生命周期 黑马eesy_15 Vue:04.Vue案例(ssm环境搭建) 黑马eesy_15 Vue:04.综合案例(前端 ...
- We don't wanna work!
We don't wanna work! [JAG Asia 2016] 两个set,一个代表工作的,一个代表不工作的 其实是一个很简单的模拟,但是我竟然排序之前标号.... 检查代码的时候要从头开始 ...
- [徐州网络赛]Longest subsequence
[徐州网络赛]Longest subsequence 可以分成两个部分,前面相同,然后下一个字符比对应位置上的大. 枚举这个位置 用序列自动机进行s字符串的下标转移 注意最后一个字符 #include ...
- BaseAdapter教程(2) BaseAdapter的notifyDataSetChanged动态刷新
遇到了这麽一个需求,ListView滑到最底,然后会自动在底部加入新的Cell,实现动态刷新. 1. 首先,为ListView加上setOnScrollListener. lvHomePostItem ...
- F. Rhyme scheme
题: https://nanti.jisuanke.com/t/41414 #include<bits/stdc++.h> using namespace std; typedef __i ...
- 洛谷-P3919-可持久化数组
题目传送门 sol:在洛谷上看到一种dfs + 离线的方法,可以解决大部分可持久化问题.把依赖关系看成边,然后建树.这样本来要解决的多个版本只要在一个版本上进行修改就好了. 离线 + dfs #inc ...
- python-django项目-每次重启电脑需要启动的虚拟机服务_20191124
python-django项目-每次重启电脑需要启动的虚拟机服务 看来第一步是确定虚拟机的ip问题,必须要是192.168.100.128,否则很多的配置都不能用了, 所以要配置虚拟机的ip, 第一步 ...
- 7)加了基础控制器Controller.php
文件目录展示: 改动代码展示: Controller.php <?php /** * Created by PhpStorm. * User: Interact * Date: 2017/8/2 ...