进程的优先级 与 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 ...
随机推荐
- 【python之旅】python的基础一
一.关于模块那些事 python的强大之处在于他有着丰富且强大的标准库和第三方库,很对功能都有相应的python库支持 例如: sys模块: # Author :GU import sys print ...
- APCS
arm汇编程序中,R0,R1,R2,R3,R12都是作为中间寄存器,而R4-R11是不能随便使用的,暂时我还不知它们的用途.所以,中间寄存器,在程序运行的开始处与结束的时候值是可以不一样的,也就是说中 ...
- Unity3D 解决c#脚本乱码
怀着无比激动的心情下载了Unity3D,按照网上的教程试着制作我的第一个U3D"作品":camera绑定绘制GUI显示"Hello, World",很简单的例子 ...
- Uva_11021 Tribles
题目链接 题意: 现在有k只麻球, 每只麻球只能存活一天, 第二天就会死去, 死去之前可能生下x只小麻球(x = 0,1,2,...,n 1), 概率分别为P[0], P[1], ... , P[n ...
- iOSシステム構成の纏め
iOSのアーキテクチャ a) iOSのアーキテクチャは階層化されている最上位レベルでは.iOSはそれが稼働しているハードウェアとアプリケーションの間の仲介役を果たします.アプリケーションが ...
- nodejs and socket.io and iisnode
http://www.amazedsaint.com/2011/09/creating-10-minute-todo-listing-app-on.html http://www.cnblogs.co ...
- Nodejs 集成到IIS
http://www.hanselman.com/blog/WebMatrixAndNodejsTheEasiestWayToGetStartedWithNodeOnWindows.aspx http ...
- Keil 代码折叠功能的使用
使用keil时将某段{......}内的代码折叠起来的方法:
- 【HDOJ】3006 The Number of set
数据量这么小,果断状态压缩+dp. /* 3006 */ #include <iostream> #include <string> #include <map> ...
- HDOJ 1237题 简单计算器
简单计算器 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...