0
点赞
收藏
分享

微信扫一扫

Linux系统编程·进程优先级


Linux系统编程·进程优先级_linux

你好,我是安然无虞。

文章目录

  • ​​自学网站​​
  • ​​基本概念​​
  • ​​查看系统进程​​
  • ​​PRI vs NI​​
  • ​​其他概念​​
  • ​​竞争性​​
  • ​​独立性​​
  • ​​并行​​
  • ​​并发​​
  • ​​练习题​​

自学网站

推荐给老铁们两款学习网站:
面试利器&算法学习:​​​牛客网​​​ 风趣幽默的学人工智能:​​人工智能学习​​

基本概念

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

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

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

查看系统进程

我们输出 ps -l 命令会看到:

Linux系统编程·进程优先级_优先级_02


其中的 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下, 分别同时运行叫做并行.

Linux系统编程·进程优先级_数据_03


可能有老铁会问了, 诶, 不对呀, 我的电脑是单CPU的, 但是我的电脑上好多个进程都在跑啊, 比如我一边在VS上敲代码, 一边打开QQ音乐听歌, 这是为什么呢?

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

并发

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

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

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

Linux系统编程·进程优先级_数据_04


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

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

我们知道CPU内部是有一些寄存器的:

Linux系统编程·进程优先级_linux_05


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上正在处理的数据;

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

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

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


举报

相关推荐

0 条评论