进程的优先级

                                                      在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
内核中规定进程的优先级范围为[0, MAX_PRIO-1]           实时任务的优先级范围是[0, MAX_RT_PRIO-1]          //[0,99]           非实时任务的优先级范围是[MAX_RT_PRIO, MAX_PRIO-1] //[100,139]

优先级值越小,意味着级别越高,任务先被内核调度。
那任务的优先级又是如何确定的呢?和task_struct中的成员是什么关系?
① prio指的是任务当前的动态优先级,其值影响任务的调度顺序。
        ② normal_prio指的是任务的常规优先级,该值基于static_prio和调度策略计算。
        ③ static_prio指的是任务的静态优先级,在进程创建时分配,该值会影响分配给任务的时间片的长短和非实时任务动态优先级的计算。
        ④ rt_priority指的是任务的实时优先级。若为0表示是非实时任务,[1, 99]表示实时任务,值越大,优先级越高。
static_prio = MAX_RT_PRIO + 20 + nice(nice的缺省值是0,范围[20, 19])
rt_priority缺省值为0,表示非实时任务。[1,99]表示实时任务
对于实时任务,prio = normal_prio = static_prio
对于非实时任务 prio = normal_prio = MAX_RT_PRIO – 1 – 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值,范围[-20,19])
        返回值 : 执行成功返回0,失败返回-1并设置errno

        if (setpriority(PRO_PROCESS, 0, 2) <0)
        {
                perror(“fail to setpriority”);
                exit(-1);
        }

        ************************************************************************
        #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 = {1};
        if (sched_setscheduler(0, SCHED_FIFO, &sp) < 0)
        {
                perror(“fail to sched_setscheduler”);
                exit(-1);
        }
linux的线程调度策略,linux将进程分为下面两类
    实时进程
     ¢ 对调度延迟的要求最高,要求立即响应并执行
     ¢ 调度策略:FIFO、Round Robin
   普通进程
     Ø交互式进程:间或处于睡眠态,对响应速度要求比较高
     Ø批处理进程:在后台执行,能够忍受响应延迟
普通进程调度策略使用CFS,CFS是现在被内核采纳的调度器。它从RSDL/SD中吸取了完全公平的思想,不再跟踪进程的睡眠时间,也不再企图区分交互式进程
CFS算法中,每个进程都有一个“虚拟运行时间”表示该进程运行了“多长时间”,而调度器会选择虚拟运行时间最小的进程来运行
虚拟运行时间的计算与进程实际运行时间成正比,而与进程优先级成反比
CFS以虚拟运行时间作为键值构造一棵红黑树,从而实现了快速更新和删除完全公平调度Completely Fair Scheduler

核心思想:根据进程的优先级按比例分配运行时间
(公式1)
分配给进程的运行时间 = 调度周期 * 进程权重 / 所有进程权重之和
调度周期:将所有处于TASK_RUNNING态进程都调度一遍的时间
CFS对时钟做抽象,引入了虚拟运行时间vruntime的概念,每个进程有自己的vruntime
vruntime = 实际运行时间 * NICE_0_LOAD /进程权重
(公式2)
由公式1和2得:
vruntime = (调度周期 * 进程权重/所有进程总权重) * NICE_0_LOAD/进程权重= 调度周期 * NICE_0_LOAD/所有进程总权重
从vruntime的角度,分配给所有进程的时间是一样的
CFS算法,每次选择vruntime最小的进程运行,所有进程的vruntime增长速度宏观上看是同时推进的
CFS 维护了一个以vruntime为顺序的红黑树,可以快速高效地插入或删除任务
调度器每次选择最左侧结点的进程运行,运行结点从树中删除;进程切换时,切换下来的就绪态进程再重新插入树中,因为换下来的进程一般vruntime比较大所以会靠近树的右侧;总体来说树的内容从右侧迁移到左侧以保持平衡。
时间: 2024-10-13 14:54:27

进程的优先级的相关文章

RHCE7 管理II-5管理进程的优先级

进程的优先级值称为进程的nice值,共有40种不同的取值(用数字-20到19表示) nice值越大,表示进程的优先级越低. 进程的nice值,只允许root用户来设置负的nice:其他用户只允许设置正的nice值,且只能升高而不能降低. 查看进程nice值 1.使用top查看进程的nice值 NI表示进程的实际的nice值:PR将nice级别显示为映射到更大优先级队列 2.使用ps查看进程的nice值 # ps axo pid,comm,nice --sort=-nice 有些进程nice值是-

android中进程的优先级

android中进程的优先级

#22 进程、优先级管理命令:vmstat、pmap、htop、glances、dstat、kill、killall、pkill、bg、fg、nice...

进程之间可以通信的:IPC,inter-process communication 1.signal(信号) 2.semaphore(旗语) 3.shared memory(SHM) 4.socket 有效的信号表示方法: 1.使用信号的数字编码进行表示: 2.使用信号的完整名称进行表示: 3.使用信号的简写名称进行表示,简写名称就是完整名称中不包含"SIG"的其余部分: 常用的信号: 1.SIGHUP:无需关闭对应进程而让其重新读取其自身的配置文件: 2.SIGINT:终止正在运行的

RH134-5 进程的优先级

第五章.进程的优先级 通过设定优先级,可以让进程优先得到cpu的运算资源,优先执行这些进程的指令 范围 -20 ~19  数字越低,优先级越高,越容易得到cpu的运算资源 # nice -n -20 firefox  &  指定以 -20的优先级执行 # renice -n 19 4316  <---把pid为4316的进程的优先级重新调整为19 # renice -n -10 4316 再次把进程pid =4316 的优先级调整为 -10 # ps axo pid,comm,nice --

RHCE 学习笔记(19) 进程的优先级

这一节学习进程的优先级和NICE值的设定.在CPU负荷比较高的情况下,优先级高的进程优先执行.RHEL7里面优先级=优先系数+NICE值来决定. 优先系数可以视作一个内核的静态值,因此我们呢可以通过调整NICE的大小来改变优先级.NICE的取值范围是从-20到19,数字越大,优先级越低.NICE默认为0 首先把CPU改成单核,这样便于实验,看看cpuinfo,已经是单核了 输入top,可以实时的显示CPU,NICE值的变化 按住Ctrl+Shift+T, 另外打开两个终端,然后执行两个死循环的命

Linux中进程的优先级

Linux採用两种不同的优先级范围,一种是nice值.还有一种是实时优先级. 1.nice值 nice值得范围是-20~19,默认值是0. 越大的nice值意味着更低的优先级.也就是说nice值为-20的优先级最高. 2.实时优先级 实时优先级的范围是0~99.其值得意义与nice值相反.即:越高的实时优先级数值意味着进程优先级越高. Linux的进程可分为普通进程和实时进程.实时进程都是一些对响应时间要求比較高的进程.因此实时进程的优先级比普通进程的优先级要高. 3.优先级比較 Linux中的

Android学习:进程以及优先级

1:Android中的进程process 当一个android应用启动,系统会启动一个进程和一个主线程来运行这个应用. Android系统会尽力保持这个进程的稳定和安全. 但是,在某些特殊情况下,总会移除旧的进程来回收内存,用于新的或者重要的进程. 当要回收内存的时候,系统要决定那些进程应该保留,那些进程应该杀掉. 因此,在android进程管理中,设置了进程的优先级别.优先级别取决于进程内运行的程序以及程序的状态. 那么.系统需要回收内存时,就杀掉优先级低的进程,这就是android系统的策略

Linux基础进程管理优先级

一.进程优先级 Linux进程调度及多任务 每个cpu(或者cpu核心)在一个时间点上只能处理一个进程,通过时间片技术,Linux实际能够运行的进程(和线程数)可以超出实际可用的cpu及核心数量.Linux内核进程调度程序将多个进程在CPU核心上快速切换,从而给用户多个进程在同时运行的印象: 相对优先级nice 由于不是每个进程都与其他进程同样重要,可告知进程调度程序为不同的进程使用不同的调度策略,常规系统上运行的大多数进程所使用的调度策略为 SCHED_OTHER(也称为SCHED_NORMA

简述Android系统前台进程、可见进程、服务进程、后台进程和空进程的优先级排序原因。

第一高:前台进程 前台进程是Android系统中最重要的进程,是与用户正在交互的进程. 第二高:可见进程 可见进程指部分程序界面能够被用户看见,却不在前台与用户交互. 第三高:服务进程 一个包含已启动服务的进程就是服务进程,服务没有用户界面,不与用户直接交互,但能够在后台长期运行,提供用户所关心的重要功能. 第四高:后台进程 如果一个进程不包含任何已经启动的服务,而且没有用户可见的Activity,则这个进程就是后台进程. 第五高:空进程 空进程是不包含任何活跃组件的进程.在系统资源紧张时会被首