linux内核之进程优先级

合集下载

Linux进程状态解析之R、S、D、T、Z、X

Linux进程状态解析之R、S、D、T、Z、X

Linux进程状态解析之R、S、D、T、Z、XLinux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序,就必然会产生很多的进程,而每个进程会有不同的状态。

众所周知,现在的分时操作系统能够在一个CPU上运行多个程序,让这些程序表面上看起来是在同时运行的。

linux就是这样的一个操作系统。

在linux系统中,每个被运行的程序实例对应一个或多个进程。

linux内核需要对这些进程进行管理,以使它们在系统中“同时”运行。

linux内核对进程的这种管理分两个方面:进程状态管理,和进程调度。

本文主要介绍进程状态管理,进程调度见《linux进程调度浅析》。

Linux进程状态:R (TASK_RUNNING),可执行状态。

只有在该状态的进程才可能在CPU上运行。

而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。

进程调度器的任务就是从各个CPU的可执行队列中分别选择一个进程在该CPU上运行。

很多操作系统教科书将正在CPU上执行的进程定义为RUNNING状态、而将可执行但是尚未被调度执行的进程定义为READY状态,这两种状态在linux下统一为 TASK_RUNNING状态。

只要可执行队列不为空,其对应的CPU就不能偷懒,就要执行其中某个进程。

一般称此时的CPU“忙碌”。

对应的,CPU“空闲”就是指其对应的可执行队列为空,以致于CPU无事可做。

有人问,为什么死循环程序会导致CPU占用高呢?因为死循环程序基本上总是处于TASK_RUNNING状态(进程处于可执行队列中)。

除非一些非常极端情况(比如系统内存严重紧缺,导致进程的某些需要使用的页面被换出,并且在页面需要换入时又无法分配到内存……),否则这个进程不会睡眠。

所以 CPU的可执行队列总是不为空(至少有这么个进程存在),CPU也就不会“空闲”。

linux setpriority 用法

linux setpriority 用法

linux setpriority 用法(原创实用版)目录1.Linux setpriority 概述2.setpriority 的基本语法3.setpriority 的使用示例4.设置进程优先级的其他方法正文【1.Linux setpriority 概述】Linux setpriority 是一个用于设置进程优先级的命令行工具。

在Linux 操作系统中,进程优先级是一个数值,数值越低,进程的优先级越高。

通过设置进程优先级,可以影响系统为进程分配 CPU 时间片的数量,进而影响进程的执行速度。

setpriority 命令可以让用户更方便地设置进程的优先级。

【2.setpriority 的基本语法】setpriority 的基本语法如下:```setpriority [选项] 优先级进程 ID```其中,优先级是一个整数,取值范围为 -20(最高优先级)到 19(最低优先级)。

进程 ID 是指要设置优先级的进程的 ID。

如果不指定进程 ID,则默认为当前正在运行的进程。

【3.setpriority 的使用示例】下面是一个 setpriority 的使用示例:```setpriority 1 1234```这个命令将进程 ID 为 1234 的进程的优先级设置为 1。

【4.设置进程优先级的其他方法】除了使用 setpriority 命令,还可以通过修改进程的 nice 值来设置进程的优先级。

nice 值是一个整数,取值范围为 -20(最高优先级)到 19(最低优先级)。

进程的 nice 值越高,优先级越高。

可以使用 renice 命令来修改进程的 nice 值。

进程优先级

进程优先级

• 这里首先计算了普通优先级,保存在normal_prio。这个副效应提 供可以设置两个优先级(prio and normal_prio)。 • 另一个辅助函数rt_prio会检测普通优先级是否在实时范围中,即 是否小于RT_RT_PRIO。该检测和调度类无关,只涉及优先级的数 值。 • 当处理普通进程时,所有三个优先级都是同一个值,即静态优先 级。
实时进程的优先级计算
• 普通优先级需要根据普通进程和实时进程不同计算。实时进程的 普通优先级需要根据其rt_priority计算。由于更高的rt_priority表示 更高实时优先级,与内核内部优先级表示方法相反,所以可以得 出如下算法: • MAX_RT_PRIO – 1 – p->rt_priority • 与effective_prio相比,实时进程的检测不在基于优先级数值,而 是通过task_struct里的调度策略来进行(HOW?)。 • 另一个问题:为什么内核在effective_prio中检测实时进程是基于 优先级数值? • 原因:临时提高到实时优先级的非实时进程 实时互斥量
总结计算优先级
• 在新建进程唤醒或者使用nice修改优先级时,即是使用上述方法 设置p->prio. • Ps:在进程分支出子进程时,子进程的静态优先级继承自父进程, 动态优先级设置为父进程的普通优先级。确保实时互斥量引起的 优先级提高不会影响到子进程。
计算负荷权重
• 进程的重要性还在于负荷权重(保存在task_struct->se.load中)。 • 比较重要的是,负荷权重实现nice值改变后cpu分配时间的改变。 一般概念是,每降低一个nice值,则多获得10%的额外cpu时间。 反之亦然。优先级转换为权重值的转换表如下(乘数1.25):

linux的任务调度机制

linux的任务调度机制

linux的任务调度机制摘要:1.Linux任务调度机制简介2.Linux任务调度器的工作原理3.调度策略和队列4.进程优先级和调度算法5.总结正文:Linux任务调度机制是操作系统中负责分配处理器时间片给各个进程的核心组件。

它依据特定的策略和算法,确保公平、高效地管理进程的执行。

本文将详细介绍Linux任务调度机制的各个方面。

1.Linux任务调度机制简介Linux采用基于优先级的抢占式调度算法,以确保处理器资源得到充分利用。

调度器通过周期性地在就绪队列中选择一个或多个进程,将它们分配给处理器执行。

调度器主要依据进程的优先级和当前的负载情况来决定哪个进程获得处理器资源。

2.Linux任务调度器的工作原理Linux任务调度器的核心组件是调度实体(scheduler entity),它包括进程队列、调度策略和调度算法。

调度实体根据系统的当前状态,按照策略和算法来选择下一个要执行的进程。

调度实体的工作过程分为以下几个步骤:- 进程创建:当一个新进程被创建时,调度器会为其分配一个初始优先级,并将其加入就绪队列。

- 进程执行:调度器从就绪队列中选择一个或多个进程,将它们分配给处理器执行。

执行过程中,进程可能因时间片用完或被阻塞而放弃处理器资源。

- 进程更新:调度器周期性地更新进程的优先级和状态,以反映其当前的执行情况。

- 进程退出:当进程完成执行或被终止时,调度器会将其从进程队列中移除。

3.调度策略和队列Linux调度器支持多种调度策略,如FIFO(先进先出)、SJF(短作业优先)和RR(时间片轮转)。

调度策略决定了进程在队列中的排列顺序,从而影响了调度器选择下一个进程的依据。

Linux中有两个主要的进程队列:就绪队列和运行队列。

就绪队列包含了所有等待处理器资源的进程,而运行队列则存放了当前正在执行的进程。

调度器会根据策略从就绪队列中选择一个或多个进程,将其加入运行队列。

4.进程优先级和调度算法Linux中的进程优先级是一个0-139的整数,优先级数值越低,进程获得处理器资源的机会越高。

linux下常见的调度策略及调度原理

linux下常见的调度策略及调度原理

linux下常见的调度策略及调度原理Linux是一种开源的操作系统,广泛应用于服务器和嵌入式设备中。

在Linux系统中,进程调度策略是操作系统的核心组成部分之一,它决定了进程的执行顺序和时间分配。

本文将介绍Linux下常见的调度策略及其调度原理。

在Linux系统中,常见的进程调度策略包括先来先服务(FCFS)、最短作业优先(SJF)、时间片轮转(RR)和优先级调度(Priority Scheduling)等。

先来先服务(FCFS)是一种简单而直观的调度策略,它按照进程到达的先后顺序进行调度。

即当一个进程到达系统时,它将被放入就绪队列的末尾,并等待CPU的分配。

当CPU空闲时,系统将选择就绪队列中的第一个进程分配给CPU执行。

这种调度策略的优点是公平性强,但缺点是无法处理长作业和短作业的差异,容易产生"饥饿"现象。

最短作业优先(SJF)调度策略是根据进程的执行时间来决定优先级的调度策略。

即系统会选择执行时间最短的进程先执行,以减少平均等待时间。

这种调度策略的优点是能够最大程度地减少平均等待时间,但缺点是可能会出现长作业等待时间过长的问题。

时间片轮转(RR)是一种基于时间片的调度策略,每个进程被分配一个固定长度的时间片。

当一个进程的时间片用完时,系统将把CPU分配给下一个进程。

这种调度策略的优点是能够有效地平衡进程之间的响应时间,但缺点是可能会导致频繁的上下文切换。

优先级调度(Priority Scheduling)是一种根据进程优先级来决定调度顺序的策略。

每个进程被分配一个优先级,优先级越高的进程越容易被调度执行。

这种调度策略的优点是能够根据不同进程的需求进行灵活调度,但缺点是可能会导致低优先级进程的"饥饿"问题。

在Linux系统中,调度算法的实现是通过内核的进程调度器来完成的。

内核中的调度器会根据不同的调度策略来选择下一个要执行的进程,并将其上下文切换到CPU中执行。

linux 线程优先级设置方法

linux 线程优先级设置方法

linux 线程优先级设置方法Linux操作系统中,线程是轻量级的进程,合理设置线程的优先级可以优化系统资源的分配,提高程序的执行效率。

本文将详细介绍Linux线程优先级的设置方法。

一、线程优先级概述在Linux操作系统中,线程优先级通常分为两种:静态优先级和动态优先级。

1.静态优先级:在创建线程时分配的优先级,通常在程序运行过程中不会改变。

2.动态优先级:系统根据线程的运行情况动态调整的优先级,通常与线程的CPU使用时间、等待时间等因素有关。

二、设置线程优先级的方法1.使用sched_setparam()函数设置静态优先级函数原型:```cint sched_setparam(pid_t pid, const struct sched_param *param);```示例代码:```c#include <stdio.h>#include <unistd.h>#include <sched.h>#include <pthread.h>void *thread_function(void *arg) {// 线程函数代码}int main() {pthread_t tid;struct sched_param param;int policy;// 创建线程pthread_create(&tid, NULL, thread_function, NULL);// 获取当前线程的调度策略和优先级pthread_getschedparam(pthread_self(), &policy, &param);// 设置优先级(数值越大,优先级越高)param.sched_priority = 30;// 设置线程优先级if (pthread_setschedparam(tid, policy, &param) != 0) { perror("pthread_setschedparam");return 1;}// 等待线程结束pthread_join(tid, NULL);return 0;}```2.使用nice()函数设置动态优先级函数原型:```cint nice(int inc);```示例代码:```c#include <stdio.h>#include <unistd.h>#include <sys/resource.h>int main() {// 获取当前进程的nice值int old_nice = nice(0);// 设置新的nice值(数值越小,优先级越高)if (nice(-10) == -1) {perror("nice");return 1;}// 输出新的优先级printf("New priority: %d", old_nice - 10);return 0;}```三、总结本文介绍了Linux线程优先级的设置方法,包括使用sched_setparam()函数设置静态优先级和使用nice()函数设置动态优先级。

linux设置多线程的调度策略与优先级

linux设置多线程的调度策略与优先级

linux设置多线程的调度策略与优先级⽬录1. Linux内核的三种调度策略1. SCHED_OTHER 分时调度策略2. SCHED_FIFO 实时调度策略,先到先服务。

⼀旦占⽤cpu则⼀直运⾏。

⼀直运⾏直到有更⾼优先级任务到达或⾃⼰放弃3. SCHED_RR 实时调度策略,时间⽚轮转。

当进程的时间⽚⽤完,系统将重新分配时间⽚,并置于就绪队列尾。

放在队列尾保证了所有具有相同优先级的RR任务的调度公平。

2. 线程的调度策略相关 API系统创建线程时,默认是 SCHED_OTHER。

如果我们要改变线程的调度策略的话,可以通过下⾯的这个函数实现。

#include <pthread.h>//set/get scheduling policy attribute in thread attributes objectint pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy);//attr: 线程属性的结构体指针//policy: SCHED_FIFO, SCHED_RR, and SCHED_OTHER3. 当前调度策略⽀持的优先级范围 API#include <sched.h>int sched_get_priority_max(int policy);int sched_get_priority_min(int policy);/*Supported policy values are SCHED_FIFO, SCHED_RR, SCHED_OTHER, SCHED_BATCH, SCHED_IDLE, and SCHED_DEAD‐LINE. Further details about these policies can be found in sched(7). Processes with numerically higher priority values are scheduled before processes with numerically lower priority values.Thus, the value returned by sched_get_priority_max() will be greater than the value returned by sched_get_priority_min().Linux allows the static priority range 1 to 99 for the SCHED_FIFO and SCHED_RR policies, and the priority 0 for the remain‐ing policies. Scheduling priority ranges for the various policies are not alterable.数字越⼤,线程的优先级越⾼。

linux内核进程cpu调度基本原理

linux内核进程cpu调度基本原理

linux内核进程cpu调度基本原理Linux内核的CPU调度基本原理是通过多任务处理,将CPU 时间片分配给不同的进程或线程来实现。

1. 调度策略:Linux内核支持多种调度策略,包括先来先服务(FCFS)、时间片轮转、优先级调度等。

默认的调度策略是时间片轮转调度策略,即每个进程被分配一个时间片,在时间片用完之后,将CPU切换到下一个就绪状态的进程上。

2. 就绪队列:内核会维护一个就绪队列,存放所有准备好运行但还未分配CPU时间的进程。

根据进程的优先级和调度策略,内核会从就绪队列中选择一个合适的进程来执行。

3. 进程优先级:每个进程都有一个优先级值,表示其重要性和紧急程度。

较高优先级的进程在调度时会获得更多的CPU时间。

Linux内核使用动态优先级调度策略,根据进程的历史行为和资源使用情况动态调整进程的优先级。

4. 时间片和抢占:时间片是CPU分配给进程的最小单位,当一个进程的时间片用完后,如果它还未完成,内核会将其置于就绪队列末尾,并将CPU分配给下一个就绪进程。

此外,Linux 内核支持抢占式调度,即当一个优先级更高的进程出现时,可立
即抢占当前运行的进程,将CPU资源分配给新的进程。

5. 实时进程:除了普通进程,Linux内核还支持实时进程。

实时进程具有更高的优先级和较小的延迟要求,它们得到更快的响应时间。

实时进程的调度算法相对于普通进程更加严格,以满足实时性要求。

Linux内核的CPU调度基本原理是通过就绪队列、进程优先级和时间片轮转等策略,将CPU时间动态地分配给不同的进程或线程,以完成多任务处理。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Linux内核之进程优先级
作者:harvey wang
邮箱:harvey.perfect@
新浪博客地址:/harveyperfect,有关于减肥和学习英语相关的博文,欢迎交流
注:本文参考的内核代码版本为3.3.5
在进程控制块定义中,如下,每个进程有4个优先级成员变量,往往给初学者造成一些困惑。

下面分实时进程和普通进程看看他们都用了哪些优先级?
struct task_struct{ 删除了无关的成员变量
int prio, static_prio, normal_prio;
unsigned int rt_priority;
}
实时进程的优先级
在调用函数sched_setscheduler()设置实时进程优先级时,最终调用了下面的函数
其中进程的rt_priority 就等于配置给进程的优先级,而进程的normal_prio=MAX_RT_PRIO-1 - p->rt_priority; p->prio =p->normal_prio; 即prio和normal_prio都与rt_priority成反比。

我们知道,在调度时使用了prio,其数值0对应最高优先级,99为最低实时优先级。

Prio 和normal_prio 数值越大优先级越小,而rt_priority的数值越大优先级越大。

这就是为什么有人说实时进程优先级数值越小优先级越高,也有人说实时进程优先级数值越大优先级越高的原因。

另外,实时进程只是用了四个优先级变量中的三个(prio、normal_prio和rt_priority),
而没有使用static_prio。

普通进程
在调用接口set_user_nice()设置普通进程的优先级时,读者可以自己顺着函数set_user_nice()查看下面的关系。

p->static_prio = NICE_TO_PRIO(nice);
p->prio = effective_prio(p); 即p->prio = p->static_prio;
p->normal_prio = p->static_prio 参见函数effective_prio(p);
结论是:非实时进程的static_prio、prio和normal_prio 一直保持相同。

另外,从函数effective_prio()来看,非实时进程的动态优先级等于其静态优先级。

内核不再动态修改其优先级。

相关文档
最新文档