Linux 系统中的优先级

622 阅读8分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情

一、Linux 系统中的优先级

💦 基本概念

  这里我们已经在上面说过了,就不谈了。

💦 PRI and NI

通过ps -al查看当前进程相关信息:

在这里插入图片描述

  1. PRI 比较好理解,即进程的优先级,或者通俗点说就是程序被 CPU 执行的先后顺序,此值越小,进程的优先级别越高。

  2. NI 就是我们所要说的 nice 值了,其表示进程可被执行的优先级的修正数值。

  3. PRI 值越小越快被执行,那么加入 nice 值后,将会使得 PRI 变为:PRI(new) = PRI(old) + nice,这里的 old 永远是 80,下面解释。

  4. 当 nice 值为负值的时候,那么该程序优先级值将变小,其优先级会变高,则越快被执行;当 nice 值为正值时,意味着你要调低优先级。所以调整进程优先级,在 Linux 下,就是调整进程 nice 值。

  5. nice 其取值范围是闭区间 -20 至 19,一共 40 个级别 —— -20 至 0,0 至 19。

  6. PID 是当前进程的专属标识;PPID 是当前进程的父进程的专属标识;TTY 可以理解为终端设备;CMD 是当前进程的命令。

  7. UID 是执行者的身份。

    ll后,其中可以看到我:

    在这里插入图片描述

    ll -n,就可以看到我的 ID:

    也就是说在 Linux 中标识一个用户,并不是通过用户名,而是通过用户的 UID。比如 qq 里,每人都有一个昵称,如果昵称可以随便改的话,就意味着昵称不是标识你的唯一方式,而是通过 qq 号码来唯一标识你。所以对于操作系统来说,当你新建用户时,除了你自己给自己起的名称之外,还有操作系统所分配给你的 UID。原因是因为计算机比较擅于处理数据

    在这里插入图片描述

    所以可以看到这里的进程是我启动的:

    在这里插入图片描述

饥饿问题 ❓

  Linux 中的优先级由prinice值共同确定。Linux 优先级的特点,对于普通进程,优先级的数值越小,优先级越高;优先级的数值越大,优先级越低。但是优先级不可能一味的高,也不可能一味的低,比如说优先级最高的是 30,最低的是 99,那么我们不可以把最高搞成 -300,最低搞成 999。为啥优先级能设置,但不能很夸张的设置,是因为即使再怎么优先,操作系统的调度器也要适度的考虑公平问题,比如我把 A进程优先级搞到 -300,对我来讲,A进程老是得到资源,别人长时间得不到资源,这种就叫饥饿问题。好比你在打饭窗口排着队呢,老是有些人觉得自己优先级高往前插队,那么你就长时间打不到饭,导致最后吃不到饭。所以 CPU 也是有度的来根据优先级调度。

其中 pri 的优先级是多少就是多少,但实际上 Linux 的优先级是可以被修正的,nice 值就是优先级的修正数据 [-20 ~ 19],其中 -20 优先级最高,19 优先级最低。

💦 PRI vs NI

  1. 需要强调一点的是,进程的 nice 值不是进程的优先级,他们不是一个概念,但是进程 nice 值会影响到进程的优先级变化。
  2. 可以理解 nice 值是进程优先级的修正数据。

💦 调整优先级

ps -al查看当前进程优先级:

在这里插入图片描述

top命令查看所有进程相关信息:

在这里插入图片描述

r命令后输入要调整的 pid:

在这里插入图片描述

给 27598 进程 Renice 要调整的 nice 值:

在这里插入图片描述

ps -al验证:

在这里插入图片描述

继续调整时,它不让我调了:

在这里插入图片描述

sudo top提升权限进行调整:

在这里插入图片描述

ps -al验证:

之前第一次调整后的优先级是 93,随后第二次调整后的优先级应该是 103,但是却是 90 ❓

  其中我们在 Linux 中进行优先级调整时,pri 永远是默认的 80,也就是说即使你曾经调整过 nice 值,当你再次调整 nice 值时,你的优先级依旧是从 80 开始的,也就是说PRI(new) = PRI(old) + nice 中的 old 永远是 80,这个现象很奇怪哈,我们继续往下走。

在这里插入图片描述

上面说每次调整优先级永远是从 80 开始,上面又说 nice 值的最小值是 -20,意味着 nice 值是 -100,不会真正的设置到 -100,而是设置成了 nice 值的最小值 -20:

在这里插入图片描述

ps -al验证:

我们发现最小的 nice 值就是 -20,而它的优先级最高只能到 60。

在这里插入图片描述

继续往下走,瞅瞅它的优先级最低是多少:

所以此时调整后的优先级是 99。

在这里插入图片描述

ps -al验证:

我们发现最大的 nice 值就是 19,而它的优先级最高只能到 99。

在这里插入图片描述

每次我们重新计算新的优先级时, old 为啥默认都是 80 ❓

  其一,有一个基准值,方便调整。你都想调整了,意味着你不想要老的优先级,那么我给你一个基准点,下次就方便许多了,否则你每次调整之前,还得先查一下当前进程现在的优先级。   其二,大佬并不想让我对对一个进程的优先级设置的很高或很低,old 每次都是 80,同时 nice 值区间是 [-20, 19],最终你的优先级区间 [60, 99],这样的设计,成本不高。

nice 值是 [-20, 19],意味着当前的 nice 值是一种可控状态,为啥 ❓

  也就意味着这个值,你可以往大了设置,也可以往小了设置。进程是被操作系统调度的,如果可以让一个用户按他的需求去定制当前进程的优先级,比如我把我的进程优先级搞成 1,其它进程优先级搞成 10000,那么这样调度器就没有公平可言了。所以本质是操作系统中的调度器要公平较高效的调度,这是基本原则。

调度器的公平 ???

  这里不是指平均。有多个进程,不是说我现在给你调度了 5 毫秒,就一定要给其它进程都调度 5 毫秒。而必须得结合当前进程的特性去进行公平调度的算法。所以这里的公平可以理解为我们是尽量的给每个进程尽快、尽好的调度,尽量不落下任何一个进程,但并不保证我们在同一时间上启动的所有进程在调度时间上完全一样,而只能说是大致一样,因为调度器是服务计算机上所有进程的。

【写在后面】

  1. 可以看到 Linux 它的进程状态,一会僵尸,一会孤儿,感觉 Linux 操作系统很惨的样子。实际上后面我们还会再学一种守护进程(精灵进程)

  2. 如果一个进程是 D 状态是不能 kill -9 的;但如果一个进程是 Z 状态,那么它能 kill -9 吗 ❓

      如果一个人已经死了,你上去踢它两脚,有用吗 ?所以一个进程是 Z 状态,你去 kill 它是杀不掉的。

  3. [ 面试题 ]:什么 样的进程杀不死 ❓

      D 状态进程 and Z 状态进程。因为一个是在深度休眠,操作系统都得叫大哥,一个是已经死了。

  4. 并行:多个进程在多个 CPU 下分别,同时运行,这称之为并行。

  5. 并发:多个进程在一个 CPU 下采用进程切换的方式,在一段时间内,让多个进程都得以推进,这称之为并发。

  6. 独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰。独立性也是操作系统设计进程的一个原则,不管你是 Linux、Windows、Macos、Android 都需要遵守,代码共享,数据各自私有就是为了实现独立性原则。 在这里插入图片描述 此时可以看到子进程 5 秒后报错退出后并不会影响父进程: 请添加图片描述

  7. 竞争性:系统进程数目众多,而 CPU 资源少量,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级。你现在为什么正在看我的文章呢,根本原因就是因为社会大环境里需要竞争,而你需要提升自己的竞争力和优先级。