今天小编给大家分享一下linux中进程有没有优先级的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
linux中进程有优先级。Linux是一个多用户、多任务的操作系统,系统中通常运行着非常多的进程,但CPU在一个时钟周期内只能运算一条指令;哪个进程应该先运算,谁应该后运算呢?这就需要由进程的优先级来决定了。在Linux系统中,表示进程优先级的有两个参数:Pri和Nice;进程优先级是PRI值不是Nice值,但是Nice值会影响优先级。
Linux-进程的优先级
Linux 是一个多用户、多任务的操作系统,系统中通常运行着非常多的进程。但是 CPU 在一个时钟周期内只能运算一条指令(现在的 CPU 采用了多线程、多核心技术,所以在一个时钟周期内可以运算多条指令。 但是同时运算的指令数也远远小于系统中的进程总数),那问题来了:谁应该先运算,谁应该后运算呢?这就需要由进程的优先级来决定了。
cpu分配资源的先后顺序就是优先级
优先权高的进程有优先执行的权利,
可以让进程运行在指定的cpu上,改善系统整体性能
另外,CPU 在运算数据时,不是把一个集成算完成,再进行下一个进程的运算,而是先运算进程 1,再运算进程 2,接下来运算进程 3,然后再运算进程 1,直到进程任务结束。不仅如此,由于进程优先级的存在,进程并不是依次运算的,而是哪个进程的优先级高,哪个进程会在一次运算循环中被更多次地运算。
这样说很难理解,我们换一种说法。假设我现在有 4 个孩子(进程)需要喂饭(运算),我更喜欢孩子 1(进程 1 优先级更高),孩子 2、孩子 3 和孩子 4 一视同仁(进程 2、进程 3 和进程 4 的优先级一致)。现在我开始喂饭了,我不能先把孩子 1 喂饱,再喂其他的孩子,而是需要循环喂饭(CPU 运算时所有进程循环运算)。那么,我在喂饭时(运算),会先喂孩子 1 一口饭,然后再去喂其他孩子。而且在一次循环中,先喂孩子 1 两口饭,因为我更喜欢孩子 1(优先级高),而喂其他的孩子一口饭。这样,孩子 1 会先吃饱(进程 1 运算得更快),因为我更喜欢孩子 1。
查看进程优先级
1.使用ps-al,可以看进程的优先级
2.PRI和NI
在 Linux 系统中,表示进程优先级的有两个参数:Priority 和 Nice。
[root@localhost ~]# ps -le F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 1 0 0 80 0 - 718 - ? 00:00:01 init 1 S 0 2 0 0 80 0 - 0 - ? 00:00:00 kthreadd ...省略部分输出...
其中,PRI 代表 Priority,NI 代表 Nice。这两个值都表示优先级,数值越小代表该进程越优先被 CPU 处理。不过,PRI值是由内核动态调整的,用户不能直接修改。所以我们只能通过修改 NI 值来影响 PRI 值,间接地调整进程优先级。
PRI 和 NI 的关系如下:
PRI (最终值) = PRI (原始值) + NI
其实,大家只需要记得,我们修改 NI 的值就可以改变进程的优先级即可。NI 值越小,进程的 PRI 就会降低,该进程就越优先被 CPU 处理;反之,NI 值越大,进程的 PRI 值就会増加,该进程就越靠后被 CPU 处理。
修改 NI 值时有几个注意事项:
NI 范围是 -20~19。
普通用户调整 NI 值的范围是 0~19,而且只能调整自己的进程。
普通用户只能调高 NI 值,而不能降低。如原本 NI 值为 0,则只能调整为大于 0。
只有 root 用户才能设定进程 NI 值为负值,而且可以调整任何用户的进程。
查看查看并修改nice值的命令
1.用top命令查看并修改nice值
输入top-按r ,输入进程pid,输入nice值。(如果显示拒绝提升的话,使用sudo提升top命令的权限)。
2.其他概念
竞争性:系统数目很多,但只有cpu数量少,甚至只有一个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级。
独立性:多进程运行,需要独享各种资源,所以多进程期间互不干扰。
并行:多个进程在多个cpu中进行,同时进行运行,称为并行。
并发:多个进程在一个cpu上采用进程切换的方式,在一段时间内,让多个进程得以推进,称为并发。
进程优先级是 PRI 值不是 Nice 值,但是 Nice 值会影响优先级
PRI 也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被 CPU 执行的先后顺序,此值越小进程的优先级别越高。那 NI 呢?就是我们所要说的 nice 值了,其表示进程可被执行的优先级的修正数值。如前面所说, PRI 值越小越快被执行,那么加入 nice 值后,将会使得 PRI 变为: PRI(new)=PRI(old)+nice 。
到目前为止,更需要强调一点的是,进程的 nice 值不是进程的优先级,他们不是一个概念,但是进程 nice 值会影响到进程的优先级变化。
通过调整 nice 值,更改进程优先级, nice 调整范围是 -20~19 。
进程优先级与变动影响因素与原理
调度策略: RR 调度和 FIFO 调度的进程属于实时进程,以分时调度( OTHER )的进程是非实时进程。
FIFO (先进先出)和 RR (时间片轮转)用于实时进程, OTHER (分时调度)用于非实时进程;实时进程会抢占普通进程; FIFO 会导致同优先级实时进程始终占用 CPU , RR 会保证同优先级实时进程按时间片轮流执行。
实时进程优先级高于普通进程,实时进程使用静态优先级调度、非实时进程使用动态优先级调度,非实时进程动态优先级通过 nice 调整、可能受 bonus 影响。
Linux进程有两种优先级:普通进程优先级(使用 SCHED_NORMAL 调度策略),以及实时进程优先级(使用 SCHED_FIFO 或 SCHED_RR 调度策略)
不同调度策略的实时进程只有在相同优先级时才有可比性,任何时候,实时进程的优先级都高于普通进程
Linux对实时进程使用静态优先级调度,对普通的进程(非实时进程),根据动态优先级进行调度。
实时进程,只有静态优先级(在 0~MAX_RT_PRIO-1 间,默认 MAX_RT_PRIO 为 100 ), 内核不会再根据休眠等因素对其静态优先级做调整;
实时进程 0-99 号优先级每一个优先级对应一个优先级队列(链表),先执行数值高的对应的链表(0号最低),可由后面所述的 chrt 以及 相应函数修改该优先级;
非实时进程静态优先级可通过 nice 值( -20~19 )调整: static_prio=MAX_RT_PRIO + nice + 20 。
nice 只影响非实时进程(静态优先级在 100~139 之间), nice 越大静态优先级值越大,优先级越低。
非实时进程动态优先级根据静态优先级和 bonus 计算: dynamic_prio = max (100, min (static_prio - bonus + 5, 139))
bonus 反映进程平均睡眠时间(范围 0~10 ),睡眠时间越多越可能是交互进程,每次轮到它运行时它就越可能不会使用完时间片再释放 cpu 。