Linux进程调度分析记录,进程优先级,隔离处理器,isolcpus
发布网友
发布时间:2024-09-27 15:59
我来回答
共1个回答
热心网友
时间:2024-10-03 23:41
Linux 实时调度算法提供了一种软实时工作方式,内核调度进程时,尽力在限定时间到来前运行,但不保证总能满足所有进程要求。相比之下,硬实时系统能确保在一定条件下满足所有调度要求。尽管 Linux 对实时任务调度不做任何保证,其实时调度算法性能依然不错,在 2.6 版内核中能满足严格的时间要求。
Linux 中的进程状态包括可运行状态、可中断的等待状态、不可中断的等待状态、暂停状态、跟踪状态和僵死状态,其中僵死状态和僵死撤销状态分别表示进程终止和撤销后的情况。
进程通常被分类为 I/O 受限和 CPU 受限,另外,也可根据交互性、批处理和实时性进行分类。调度不被允许的情况包括硬件和软件中断上下文以及拥有自旋锁的时间点。
进程的优先级分为静态优先级、动态优先级、实时优先级和 nice 值。静态优先级由 100 到 139 的整数表示,nice 值用于设置进程的优先级,范围为 -20 到 +19。实时优先级由 0 到 99 的整数表示,而限期进程的优先级被设为 -1。动态优先级通过计算静态优先级、nice 值和特定 bonus 来确定。
Linux 内核抽象了调度类概念,目前实现了五种调度类,包括停机调度类、限期调度类、实时调度类、公平调度类和空闲调度类。每种调度类服务于不同的需求,如停机调度类优先级最高,限期调度类使用最早期限优先算法,实时调度类提供先进先出或带有时间片的调度,公平调度类确保公平分配资源,而空闲调度类在没有其他进程可调度时才调度。
进程占用的处理器带宽管理可通过配置文件和控制组(cgroups)实现。对于限期调度类,每个进程有自己的带宽,实时调度类允许配置全局和任务组级别的带宽。公平调度类同样支持周期和限额来控制任务组的带宽。
进程的 CPU 亲和性可以通过系统调用或控制组来设置,允许进程绑定到特定的处理器上执行。隔离处理器可通过引导参数“isolcpus=”来实现,被隔离的处理器不会参与 SMP 负载均衡。
调度的时机包括进程主动调用 schele() 函数、周期性调度、唤醒进程时抢占当前进程、创建新进程时抢占当前进程等。内核通过设置 need_resched 标志来判断是否需要重新调度,调用 schele() 函数来切换到新的进程。
内核支持抢占,允许在任何安全时间抢占正在执行的任务。抢占安全的情况包括没有持有锁、进程阻塞或显式调用 schele() 等。降低内核延迟的方法包括内核抢占和调用 cond_resched() 函数。
内核抢占发生于中断处理程序、可抢占性恢复、显式调用 schele() 或任务阻塞时。内核抢占计数(preempt_count)记录了不同类型的抢占事件,用于控制抢占行为。
用户抢占发生在内核即将返回用户空间时,如果 need_resched 标志被设置,将触发 schele() 函数调用。与调度相关的系统调用用于执行调度任务,而 /proc/sys/kernel 目录下的文件则提供内核参数的配置。