进程的优先级 与 CFS 进程调度
- 在Linux下改变进程的优先级
- 作者:曾老师,华清远见嵌入式学院讲师。
- 作为多任务的操作系统,Linux内核为每个创建的进程分配时间片并根据其优先级进行调度。当进程被创建时,其对应的task_struct里包含了四个优先级:
- struct task_struct {
- ……
- int prio, static_prio, normal_prio;
- unsigned int rt_priority;
- ……
- };
- 在内核头文件include/linux/sched.h中定义了如下宏
- #define MAX_USER_RT_PRIO 100
- #define MAX_RT_PRIO MAX_USER_RT_PRIO //100
- #define MAX_PRIO (MAX_RT_PRIO + 40) //140
- 内核中规定进程的优先级范围为[, MAX_PRIO-]
实时任务的优先级范围是[, MAX_RT_PRIO-] //[0,99]
非实时任务的优先级范围是[MAX_RT_PRIO, MAX_PRIO-] //[100,139]- 优先级值越小,意味着级别越高,任务先被内核调度。
- 那任务的优先级又是如何确定的呢?和task_struct中的成员是什么关系?
- ① prio指的是任务当前的动态优先级,其值影响任务的调度顺序。
- ② normal_prio指的是任务的常规优先级,该值基于static_prio和调度策略计算。
- ③ static_prio指的是任务的静态优先级,在进程创建时分配,该值会影响分配给任务的时间片的长短和非实时任务动态优先级的计算。
- ④ rt_priority指的是任务的实时优先级。若为0表示是非实时任务,[, ]表示实时任务,值越大,优先级越高。
- static_prio = MAX_RT_PRIO + + nice(nice的缺省值是0,范围[, ])
- rt_priority缺省值为0,表示非实时任务。[,]表示实时任务
- 对于实时任务,prio = normal_prio = static_prio
- 对于非实时任务 prio = normal_prio = MAX_RT_PRIO – – rt_priority
- prio的值在使用实时互斥量时会暂时提升,释放后恢复成normal_prio
- 下面来了解一下如何在应用程序中改变进程的优先级。
- #include <sys/time.h>
- #include <sys/resource.h>
- int setpriority(int which, int who, int prio);
- //该函数可以修改进程、进程组或用户所有进程的nice值从而影响static_prio
- which : PRIO_PROCESS // 修改某个进程
- PRIO_PGRP // 修改进程组
- PRIO_USER // 修改用户所有进程
- who : 进程号(0表示当前调用进程)、进程组号或UID
- prio : 新的用户态优先级(即nice值,范围[-,])
- 返回值 : 执行成功返回0,失败返回-1并设置errno
- if (setpriority(PRO_PROCESS, , ) <0)
- {
- perror(“fail to setpriority”);
- exit(-);
- }
- ************************************************************************
- #include <sched.h>
- int sched_setscheduler(pid_t pid, int policy, const struct sched_param *param);
- struct sched_param
- {
- int __sched_priority;
- };
- // 该函数修改某个进程的调度策略和rt_priority
- pid : 要修改的进程号,0表示当前调用进程
- policy : 调度策略
- SCHED_OTHER(针对非实时进程的调度策略)
- SCHED_RR(针对实时进程的轮转调度策略)
- SCHED_FIFO(针对实时进程的先进先出调度策略)
- param : 指向的结构体中存放着要设置的rt_priority
- 返回值 : 执行成功返回0,失败返回-1并设置errno
- ……
- struct sched_param sp = {};
- if (sched_setscheduler(, SCHED_FIFO, &sp) < )
- {
- perror(“fail to sched_setscheduler”);
- exit(-);
- }
- linux的线程调度策略,linux将进程分为下面两类
- 实时进程
- ¢ 对调度延迟的要求最高,要求立即响应并执行
- ¢ 调度策略:FIFO、Round Robin
- 普通进程
- Ø交互式进程:间或处于睡眠态,对响应速度要求比较高
- Ø批处理进程:在后台执行,能够忍受响应延迟
- 普通进程调度策略使用CFS,CFS是现在被内核采纳的调度器。它从RSDL/SD中吸取了完全公平的思想,不再跟踪进程的睡眠时间,也不再企图区分交互式进程
- CFS算法中,每个进程都有一个“虚拟运行时间”表示该进程运行了“多长时间”,而调度器会选择虚拟运行时间最小的进程来运行
- 虚拟运行时间的计算与进程实际运行时间成正比,而与进程优先级成反比
- CFS以虚拟运行时间作为键值构造一棵红黑树,从而实现了快速更新和删除完全公平调度Completely Fair Scheduler
- 核心思想:根据进程的优先级按比例分配运行时间
- (公式1)
- 1.分配给进程的运行时间 = 调度周期 * 进程权重 / 所有进程权重之和
- 调度周期:将所有处于TASK_RUNNING态进程都调度一遍的时间
- CFS对时钟做抽象,引入了虚拟运行时间vruntime的概念,每个进程有自己的vruntime
- 2.vruntime = 实际运行时间 * NICE_0_LOAD /进程权重
- (公式2)
- 由公式1和2得:
- vruntime = (调度周期 * 进程权重/所有进程总权重) * NICE_0_LOAD/进程权重= 调度周期 * NICE_0_LOAD/所有进程总权重
- 从vruntime的角度,分配给所有进程的时间是一样的
- CFS算法,每次选择vruntime最小的进程运行,所有进程的vruntime增长速度宏观上看是同时推进的
- CFS 维护了一个以vruntime为顺序的红黑树,可以快速高效地插入或删除任务
- 调度器每次选择最左侧结点的进程运行,运行结点从树中删除;进程切换时,切换下来的就绪态进程再重新插入树中,
因为换下来的进程一般vruntime比较大所以会靠近树的右侧;总体来说树的内容从右侧迁移到左侧以保持平衡。
进程的优先级 与 CFS 进程调度的更多相关文章
- 二十一、Linux 进程与信号---进程查看和进程状态、进程调度和进程状态变化、进程标识
21.1 进程查看和进程状态 21.1.1 ps 指令 ps 指令通常可以查看到进程的 ID.进程的用户 ID.进程状态和进程的 Command ps:查看当前用户启动的进程 ps -ef:详细查看后 ...
- EPROCESS 进程/线程优先级 句柄表 GDT LDT 页表 《寒江独钓》内核学习笔记(2)
在学习笔记(1)中,我们学习了IRP的数据结构的相关知识,接下来我们继续来学习内核中很重要的另一批数据结构: EPROCESS/KPROCESS/PEB.把它们放到一起是因为这三个数据结构及其外延和w ...
- 第11讲- Android中进程及其优先级
第11讲Android中进程及其优先级 进程与线程: 进程:操作系统结构的基础,资源分配的最小单元,一个操作系统包括多个进程: 线程:线程存在于进程当中,是操作系统调试执行的最小单元,一个进程包括多个 ...
- mfc 进程的优先级
知识点: 进程优先级 获取当前进程句柄 优先级设置 优先级变动 优先级获取 一.进程优先级(优先级等级) 简单的说就是进程(线程)的优先级越高,那么就可以分占相对多的CPU时间片. ...
- 改变进程的优先级,nice,getpriority,setpriority
int getpriority(int which, int who);返回一组进程的优先级 参数which和who确定返回哪一组进程的优先级 The value which is one of PR ...
- RHCE7 管理II-5管理进程的优先级
进程的优先级值称为进程的nice值,共有40种不同的取值(用数字-20到19表示) nice值越大,表示进程的优先级越低. 进程的nice值,只允许root用户来设置负的nice:其他用户只允许设置正 ...
- Linux中进程的优先级
Linux採用两种不同的优先级范围,一种是nice值.还有一种是实时优先级. 1.nice值 nice值得范围是-20~19,默认值是0. 越大的nice值意味着更低的优先级.也就是说nice值为-2 ...
- android中进程的优先级
android中进程的优先级
- Linux基础进程管理优先级
一.进程优先级 Linux进程调度及多任务 每个cpu(或者cpu核心)在一个时间点上只能处理一个进程,通过时间片技术,Linux实际能够运行的进程(和线程数)可以超出实际可用的cpu及核心数量.Li ...
随机推荐
- How To mount/Browse Windows Shares【在linux{centos}上挂载、浏览window共享】
How to mount remote Windows shares Contents Required packages Basic method Better Method Even-better ...
- Python Standard Library 学习(一) -- Built-in Functions 内建函数
内建函数列表 Built-in Functions abs() divmod() input() open() staticmethod() all() enumerate() int() ord() ...
- iOS: 学习笔记, 用代码驱动自动布局实例(swift)
iOS自动布局是设置iOS界面的利器.本实例展示了如何使用自动布局语言设置水平布局, 垂直布局1. 创建空白iOS项目(swift)2. 添加一个控制器类, 修改YYAppDelegate.swift ...
- linux下date命令实现时间戳与日期的转换
1.查看指定时间的时间戳 查看当前时间 #date +%s 查看指定时间 #date -d 2008-01-01 +%s 1199116800 #date -d 20080101 ...
- 2016022612 - redis事务命令集合
参考地址:http://www.yiibai.com/redis/redis_transactions.html Redis事务由指令 MULTI 启动,以EXEC结束. 1.multi 用途:事务开 ...
- source insight 使用技巧
一.在所有文件中查找字符串 1.菜单栏选择“search project” 2.在随便一个工程文件中把所要查找的字符串输入到空白的地方,然后点连接
- JSP基础笔记
主要内容:1. JSP基础2. Cookie3. HttpSession ================================ JSP基础 1. jsp的作用: * Servlet: &g ...
- LightOj_1104 Birthday Paradox
题目链接 题意: 若一年有n天, 问至少需要多少个人才能满足其中两个人生日相同的概率大于等于0.5? 思路: 经典问题:生日悖论 换成其互斥事件:m个人, 每个人生日都不相同的概率 ≤ 0.5 时最小 ...
- django中的事务管理
在讲解之前首先来了解一下数据库中的事务. 什么是数据库中的事务? 热心网友回答: ():事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不 ...
- attr
今天用attr的时候忽然不知道html中没有的attribute可以不可以用该方法新增了, 查了appframework的文档,居然木有看出解答. 百度之,js原生的setAttribute当然是可以 ...