Linux 进程优先级、切换与调度

【Linux】进程特性(重点讲解:进程优先级、进程切换、进程调度) 重点讲解进程优先级,进程如何切换,内核真实的调度算法 阅读详情

一台机器上同时有几百个进程,但 CPU 核心数远少于进程数。每个进程都认为自己应该继续执行,而操作系统必须在毫秒级做出选择:现在把 CPU 给谁?这个选择由优先级、调度器和上下文切换共同完成。

一、优先级解决的是“谁先运行”

1. 竞争、并发与并行

进程之间最直接的关系是竞争:CPU 资源有限,而可运行的进程很多。为了让竞争有秩序,内核给每个进程一个可比较的优先级,调度时优先照顾更重要的任务。

下面几个概念经常出现,先做个辨析:

概念关注点典型场景
竞争性多个进程争抢有限的 CPU一边编译代码,一边开视频会议
独立性每个进程有自己的地址空间和运行上下文一个进程崩溃,不影响另一个进程
并发一个 CPU 在多个进程之间快速切换单核机器上同时下载、播放音乐、编辑文档
并行多个 CPU 真正同时执行多个任务四核机器上四个线程同时计算

并发是“在一段时间内都向前走”,并行是“在同一时刻真的都在走”。单核机器上的多任务靠的是切换,切换得足够快,用户就会觉得它们在同时运行。

优先级只在竞争时才有意义。CPU 空闲时,优先级再高也不会让程序跑得更快,因为根本没有别的任务在抢。

2. 优先级不是权限

这两个概念很容易混淆,一定要辨析清楚:

维度优先级权限
回答的问题谁先获得 CPU能不能访问某个资源
主要依据nice 值、PRI、调度策略UID、GID、rwx、capabilities
调整方式nice、renice、setprioritychmod、chown、能力位
边界高优先级不能绕过权限检查权限高不自动获得更多 CPU

权限低的进程,仍然可以读取它本来就有权读取的文件;权限高的普通进程,也打不开自己没有权限的文件。Linux 在判断资源访问时,看的是进程携带的用户身份(UID),而不是它的调度优先级。

把这两件事分开,后面看 PRI、NI 和调度队列时就不容易串线。

二、PRI、NI 与 nice

1. ps 里的 PRI 和 NI

先看一个最常用的命令:

ps -l -p $$

输出大致如下,PID 会随环境变化:

F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000  4217  4216  0  80   0 -  2780 wait   pts/0    00:00:00 bash

这一行里,UID、PID、PPID、PRI、NI 最值得关注。和优先级直接相关的是两个字段:

  • NI:nice 值,表示进程优先级的修正量。
  • PRI:调度器使用的优先级显示值。数值越小,越早被调度。

PRI 不是权限,也不是进程的“重要程度评分”,它只是调度顺序的一个数字表示。

2. nice 是修正值,不是优先级本身

nice 的取值范围是 -20 到 19,一共 40 个级别。默认值是 0。

它的名字很形象:nice 值越高,进程对别的进程越“客气”,越愿意把 CPU 让出来,所以优先级越低;nice 值越低,进程越“不客气”,优先级越高。

在常见的 ps 显示口径下,普通进程的基准优先级可以写成:

PRI = 80 + nice

如果把 80 看作基准值,也可以写成 PRI(new) = PRI(old) + nice。这里的 PRI(old) 是基准优先级,不是上一次 renice 之后的结果。重复执行 renice 是覆盖 nice 值,不是把差值一次次累加。

不同的工具会用不同的刻度显示同一个调度倾向:

显示或内核口径nice = 0nice = -20nice = 19说明
ps -l 的 PRI806099常见的 procps 显示方式,80 + nice
内核普通优先级120100139O(1) 调度队列的下标,120 + nice
top 的 PR20039另一套显示口径;实时任务可能显示为负值

表里这三套数字不一样,方向是一致的:数值越小,优先级越高。写监控脚本时,不要把 top 的 PR 和 ps 的 PRI 直接放在一起比较,它们不是同一把尺子。调度器最终比较的,是 task_struct 里的整数字段;ps 和 top 只是把这些字段翻译成不同的显示口径。

ps 自己的不同输出格式也可能换刻度:ps -l 常见的是 80 基准,ps -o pri 可能给出另一组值。看到 PRI 列时先确认命令用的是哪种格式,不要跨格式套 80 + nice。

内核内部还可能根据任务的睡眠和运行行为做动态修正,但用户设置的 nice 始终是基准修正量。这种修正通常有上限,否则进程可以靠刻意睡眠、唤醒来操纵自己的优先级。不同内核版本的动态规则不同,看调度行为时要以对应版本的实现为准。

3. 优先级范围与饥饿

在 ps 的普通进程口径下,PRI 落在 60 到 99 之间,对应 nice 的 -20 到 19。内核队列里则是 100 到 139。两套刻度各有 40 个级别,数值上相差 40。

优先级差距过大时,低优先级进程可能长时间抢不到 CPU,这就是进程饥饿。

nice 只是一种“偏向”,不是硬实时保证。把普通进程的 nice 调到 -20,也不会把它变成实时任务。实时策略(如 SCHED_FIFO、SCHED_RR)使用另一段优先级区间,实时任务会排在所有普通任务之前。除非确实需要低延迟保障,否则不要用极端 nice 值去模拟实时行为,容易把系统里其他任务饿死。

三、查看与调整优先级

1. 用 ps 和 top 观察

查看某个进程的 nice 和 PRI:

ps -l -p 4301

持续观察:

top -p 4301

top 里的 PR 是优先级显示值,NI 是 nice 值。默认普通进程通常显示 PR = 20、NI = 0,这和 ps 的 80 是两套刻度。

在 top 里按 r,输入进程 PID,再输入新的 nice 值,就可以调整已有进程,效果等同于执行一次 renice。

2. 用 nice 和 renice 调整

启动一个新进程时直接指定 nice:

nice -n 10 ./cpu_task

nice -n 10 表示以 nice 10 启动,优先级比默认值低。适合编译、备份、批处理这类“可以慢一点,但别挡住交互”的任务。

调整已经运行的进程:

renice -n 5 -p 4301

正数表示降低优先级。要调高优先级,需要负的 nice 值:

sudo renice -n -5 -p 4301

普通用户通常只能把 nice 调大,也就是主动降低优先级;把 nice 调小需要 root 或 CAP_SYS_NICE 能力,某些环境还会受到 RLIMIT_NICE(资源限制)的约束。把 nice 从 0 调到 10 后,普通用户一般不能自己再调回 0。

renice 也可以按进程组或用户批量操作,分别使用 -g 和 -u。批量调整前先确认影响范围,尤其是不要把系统服务一起降权。

3. 用系统调用读取和设置

需要在程序里读取或设置 nice,可以使用 getpriority 和 setpriority:

#include <sys/resource.h>
#include <errno.h>
#include <stdio.h>

int main(void)
{
    errno = 0;
    int prio = getpriority(PRIO_PROCESS, 0);
    if (prio == -1 && errno != 0) {
        perror("getpriority");
        return 1;
    }
    printf("nice = %d\n", prio);

    if (setpriority(PRIO_PROCESS, 0, 10) == -1) {
        perror("setpriority");
        return 1;
    }
    return 0;
}

编译并运行:

gcc -Wall -Wextra -o prio_demo prio_demo.c
./prio_demo

几个参数的含义:

  • which 可以是 PRIO_PROCESS、PRIO_PGRP 或 PRIO_USER,分别表示按进程、进程组、用户操作。
  • who 为 0 时表示当前进程、当前进程组或当前用户。
  • getpriority 返回的是 nice 值,不是 ps 里的 PRI。不要拿返回值和 80 直接比较。
  • getpriority 失败时返回 -1,但合法的 nice 值也可能是 -1,所以调用前要把 errno 清零,返回后再检查 errno。

把 nice 调大通常不需要特权;把 nice 调小、提高优先级,仍然需要相应的权限。

官方手册对这两个接口的返回值和错误码写得很清楚,可以查阅 getpriority(2)。

4. 调整优先级的边界

nice 只影响 CPU 时间的竞争,不解决 I/O 瓶颈。磁盘读写慢、网络等待长,调 nice 没有用,这时要看 I/O 优先级或存储本身的吞吐。I/O 优先级是另一套机制,效果还取决于所使用的 I/O 调度器。

在容器里,nice 还要和 cgroup(控制组)的 CPU 权重、配额一起看。容器内把进程调成高优先级,不会突破上层设置的 CPU 限额;它只是改变同一控制组内的竞争顺序。

另外,负 nice 值不是“性能开关”。一个 CPU 密集型任务即使拿到最高普通优先级,也只是在竞争时更早、更频繁地拿到 CPU,不会提高单核本身的计算速度。真正需要低延迟时,应该考虑实时调度策略,并同时评估它对系统其他任务的影响。

四、进程切换:保存一份,恢复另一份

在这里插入图片描述

1. 时间片让 CPU 能被收回

普通的现代分时系统中,一个进程即使写了死循环,也不会永远占着 CPU 不放:

int main(void)
{
    for (;;) {
    }
}

这段程序会一直处于可运行状态,但内核会在时钟中断到来时检查它是否已经用完时间片。时间片到了,就把 CPU 收走,换另一个任务运行。死循环进程会让一个核心跑满,但不会让整台机器失去响应。

触发切换的常见情况有三类:

  • 当前任务的时间片用完。
  • 当前任务主动阻塞,例如等待 I/O、睡眠或获取锁。
  • 一个更高优先级的任务被唤醒,内核决定立即抢占。

2. 上下文里有什么

CPU 的寄存器只有一份,但每个进程都有自己的“寄存器快照”。切换时保存的是 CPU 当前正在使用的硬件状态,不是整个进程的内存:

  • 程序计数器 PC,在 x86-64 上是 RIP,指向下一条要执行的指令。
  • 栈指针 SP,指向当前用户栈或内核栈。
  • 通用寄存器,例如 RAX、RBX、RCX、RDX。
  • 标志寄存器,保存条件码和控制位。
  • 浮点、SIMD 等扩展状态,按需保存。
  • 地址空间相关状态,例如页表基址寄存器 CR3。

可以把 CPU 想成一间只能坐一个人的办公室,寄存器是一张张桌子,寄存器中的内容就是桌面上正在摊开的纸。进程 A 被换下时,要把这些纸收进 A 自己的文件袋;进程 B 上来时,再把 B 的文件袋摊开。桌子只有一张,文件袋可以有很多个。

3. 保存到哪里

进程的上下文,即各类寄存器的现场,主要保存在被换出任务自身的内核栈中。任务被换出时,内核将返回地址和部分寄存器压入该任务的内核栈,待该任务再次被调度时再从栈中恢复。

task_struct 中用于保存上下文的 thread_struct 并不存放这些通用寄存器,它只记录若干用于定位现场的字段,其中最重要的是内核栈指针 sp(指向上述内核栈),此外还有 FPU 浮点寄存器状态等。

简言之:通用寄存器的现场保存在内核栈上,内核栈的位置与浮点状态则由task_struct 中的 thread_struct 记录。

早期 x86 提供硬件任务切换机制,任务状态段 TSS 中保存任务的部分上下文,Linux 0.11 的 task_struct 中即可看到 tss_struct。现代 Linux 改用软件方式完成上下文切换,TSS 仍然保留,但主要用于在用户态切换到内核态时提供内核栈指针,已不再用于保存通用寄存器现场。

内核通过 current 宏获取当前正在运行的 task_struct。调度器选出下一个任务后,将 current 切换到新任务,再恢复其现场。

4. 切换的成本

直接成本包括保存和恢复寄存器、更新调度器数据结构、加锁,以及切换地址空间。间接成本往往更大:新任务的工作集可能不在 CPU 缓存里,页表和 TLB(地址转换缓存)可能需要更新,分支预测器也要重新适应。切换越频繁,这些“重新热身”的开销越明显。

可以用 GNU time 观察一个程序被切换了多少次:

/usr/bin/time -v ./cpu_task

如果提示找不到 /usr/bin/time,需要安装 GNU time 包;shell 内置的 time 不提供 -v 选项。输出里有两行值得看:

  • Voluntary context switches:任务主动让出 CPU,通常是因为睡眠、等待 I/O 或阻塞。
  • Involuntary context switches:任务并不想走,但被时间片或更高优先级任务抢占了。

这两个数字能帮助判断切换主要来自阻塞还是抢占,具体数值会随负载变化。上下文切换不是越少越好:切换太少,交互延迟变差;切换太多,吞吐量被开销吃掉。调度器做的就是在这两者之间找平衡。

五、O(1) 调度器:常数时间挑出下一个进程

下面讨论的是 Linux 2.6 早期使用的 O(1) 调度器。它在 2.6.23 之后被 CFS(完全公平调度器)取代,更新的内核又转向 EEVDF(Earliest Eligible Virtual Deadline First)。现代生产内核里不会直接看到这套数组,但它把“优先级队列 + 位图 + 活动/过期双数组”组织得很清楚,仍然是理解调度器设计的好样本。

1. 每个 CPU 一个 runqueue

O(1) 调度器为每个 CPU 维护一个运行队列,结构体叫 rq。几个主要字段是:

struct rq {
    unsigned long nr_running;
    struct task_struct *curr, *idle;
    struct mm_struct *prev_mm;
    struct prio_array *active, *expired, arrays[2];
    int best_expired_prio;
    /* ... */
};

nr_running 记录可运行任务的数量,curr 是当前任务,idle 是空闲任务。active 和 expired 分别指向活动数组和过期数组,arrays[2] 是把这两个数组放在一起的存储。

每个 CPU 自己维护队列,可以减少多核之间的锁竞争。多个 CPU 之间还要做 SMP(对称多处理)负载均衡,否则会出现一个 CPU 忙得排队、另一个 CPU 空闲的情况。负载均衡、任务迁移这些细节不在本文展开,但它们是“每个 CPU 一个 runqueue”带来的直接问题。

2. 140 个优先级队列

优先级数组 prio_array 的核心是一个长度为 140 的队列数组:

struct prio_array {
    unsigned int nr_active;
    DECLARE_BITMAP(bitmap, MAX_PRIO + 1);
    struct list_head queue[MAX_PRIO];
};

queue[140] 的每个元素是一条链表的头。数组下标就是优先级,相同优先级的任务按 FIFO(先进先出)挂在这条链表上。调度时取链表头的任务,入队时挂到链表尾。

这 140 个下标分成两段:

  • 0 到 99:实时优先级,普通进程不参与。
  • 100 到 139:普通优先级,普通进程在这里竞争。

普通任务的队列下标由 nice 值决定:

static_prio = 120 + nice

nice 为 -20 时下标是 100,nice 为 19 时下标是 139。nice 越小,下标越小,越早被调度器看到。

3. bitmap:先找队列,再找任务

如果每次都从 queue[0] 开始逐个检查 140 个队列,虽然上限固定,但常数仍然偏大。O(1) 调度器用一张位图来加速:

  • 每一位对应一个优先级队列。
  • 位为 1 表示队列非空,为 0 表示空。
  • 找到第一个为 1 的位,就找到了当前最高优先级的非空队列。

在 32 位内核上,bitmap[5] 是 5 个 32 位字,一共 160 位,足够覆盖 140 个优先级。查找第一个置位可以用 sched_find_first_bit 之类的原语完成,不需要逐条遍历任务链表。

这里要区分两个“常数”:

  • 扫描 140 个队列的上限是固定的,本来就是 O(1)。
  • 位图把查找成本进一步压低,而且查找成本不随可运行进程数量增长。

O(1) 描述的是挑选成本与任务数量无关:100 个任务和 10000 个任务,调度器都只需要在位图里找第一个非空队列,然后取链表头。

4. active 和 expired

prio_array 有两份,一份是活动数组,一份是过期数组:

  • 活动数组里的任务还有剩余时间片,可以被调度。
  • 过期数组里的任务时间片已经用完,等待下一轮。

当活动数组中的任务逐渐被处理完,过期数组会越来越满。等活动数组空了,内核只要交换 active 和 expired 两个指针,原来的过期数组就变成了新的活动数组:

swap(active, expired);

这不是把 140 条链表整体搬过去,只是交换两个指针。换入的任务会重新计算时间片,获得下一轮运行机会。

在这里插入图片描述

这种双数组设计让“用完时间片的任务”和“还有时间片的任务”自然分开。调度器不需要在每个任务上反复计算“是否还有配额”,只要看两个数组的状态即可。

5. 为什么叫 O(1)

把一次调度拆开看:

  1. 从当前 CPU 的 rq 里取活动数组。
  2. 在 bitmap 中找第一个置 1 的位。
  3. 取对应 queue 的链表头。
  4. 如果选中任务不是当前任务,进入上下文切换。

入队和出队都是链表操作,查找队列是位图操作,整个过程不随可运行任务数量线性增长,所以被称为 O(1) 调度算法。

但 O(1) 不等于零成本。调度器仍然要加锁、维护 nr_running、处理优先级变化、做 SMP 负载均衡,还要在时间片用完时把任务从活动数组移到过期数组。O(1) 描述的是“选择下一个任务的算法复杂度”,不是整个系统的开销。

6. 历史定位与局限

O(1) 调度器在 Linux 2.6 早期解决了当时调度器在进程数量增大时变慢的问题。它需要根据任务的睡眠和运行行为判断“交互性”,并给交互型任务一定的优先级补偿。这些启发式规则在负载变化时容易判断失误,公平性和延迟之间的平衡也不够理想。

Linux 2.6.23 引入了 CFS,用虚拟运行时间和红黑树来维护可运行任务,选择下一个任务的复杂度变成 O(log n),但公平性更好。更新的内核使用 EEVDF。今天在 ps 或 top 里仍然能看到 PRI 和 NI,但背后的调度器已经不再是这套 140 个队列的数组。在 CFS 里,nice 主要折算成权重,影响的是 CPU 份额,而不是 O(1) 那种固定队列的先后顺序。

可以把 O(1) 调度器当作一个经典样本:它把“优先级如何映射到队列”“如何用位图快速找最高优先级”“如何用双数组处理时间片”讲得很直观。理解这些结构,再去看 CFS 的红黑树,会容易很多。CFS 的设计和调度模型可以参考 内核调度文档。

六、把三件事串起来

现在把优先级、调度和切换放回同一条时间线上:

  1. 进程 A 正在 CPU 上运行,它的寄存器现场装在 CPU 里。
  2. 时钟中断到来,A 的时间片用完;或者 A 阻塞,或者更高优先级的 B 被唤醒。
  3. 内核进入调度器,在当前 CPU 的 runqueue 里找下一个任务。
  4. 调度器通过位图找到最高优先级的非空队列,取出链表头的 B。
  5. 内核保存 A 的现场,恢复 B 的现场,返回用户态;A 进入过期队列或等待队列。

优先级决定 A 和 B 在队列里的位置,调度器决定这次选谁,上下文切换负责把 CPU 真正交出去。三者配合,才有了“多个进程同时推进”的效果。

七、几个容易混淆的点

  • nice 不是优先级本身。 nice 是修正值,PRI 是显示值,内核队列下标又是另一套刻度,三者方向一致但数值不同。
  • 优先级不是权限。 高优先级进程不能绕过文件权限,低优先级 root 进程也不会因为 nice 高就失去权限。
  • 进入内核不等于发生切换。 系统调用和中断可能只是内核处理完再返回原任务;只有选中另一个任务才需要保存和恢复上下文。
  • O(1) 只描述选择任务的复杂度。 真实调度仍有锁、缓存和负载均衡的开销;现代内核也已经改用 CFS 和 EEVDF。
  • 高优先级不等于实时。 普通进程的 nice 范围只有 -20 到 19,实时任务是另一套调度策略和优先级区间。

END

【Linux】-进程概念之进程优先级(如何去进行调度以及进程切换),还不进来看看?? 关于tast_struct属性中的优先级,以及cpu是如何根据优先级去调度进程的,以及进程是怎么切换的。 阅读详情

相关推荐

win11下的MySQL安装

目前官方最新版本是8.0.26,考虑到其稳定性、可靠性还需一定周期保证,所以使用官方版求稳定仍然建议5.7系列。3、选择MySQL Servers 5.7.38 -x64,然后按绿色箭头将选中的版本移植到右边选中框中。4、点击下方蓝色Advanced Options,选择安装位置。1、在开始界面搜索MySQL,点击command line。4、在“系统变量”中选择“path”,点击编辑。5、新建——>增加MySQL路径——>确定,12、execute,安装好后next。9、不需要做修改,直接点击next。.

rensweet的博客 2万+

【Linux】探索进程优先级的奥秘,解锁进程的调度与切换

本文主要讲解了关于Linux进程优先级和进程调度与切换相关知识

可涵的博客 3871

从硬件到软件:深度解析D435i USB SCP overflow错误的根源与解决方案

本文深入解析Intel RealSense D435i相机在ROS环境下常见的'USB SCP overflow'错误,特别是与`control_transfer`相关的错误提示。从硬件配置到软件优化,详细介绍了如何通过调整USB接口、优化`rs_camera.launch`参数、更新固件驱动等方法解决数据传输溢出问题,提升设备稳定性和性能。

yy01234的博客 768

【Linux学习】Linux进程优先级与进程调度与切换

【Linux学习】Linux进程优先级与进程调度与切换

2301_77509762的博客 1040

Multisim14.0仿真(五十九)基于74LS161的24进制计数器应用设计

它具有同步预置、异步清零功能,支持并行数据加载,并可在计数使能控制下进行二进制计数。:低电平时,在下一个时钟上升沿加载输入数据(A, B, C, D)。(多个 74LS161D 串联构成 8 位、12 位等更长计数器)。低电平时,下一个时钟上升沿加载输入数据(A, B, C, D)。:低电平有效,立即清零计数器(不受时钟控制)。均为高电平时,每个时钟上升沿计数。:两者均为高电平时,计数器才能递增。:立即清零计数器(不受时钟控制)。(通过预置初始值控制计数范围)。(计数范围:0 ~ 15,即。

corlin6688的博客 4758

基于特征模仿的YOLOv5中间层知识蒸馏:原理、实现与实验全解析

目标检测中的模型轻量化是一个关键挑战。本文提出一种基于特征模仿(Feature Imitation)的YOLOv5中间层知识蒸馏方法,通过让学生模型学习教师模型的中间层特征表示,显著提升轻量级检测器的性能。我们将详细阐述蒸馏损失函数的设计、特征对齐策略、训练流程,并提供完整可运行的代码实现。同时,推荐多个适合蒸馏训练的数据集,并通过实验验证方法的有效性。

YOLO 185

【Linux】进程优先级&&进程切换&&进程调度

在Linux的世界里,CPU调度员就像是一位超级能干的“指挥官”👮,它管理着一个繁忙的“工作车间”——runqueue(运行队列)。这个车间里有一个神奇的工具:prio_array(优先级数组),它就像是一个智能的“任务分配器”。

2401_83251330的博客 1206

SPICE仿真软件:HSPICE_(22).HSPICE仿真案例分析

通过上述案例分析,我们可以看到HSPICE仿真软件在不同电路类型和仿真场景中的应用。无论是简单的直流分析、交流分析还是复杂的暂态分析,HSPICE都能提供详细的仿真结果,帮助我们更好地理解和优化电路设计。希望这些案例能够为读者提供实用的参考和指导,进一步提升使用HSPICE进行电路仿真的能力。输入文件的编写:确保输入文件格式正确,使用注释来解释每一部分的内容。分析类型的选择:根据电路的特点选择合适的分析类型,如.DC.AC和.TRAN。输出结果的设置:使用.print命令来指定需要输出的节点电压和支路电流。

kkchenjj的博客 1305

【Linux】进程优先级、进程切换、进程调度

进程优先级、进程切换、进程调度

2203_76003626的博客 765

《QGIS快速入门与应用基础》079:KML/KMZ格式:Google Earth兼容

KML/KMZ是专为地理可视化设计的空间数据格式,原生兼容Google Earth,支持点线面要素标注与多媒体集成。KML为XML文本格式,KMZ是其压缩版本。该格式优势在于可视化表现力强、跨平台共享便捷,适合地理标注、路线分享等场景,但存在属性支持弱、大数据量处理效率低等局限。QGIS中可便捷加载和导出KML/KMZ数据,需注意编码设为UTF-8、勾选"导出样式"以保留可视化效果。建议中小规模标注数据使用KMZ格式,确保关联资源完整,提升共享效率。

LuckyHanMo的博客 762

uniApp微信小程序:利用live-pusher人脸活体检测功能+完整示例代码,uniapp使用live-pusher直播推流组件实现人脸验证-活体检测,检测人脸中的动作包括眨眼、张嘴、左右摇头动作

UniApp 使用 live-pusher 实现人脸活体检测(附完整源码)uniapp开发微信小程序人脸检测活体检测,在uni-app的微信小程序项目中使用live-pusher实现人脸识别,uniapp使用live-pusher实现模拟人脸识别效果,张张嘴、眨眨眼、向左摇头、向右摇头等动作,免费使用人脸活体检测的插件方案,uniapp小程序怎么免费使用人脸活体,直播推流,UNIAPP微信小程序使用live-pusher实现人脸识别(拍照)功能,在uni-app项目中实现人脸识别,既使用uni-app中的l

✅ 精选推荐文章 3013

【Linux】进程4——进程优先级,进程的调度与切换

那是因为如果不加限制,如果恶意将自己的优先级调整的非常高,而给其余人的优先级调整的非常低(优先级较高的进程先享受CPU的资源),那些系统开启自启动的进程也就是正常系统进程很难再享受到CPU的资源,会变得卡顿。这样的情况叫做进程饥饿。任何的分时操作系统在调度上都要保证较为公平的调度。

2301_80224556的博客 2015

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Linux:进程优先级、切换和调度

进程优先级、切换、调度相关知识

2401_84784737的博客 1602

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Linux:进程优先级 进程调度切换 调度算法

在active队列中,执行时间到达时间片的进程会放到expired指向的队列,而新进程也会放到expired指向的队列,那么说明active指向队列中的进程结构体对象,只会越来越少。做了这个操作后,CPU通过current指针找到新进程的代码,覆盖掉原来的ir寄存器的指令,重新计算pc指针的地址,写入新地址。上图是runqueue结构体内部的变量,其中又包含一个queue结构体对象,queue结构体中有task_struct结构体指针数组,里面的元素用于指向进程的task_struct对象。

2301_79171011的博客 1368

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Linux系统之进程的优先级,调度与切换

1)优先级范围在Linux系统中,普通用户进程的优先级范围是60到99,一共40个级别。数值越小,表示进程的优先级越高。默认情况下,进程的优先级是80。2)原因这个范围限制是为了保持系统调度的公平性,防止用户随意将进程的优先级设置得过高或过低,从而避免进程饥饿问题。(这也是为什么NI值有范围的原因,那么为什么NI值的范围为【-20,19】之间,则在下述的系统调度展开说明)防止饥饿:通过限制普通进程的优先级范围,确保系统中的每个进程都有机会获得CPU资源,避免某些进程因优先级过低而长时间无法执行。

mkw141124的博客 1130

【Linux系统编程】进程优先级,进程切换与进程调度

• bitmap[5]:一共140个优先级,一共140个进程队列,为了提高查找非空队列的效率,就可以用5*32个比特位表示队列是否为空,这样,便可以大大提高查找效率!nice值得取值范围:[-20,19],而默认优先级(PRI)是80,所以进程优先级的范围就是[60,99]并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。可是活动队列上的进程会越来越少,过期队列上的进程会越来越多,因为进程时间片到期是一直都存在的。

2401_82677021的博客 861

【Linux】进程的优先级及linux下进程的调度于切换

优先级决定了进程享受资源的前后,如果进程的优先级很小,调度器cpu在短时间内较大概率会频繁的调度这个进程,导致调度不太平衡,导致优先级高的优先得到资源,后续还有源源不断的进程产生,最后会导致常规进程很难得到cpu资源,意味着这个进程很长时间不被调度,作为一个要运行的进程,变得很卡顿,而其他优先级高的进程很快就跑完了,所以,这种情况称之为“进程饥饿”,就像去打饭长由于被插队长时间打不到饭。为什么需要运行队列,cpu只有一个。当前进程的信息都在寄存器保存,如果进程运行时间片到了,进程切换时,将临时数据带走,

m0_71503225的博客 1257

【Linux系统】—— 进程切换&&进程优先级&&进程调度

本文介绍了Linux系统中的进程切换、进程优先级和进程调度机制。主要内容包括:1)进程切换通过保存和恢复CPU寄存器中的上下文数据实现,确保进程在时间片耗尽后能被公平调度;2)进程优先级决定了获取CPU资源的顺序,数值越小优先级越高;3)Linux采用分时调度机制,通过时间片分配保证系统公平性。文章还通过生活实例解释了进程切换的原理,并演示了如何查看进程优先级信息。

yusjushd的博客 1134

《linux篇》进程优先级、进程切换、进程调度

进程的优先级,包括nice值、进程切换、进程调度,包括O(1)调度算法等等

qq_59702185的博客 675

【Linux】详谈进程优先级&&进程调度与切换

详谈进程优先级&&进程调度与切换

m0_74265792的博客 1790

Linux——进程优先级/切换/调度

进程优先级 进程切换详细内容 Linux内核进程O(1)调度 一看就理解

unlockjy的博客 849

探秘 Linux 进程:优先级、调度与切换的精妙机制

本文深度剖析了 Linux 进程管理中的关键机制。进程优先级决定了进程获取 CPU 资源的先后顺序,其数值越小越易获得资源,通过调整 nice 值可改变优先级 。Linux 内核调度算法采用双队列架构、位图定位机制和双指针切换策略,保障进程有序运行和系统高效调度。进程具有竞争性、独立性,并行与并发是多任务处理的不同策略。CPU 寄存器与进程数据交互密切,进程切换时会保存和恢复上下文数据到 PCB。这些机制协同工作,支撑 Linux 系统稳定运行,对理解系统原理和优化性能意义重大。

A Charmer 的博客 1814

Linux系统之----进程优先级、调度与切换

在Linux系统中,普通用户进程的优先级范围是60到99,一共40个级别。数值越小,表示进程的优先级越高。默认情况下,进程的优先级是80。2)原因这个范围限制是为了保持系统调度的公平性,防止用户随意将进程的优先级设置得过高或过低,从而避免进程饥饿问题。这也是为什么NI值设置在【-20,19】之间的原因在系统当中查找⼀个最合适调度的进程的时间复杂度是一个常数,不随着进程增多而导致时间成本增加,我们称之为进程调度O(1)算法!

2401_85878549的博客 998

【Linux】进程状态、进程优先级、进程切换和调度

本文详细介绍了计算机系统中的进程管理相关内容。首先讲解了冯诺依曼体系结构,指出CPU只能访问内存这一关键特性。接着阐述了操作系统的核心作用,即管理硬件资源和为程序提供执行环境。重点介绍了进程的概念,包括PCB(进程控制块)、task_struct数据结构以及如何组织进程。通过实例演示了查看进程信息、获取进程标识符pid/ppid的方法,并详细讲解了fork系统调用的使用,包括创建子进程和父子进程分流处理。文章通过代码示例和命令行操作展示了进程管理的核心概念与实践方法,为理解操作系统进程管理机制提供了实用指导

2301_79601095的博客 1060

【Linux】进程状态、优先级、切换和调度

操作系统的资源有限,我们的需求无限!在一对多的情况下要得到某种资源需要区分先后顺序。

m0_71199350的博客 841
上一篇: Linux进程概念入门:程序、PCB与fork
下一篇: Linux 进程状态:R、S、D、T、Z 与僵尸孤儿进程
jinyishu_
博客等级 码龄1年 53粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值