浅析Linux下进程的调度策略与优先级 在 Linux 中,线程是由进程来实现的,可以认为线程就是一个轻量级的进程,因此,线程调度是按照进程调度的方式来进行的 。这样设计,线程调度流程可以直接复用进程调度流程,没必要再设计一个进程内的线程调度器了 。
在 Linux 中,进程调度器是基于进程的调度策略与调度优先级来决定调度哪个进程运行 。
调度策略主要包括:
调度优先级的范围是 0~99,数值越大,表示优先级越高 。
其中,SCHED_OTHER、SCHED_IDLE、SCHED_BACH 为非实时调度策略,其调度优先级为 0 。而 SCHED_FIFO、SCHED_RR 是实时调度策略,其调度优先级范围为 1~99 。
实时调度策略的进程总是比非实时调度策略的进程优先级高 。
在 Linux 内部实现中,调度器会为每个可能的调度优先级维护一个可运行的进程列表,以最高优先级列表头部的进程作为下一次调度的进程 , 所有的调度都是抢占式的,如果一个具有更高调度优先级的进程转换为可运行状态,那么当前运行的进程将被强制进入其等待的队列中 。
SCHED_OTHER
该调度策略是默认的 Linux 分时调度策略,该调度策略为非实时的,其调度优先级总是为 0 。
对于该调度策略类型的进程,调度器是基于动态优先级来调度的 。动态优先级跟属性 nice 有关,nice 的值会随着进程的运行时间而动态改变,以确保所有具有 SCHED_OTHER 策略的进程公平地得到调度 。
在 Linux 中,nice 的值范围为-20 ~ +19,默认值为 0 。nice 值越大 , 则优先级越低,因此相对较低 nice 值的进程可以获得更多的处理器时间 。
通过命令ps -el查看系统中的进程列表,其中NI列就是进程对应的 nice 值 。
使用top命令,看到的NI列也是进程的 nice 值 。
调整 nice 值 , 可以通过 shell 命令nice,该命令可以按照指定的 nice 值运行cmd , 命令的帮助信息为:
重新调整已运行进程的 nice 值,可通过renice命令实现,命令的帮助信息为:
另外 , 可以执行top命令,输入r,根据提示输入进程的pid ,再输入nice数值 , 也可以调整进程的nice值 。
SCHED_FIFO
该调度策略为先入先出调度策略,简单概括,就是一旦进程占用了 CPU , 则一直运行,直到有更高优先级的任务抢占,或者进程自己放弃占用 CPU 。
SCHED_RR
该调度策略为时间片轮转调度策略 , 该调度策略是基于 SCHED_FIFO 策略的演进,其在每个进程上增加一个时间片限制 , 当时间片使用完成后,调度器将该进程置于队列的尾端 , 放在尾端保证了所有具有相同调度优先级的进程的调度公平 。
使用top命令 , 如果PR列的值为RT ,则说明该进程采用的是实时调度策略,其调度策略为 SCHED_FIFO 或者 SCHED_RR,而对于非实时调度策略的进程,该列的值为NI + 20。
可以通过命令ps -eo state,uid,pid,ppid,rtprio,time,comm来查看进程对应的实时优先级,实时优先级位于RTPRIO列下 , 如果进程对应的列显示为- , 说明该进程不是实时进程 。
chrt命令可以用来很简单地更改进程的调度策略与调度优先级 。在 Linux 下查看chrt命令的帮助信息:
比如,获取某个进程的调度策略,使用如下命令:
在比如,设置某个进程的调度策略为 SCHED_FIFO,调度优先级为 70,使用如下命令:
Linux下有没有办法能看到FIFO的大小FIFO和pipe的区别在于:
FIFO在文件系统中有对应的inode , 可以通过ls命令查看 。
sh-3.2# ls -lhF。/fifo_file
推荐阅读
- 直播变声技巧教学,直播的时候变声怎么弄?
- 查看pg数据库的大小,查看pg数据库的大小命令在哪
- html5manifest.json的简单介绍
- 玩物得志直播需要准备什么,玩物得志直播间里的人是机器人吗
- 别踩白块源代码java js别踩白块
- java源代码计算单词数,java计算字母的出现次数
- 电视机安装投屏怎么弄,电视怎样安装投屏功能
- 移动oa服务器设置,移动oa服务器设置在哪里
- Linux下监听的命令 linux系统监听端口命令