Linux系统进程调度

2020-11-21  本文已影响0人  啊呀哟嘿

主要参考:Linux manual page - sched

概述

自从linux内核2.6.23以来,默认的进程调度器就被设置为完全公平调度器(CFS,complete fair scheduler),取代了之前的O(1)调度器。

每个线程都有一个静态调度优先级,即sched_priority字段。

一个线程的调度策略决定了线程会被插入到同级静态优先级的线程队列的位置,以及它在队列中会怎样移动。

所有的调度都是可插入的,如果一个更高静态优先级的线程准备好了,现在运行中的线程就会被插入。而调度策略则仅仅影响了同样静态优先级的线程。

设置方法

进程(线程)可以通过系统调用设置自身或者其他进程(线程)的调度策略。

#include <sched.h>
int sched_setattr(pid_t pid, struct sched_attr *attr,
                  unsigned int flags);
int sched_getattr(pid_t pid, struct sched_attr *attr,
                  unsigned int size, unsigned int flags);

其中pid为0时,设置自身的调度策略和参数。结构体sched_attr包含以下字段:sizesched_policy(即调度策略,具体会在下一节介绍)、sched_flagssched_nicesched_runtimesched_deadlinesched_period(最后三个为SCHED_DEADLINE相关的参数)。当设置成功,系统调用返回0;否则返回-1,并会设置errno

int sched_setaffinity(pid_t pid, size_t cpusetsize,
                      cpu_set_t mask);
int sched_getaffinity(pid_t pid, size_t cpusetsize,
                      cpu_set_t mask);

调度策略

普通进程:SCHED_OTHER/SCHED_BATCH/SCHED_IDLE
实时进程:SCHED_FIFO/SCHED_RR
特殊实时进程:SCHED_DEADLINE
静态优先级:Static_priority:对于普通进程,静态优先级为0;对于实时进程,静态优先级为1-99,99为最高优先级。
动态优先级:Dynamic_priority:仅对普通进程有用,取决于nice和一个动态调整的量(比如进程ready却没被调度,则增加)。

其他

上一篇下一篇

猜你喜欢

热点阅读