Linux系统编程·进程优先级

发布于:2022-11-09 ⋅ 阅读:(11) ⋅ 点赞:(0) ⋅ 评论:(0)

在这里插入图片描述

你好,我是安然无虞。

自学网站

推荐给老铁们两款学习网站:
面试利器&算法学习:牛客网
风趣幽默的学人工智能:人工智能学习
首个付费专栏:《C++入门核心技术》

基本概念

什么是优先级, 什么又是权限呢?
我们知道, 权限是能与不能的问题, 而优先级呢, 是"你能, 只不过是先还是后"的问题.

进程优先级指的是进程获取资源的先后顺序.

为什么会存在进程优先级呢?
排队的本质叫做确认优先级, 我们的系统里面永远都是进程占大多数, 而资源是少数, 说到底, 终归是资源不够, 所以进程竞争资源是常态.

查看系统进程

我们输出 ps -l 命令会看到:
在这里插入图片描述
其中的 PRI 是 priority, NI 是 nice.

我们平时在查看进程优先级时, 可以使用如下命令:

ps -la

在Linux中, 要更改进程的优先级, 需要更改的不是 PRI, 而是 NI( nice 值是进程优先级的修正数据, 所以我们改的是 nice 值)

PRI vs NI

  • PRI : 代表这个进程可被执行的优先级, 且其值越小越早被执行(PRI默认值是80, 其值越小, 进程优先级越高).
  • NI : 代表这个进程的 nice 值.

PRI 还是很好理解的, 所以我们主要说的是NI, nice 值表示进程可被执行的优先级的修正数据, 注意哦, PRI(new) = PRI(old) + NI, 也就是说当 nice 值为负数的时候, 该进程的优先级就会变小, 即优先机会变高, 也就越快的被执行.

所以,在Linux中, 如若要调整进程的优先级, 需要改变的是进程的 nice 值. 不过注意哦, nice 值是有范围的, 它的取值范围是 -20 到 19. 这个我们也能理解, 因为Linux下是不允许无节制的设置优先级, 每次设置优先级时, PRI 都会先恢复至 old , 再做计算.

所以, 这两值的取值范围是:

  • nice : [-20, 19]
  • PRI : [60, 99] (因为PRI默认值是80)

这里我就不做实验演示了, 因为这部分内容了解即可, 并不是特别重要. 如果有老铁想更改进程优先级, 可以使用 top 命令哦.

其他概念

下面我们说说进程的其他概念:

竞争性

我们知道系统中进程数目众多,而CPU资源只有少量, 甚至只有一个, 所以进程之间是具有竞争属性的, 故而有了优先级的概念.

可能有老铁会问了, 操作系统就是简单的根据运行队列来进行先后调度的吗? 有没有可能突然来了一个优先级更高的进程呢?

不知道老铁有听过抢占式内核的概念吗, 我们正在运行的低优先级进程, 如果来了一个优先级更高的进程, 我们的调度器会直接把这个正在运行的低优先级进程从CPU上剥离, 放上优先级更高的进程, 这叫进程抢占

独立性

多进程运行, 需要独享各种资源, 而且多进程运行期间互不干扰. 进程具有独立性, 不会因为一个进程挂掉或异常导致其他进程出问题.

并行

多个进程在多个CPU下, 分别同时运行叫做并行.
在这里插入图片描述
可能有老铁会问了, 诶, 不对呀, 我的电脑是单CPU的, 但是我的电脑上好多个进程都在跑啊, 比如我一边在VS上敲代码, 一边打开QQ音乐听歌, 这是为什么呢?

我要强调的是: 多个进程在你的系统中运行 != 多个进程在你的系统中同时运行.

并发

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

关于并发, 我们需要注意的是, 不要以为进程一旦占用CPU资源, 就会一直执行到结束, 才会释放CPU资源, 我们遇到的大部分的操作系统都是分时的.

分时? 这是什么意思呢? 也就是说OS会给每一个进程, 在一个调度周期中, 赋予一个时间片的概念.

在这里插入图片描述
在一个时间片内, 多个进程都会通过进程切换交叉的方式, 让多个进程代码在一段时间内都得到推进, 这种现象叫做并发.

关于进程切换我们需要了解的的是:

我们知道CPU内部是有一些寄存器的:
在这里插入图片描述
CPU内的寄存器, 可以临时的存储数据, 非常少, 但是很重要.
当进程在被执行的过程中, 一定会存在大量的临时数据, 会被暂存在CPU的寄存器中.

那寄存器中数据的到底有多重要呢?
(想想当兵保存学籍和恢复学籍的例子)

注意哦, 我们把进程在运行过程中产生的各种寄存器数据, 叫做进程的硬件上下文数据.
当前进程被剥离, 需要保存该进程的上下文数据;
当前进程被恢复, 需要将曾经保存的上下文数据恢复到寄存器中.

上下文数据在哪里保存呢?
当然是task_struct.

最后我们还要准确区分: 寄存器和寄存器中的数据
寄存器有一套, 而寄存器中的数据有多份.

练习题

1.关于 linux 的进程,下面说法不正确的是
A.僵尸进程会被 init 进程接管,不会造成资源浪费;
B.孤儿进程的父进程在它之前退出,会被 init 进程接管,不会造成资源浪费;
C.进程是资源管理的最小单位,而线程是程序执行的最小单位。Linux 下的线程本质上用进程实现
D.子进程如果对资源只是进行读操作,那么完全和父进程共享物理地址空间。

解析:
僵尸进程指的是进程退出后不会完全释放资源,会造成系统资源泄漏;

孤儿进程在父进程退出后,父进程成为init进程,进程退出,孤儿进程的资源将被init进程释放;

操作系统通过pcb实现对程序运行调度控制;

fork系统调用通过复制父进程创建一个子进程,父子进程数据独有,代码共享(在数据不发生改变的情况下父子进程资源指向同一块物理内存空间(写时拷贝技术)

2.在抢占式多任务处理中,进程被抢占时,哪些运行环境需要被保存下来?[多选]
A.所有cpu寄存器的内容
B.全局变量
C.页表指针
D.程序计数器

解析:
所有cpu寄存器的内容 cpu上正在处理的数据;

全局变量 程序内的数据(并不一定正在被处理);

页表指针 程序切换时会将页表起始地址加载到寄存器中;

程序计数器 下一步程序要执行的指令地址