idprio和rtprio

• 本文约824字,阅读大致需要2分钟 • Kernel

记一笔,没啥特别。

Unix系统的分时调度中,nice值(通过nice(1)来控制)是管理员告诉调度器的一个参数,这个参数令内核在考虑就绪进程优先级时,根据其值适当增大或减少执行绪的动态优先级。很明显,如果采用抢占式调度,如果执行绪等待时间较长,或者由于某种原因获得了优先级奖励(例如I/O导致的等待),即使有更重要的任务需要执行,内核还是会将这个执行绪调度进来并进行执行;反之,如果执行绪使用的CPU很多(计算密集型任务,如压缩等等),即使这个执行绪进行的就是最重要的任务,它仍然可能被置入休眠状态。

在FreeBSD的及时调度(real-time scheduling)实现中,增加了32个「及时(realtime)」优先级和32个「闲时调度(idle)」优先级。用户态进程可以通过rtprio(2)或rtprio_thread(2)系统调用来为进程或线程指定这些优先级。这些优先级不会动态调整,故在抢占式调度中可以一直获得时间片,或只有在系统闲时才获得时间片。

为了方便管理员使用,FreeBSD提供了与之对应的rtprio(1)和idprio(1)命令。出于显然的安全考虑,rtprio和减少nice值一样需要超级用户权限,而idprio默认也需要超级用户权限(目前,持锁执行绪可能由于优先级太低而被抢断,从而导致死锁),但可以通过将security.bsd.unprivileged_idprio设为1来允许非特权用户使用它。

典型的用法包括:

将Xorg设为realtime优先级,以改善其响应。这个命令必须以root身份运行。

📓 注意

副作用:如果Xorg陷入死循环,将没有机会令其终止。

rtprio 31 -`pgrep Xorg`

以idle优先级运行make buildworld。需要以root身份运行或将sysctl security.bsd.unprivileged_idprio设为1。

idprio 31 make buildworld

对于单机运行的网站来说,也可以用类似的方法来做后台的日志分析处理。