Linux进程调度-应用内核设置调度策略和优先级

一、进程调度策略设置

1. 函数使用说明

#include <sched.h>

int sched_setscheduler(pid_t pid, int policy, const struct sched_param *param);

int sched_getscheduler(pid_t pid);

struct sched_param {
   ...
   int sched_priority;
   ...
};

描述:
sched_setscheduler()为pid中指定的线程设置调度策略和相关参数。 如果pid等于零,则将设置调用线程的调度策略和参数。 参数param的解释取决于所选策略。 当前,Linux支持以下“常规”(即非实时)调度策略:

SCHED_OTHER:标准循环分时策策;
SCHED_BATCH:用于“批处理”样式的进程执行;
SCHED_IDLE:用于运行优先级较低的后台作业。

还支持以下“实时”策略,用于支持需要严格控制选择可运行线程来执行的方式的特殊时间紧迫的应用程序。
SCHED_FIFO:先进先出策略;
SCHED_RR:循环策略。

这些策略中的每一个的语义将在下面详细说明。

sched_getscheduler() 查询pid标识的线程的调度策略。 如果pid等于零,则将检索调用线程的策略。

注:需要root权限才能设置成功。sched_setscheduler 设置的RT优先级数值直接写到task->rt_priority里面,RT线程的task->prio = 99 - task->rt_priority,task->prio的数值越小,RT优先级越高。有个转换的目的是让在用户空间进行代码设置的时候,sched_param.sched_priority的数值越大,对应的优先级越大。可以看到migration线程的优先级是0(最大)。

1. 调度策略
调度程序是内核组件,它决定接下来将由CPU执行哪个可运行线程。 每个线程都有一个关联的调度策略和一个静态调度优先级sched_priority;这些是由 sched_setscheduler() 设置。 调度程序根据调度策略的知识和系统上所有线程的静态优先级进行决策。

对于根据常规调度策略(SCHED_OTHER,SCHED_IDLE,SCHED_BATCH)之一调度的线程,sched_priority 不在调度决策中使用(必须指定为0)。

根据一种实时策略(SCHED_FIFO,SCHED_RR)调度的进程的 sched_priority 值在1(最低)到99(最高)之间。 (正如数字所暗示的那样,实时线程总是比正常线程具有更高的优先级。)请注意:POSIX.1-2001要求实现至少支持32种不同的实时策略优先级, 某些系统仅提供此最小值。 可移植程序应使用 sched_get_priority_min(2) 和 sched_get_priority_max(2) 查找特定策略支持的优先级范围。

从概念上讲,调度程序为每个可能的 sched_priority 值维护一个可运行线程的列表。 为了确定接下来运行哪个线程,调度程序将查找具有最高(值最小)静态优先级的非空列表,并在该列表的开头选择线程。

线程的调度策略确定将其插入到相同静态优先级线程列表中的位置以及如何在列表中移动。

所有调度都是抢先的:如果具有较高静态优先级的线程准备就绪,可以运行,则当前正在运行的线程将被抢占并返回其静态优先级的等待列表。 调度策略仅在静态优先级相等的可运行线程列表中确定顺序。

2. SCHED_FIFO 先进先出调度

SCHED_FIFO只能在静态优先级高于0的情况下使用,这意味着当SCHED_FIFO线程变为可运行时,它将始终立即抢占任何当前正在运行的 SCHED_OTHER,SCHED_BATCH 或 SCHED_IDLE 线程。 SCHED_FIFO 是一种简单的调度算法,无需进行时间分片。 对于根据 SCHED_FIFO策略调度的线程,适用以下规则:

(1)被另一个更高优先级的线程抢占的 SCHED_FIFO 线程将保持其优先级在列表的开头,并在所有更高优先级的线程阻塞时立即恢复执行。
(2)当SCHED_FIFO线程变为可运行线程时,将根据优先级将其插入列表的末尾。
(3)调用sched_setscheduler() 或 sched_setparam() 会将pid标识的SCHED_FIFO(或SCHED_RR)线程放在列表的开头(如果可运行)。 因此,如果具有相同优先级的其它进程,它可能会抢占当前正在运行的线程。(POSIX.1-2001指定该线程应转到列表的末尾。)
(4)调用sched_yield()的线程将放在列表的末尾。

没有其他事件会在静态优先级相等的可运行线程的等待列表中移动以 SCHED_FIFO 策略调度的线程。

SCHED_FIFO 线程将一直运行,直到被I/O请求阻止,被更高优先级的线程抢占或调用 sched_yield(2)。

3. SCHED_RR 循环调度
SCHED_RR 是 SCHED_FIFO 的简单增强。上面针对 SCHED_FIFO 所述的所有内容也适用于 SCHED_RR,除了允许每个线程仅在最大时间范围内运行。 如果 SCHED_RR 线程已经运行了等于或大于时间范

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值