当前位置: 首页 > 科技观察

困惑的Linux内核实时线程优先级

时间:2023-03-14 09:06:10 科技观察

后台Linux将进程分为普通进程和实时进程。普通进程使用CFS等调度算法,而实时进程使用SCHED_FIFO或SCHED_RR。不管优先级如何,实时进程都会先于SCHED_NORMAL中的所有进程执行,因为后者是普通的非实时进程。内核线程优先级Linux内核将大量(并且还在不断增加)的工作放在内核线程中,这些线程是在内核地址空间中运行的特殊进程。大多数内核线程在SCHED_NORMAL类中运行,并且必须与普通用户空间进程竞争CPU时间。但是有一些内核线程,开发者认为它们很特殊,应该比用户空间进程有更高的优先级。因此,这些内核线程也会被放在SCHED_FIFO中。那么问题来了,某个内核线程的实时优先级是多少?要回答这个问题,不仅要判断这个线程是否比其他所有实时线程都重要,还要和用户态实时进程进行比较。更重要。这是一个很难回答的问题,更何况在不同的系统和工作模式下,答案很可能是不同的。所以一般来说,内核开发者只是根据自己的心情随意选择一个实时优先级。目前的一些内核实时线程如下:最近大神PeterZijlstra看到一些内核开发者随意设置内核线程的优先级,终于忍不住了。指责这种将内核线程放入SCHED_FIFO的方法是没有意义的:“内核不知道它应该为各种事情使用什么实际优先级,所以即使尝试也没用(或者更糟,适得其反)”所以他发送了一系列[PATCH00/23]sched:RemoveFIFOprioritiesfrommodules内核线程优先级的接口被干脆删除了,这样就没人能乱来了。该系列Patch(点击阅读原文)主要做了以下几件事:删除原来的sched_setschedule()/sched_setattr()接口,增加调用sched_set_fifo()的sched_set_fifo(p)sched_set_fifo_low(p)sched_set_normal(p,nice)会将指定的进程放入优先级为50的SCHED_FIFO类中——这恰好是最小值和最大值之间的一半。对于不太紧急的线程,sched_set_fifo_low()将优先级设置为最低值(1)。调用sched_set_normal()会将线程返回到给定值的SCHED_NORMAL类。只留下这三个接口,开发者可以避免随意选择内核线程优先级,因为这是没有意义的。当然,系统管理员仍然可以根据需要调整不同线程/线程的优先级。.到目前为止,本系列中的许多补丁已经过review-by。相信如果合并,内核线程混乱的优先级状况会不断改善。本文转载自微信公众号“Linux代码阅读领域”,可通过以下二维码关注。转载本文请联系Linux代码阅读领域公众号。