Linux 内核级操作(例如文件系统上的 IO 操作或通过以太网接口的通信)是否继承触发它们的线程的优先级,或者在调用线程让步时它们是否以单独的优先级运行?
例如,假设我创建一个线程,其策略为 SCHED_FIFO 且优先级为 99(最高),该线程除了处于紧密循环中并从串行端口发送单个字节之外什么也不做。我们将此线程称为 SERIAL_THREAD。
假设我创建了第二个线程,其策略为 SCHED_FIFO 且优先级为 98,它除了坐在紧密循环中并发送相同的 TCP IP 数据包之外什么也不做。我们将此线程称为 IP_THREAD。
我们还假设系统有一个核心,并且线程限制已被禁用,以便线程能够消耗 100% 的系统 CPU 资源,从而阻止其他任何事情发生。
通常,鉴于 SERIAL_THREAD 在系统中具有最高优先级,并且它从不明确让位于较低优先级线程,我预计 IP_THREAD 将永远无法发送其 TCP-IP 数据包。但是,由于线程通过内核与 IO 设备交互,因此我不确定 IP_THREAD 是否有机会运行。
答案1
高优先级实时线程可以完全阻止该紧密的无收益循环中的所有其他活动(除非 I/O 以某种方式阻塞)
SCHED_FIFO
实现简单的先进先出调度算法,无需时间片。可运行的SCHED_FIFO
任务始终调度在任何SCHED_NORMAL
任务之上。当一个SCHED_FIFO
任务变得可运行时,它会继续运行,直到它阻塞或显式让出处理器;它没有时间片并且可以无限期地运行。
罗伯特·洛夫. Linux 内核开发(第三版)。 p。 64.
对于下一个可能的问题:
具有相同优先级的两个或多个
SCHED_FIFO
任务循环运行,但同样只有在它们明确选择时才会产生处理器