sched_setscheduler() - Unix,Linux系统调用 - 技术教程
Tutorials Point


  Unix初学者指南
  Unix Shell编程
  高级Unix
  Unix有用参考资料
  Unix有用资源
  精选阅读

版权所有 © 2014 tutorialspoint



  首页     参考资料     讨论论坛     关于TP  

sched_setscheduler() - Unix,Linux系统调用


previous next AddThis Social Bookmark Button

广告

名称

sched_setscheduler, sched_getscheduler - 设置和获取调度算法/参数

概要

#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_FIFOSCHED_RRSCHED_OTHERSCHED_BATCH;它们各自的语义如下所述。

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

调度策略

调度程序是内核的一部分,它决定接下来哪个可运行进程将由CPU执行。Linux调度程序提供三种不同的调度策略,一种用于普通进程,两种用于实时应用程序。静态优先级值sched_priority分配给每个进程,此值只能通过系统调用更改。从概念上讲,调度程序为每个可能的sched_priority值维护一个可运行进程列表,并且sched_priority的值可以在0到99之间。为了确定接下来运行的进程,Linux调度程序查找具有最高静态优先级的非空列表,并取该列表开头的进程。调度策略确定每个进程将在具有相同静态优先级的进程列表中插入的位置以及它如何在该列表中移动。

SCHED_OTHER是大多数进程使用的默认通用分时调度策略。SCHED_BATCH旨在用于进程的“批处理”式执行。SCHED_FIFOSCHED_RR旨在用于需要精确控制可运行进程执行方式的特殊时间关键型应用程序。

使用SCHED_OTHERSCHED_BATCH调度的进程必须分配静态优先级0。在SCHED_FIFOSCHED_RR下调度的进程可以具有1到99范围内的静态优先级。系统调用sched_get_priority_min()和sched_get_priority_max()可以用于以可移植的方式在所有符合POSIX.1-2001的系统上找出调度策略的有效优先级范围。

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

SCHED_FIFO:先进先出调度

SCHED_FIFO只能与高于0的静态优先级一起使用,这意味着当SCHED_FIFO进程变为可运行时,它将始终立即抢占任何当前运行的SCHED_OTHERSCHED_BATCH进程。SCHED_FIFO是一种简单的调度算法,没有时间片。对于在SCHED_FIFO策略下调度的进程,将应用以下规则:已被更高优先级进程抢占的SCHED_FIFO进程将保留在其优先级的列表开头,并在所有更高优先级进程再次阻塞后恢复执行。当SCHED_FIFO进程变为可运行时,它将插入到其优先级的列表末尾。调用sched_setscheduler()或sched_setparam()将把由pid标识的SCHED_FIFO(或SCHED_RR)进程放在列表的开头,如果它是可运行的。因此,如果它具有相同的优先级,它可能会抢占当前正在运行的进程。(POSIX.1-2001指定进程应该移到列表的末尾。)调用sched_yield()的进程将被放在列表的末尾。没有其他事件会移动在具有相同静态优先级的可运行进程的等待列表中使用SCHED_FIFO策略调度的进程。SCHED_FIFO进程运行直到它被I/O请求阻塞、被更高优先级进程抢占或调用sched_yield()。

SCHED_RR:循环轮询调度

SCHED_RR是对SCHED_FIFO的简单增强。上面对SCHED_FIFO的描述也适用于SCHED_RR,除了每个进程只允许运行最大时间量子。如果SCHED_RR进程已运行的时间段等于或大于时间量子,它将被放入其优先级的列表末尾。已被更高优先级进程抢占并随后作为正在运行的进程恢复执行的SCHED_RR进程将完成其循环轮询时间量子的未过期部分。可以使用sched_rr_get_interval(2)检索时间量度的长度。

SCHED_OTHER:默认Linux分时调度

SCHED_OTHER只能在静态优先级0下使用。SCHED_OTHER是标准的Linux分时调度程序,适用于所有不需要特殊静态优先级实时机制的进程。要运行的进程是从静态优先级0列表中选择的,该列表基于仅在此列表内确定的动态优先级。动态优先级基于优先级级别(由nice(2)或setpriority(2)设置),并且对于进程准备好运行但被调度程序拒绝运行的每个时间量子都会增加。这确保了所有SCHED_OTHER进程之间的公平进展。

SCHED_BATCH:调度批处理进程

(自Linux 2.6.16起。)SCHED_BATCH只能在静态优先级0下使用。此策略类似于SCHED_OTHER,除了此策略将导致调度程序始终假定该进程是CPU密集型的。因此,调度程序将应用一个小的调度惩罚,以便在调度决策中轻微地不利于此进程。此策略对于非交互式的工作负载很有用,但不想降低其优先级值,以及对于想要确定性调度策略而不会导致额外抢占(工作负载的任务之间)的交互式工作负载。

权限和资源限制

在2.6.12之前的Linux内核中,只有特权(CAP_SYS_NICE)进程才能设置非零静态优先级。非特权进程可以进行的唯一更改是设置SCHED_OTHER策略,这只有在sched_setscheduler()的调用者的有效用户ID与正在更改其策略的目标进程(即由pid指定的进程)的真实或有效用户ID匹配时才能执行。

自Linux 2.6.12起,RLIMIT_RTPRIO资源限制定义了非特权进程的SCHED_RRSCHED_FIFO策略的优先级上限。如果非特权进程具有非零RLIMIT_RTPRIO软限制,则它可以更改其调度策略和优先级,但前提是优先级不能设置为高于RLIMIT_RTPRIO软限制的值。如果RLIMIT_RTPRIO软限制为0,则唯一允许的更改是降低优先级。根据相同的规则,另一个非特权进程也可以进行这些更改,只要进行更改的进程的有效用户ID与目标进程的真实或有效用户ID匹配即可。有关RLIMIT_RTPRIO的更多信息,请参阅getrlimit(2)。特权(CAP_SYS_NICE)进程忽略此限制;与旧内核一样,它们可以对调度策略和优先级进行任意更改。

响应时间

等待I/O的被阻塞的高优先级进程在再次调度之前具有一定的响应时间。设备驱动程序编写者可以通过使用“慢中断”中断处理程序来大大减少此响应时间。

其他

子进程通过fork()继承调度算法和参数。调度算法和参数在execve(2)中得以保留。

实时进程通常需要内存锁定以避免分页延迟,这可以使用mlock()或mlockall()来完成。

由于在SCHED_FIFOSCHED_RR下调度的进程中的非阻塞无限循环将永远阻塞所有具有较低优先级的进程,因此软件开发人员应始终在控制台上保留一个在比被测应用程序更高的静态优先级下调度的shell。这将允许紧急终止未按预期阻塞或终止的被测实时应用程序。

sched_setscheduler()和sched_getscheduler()可用的POSIX系统中,在<unistd.h>中定义了_POSIX_PRIORITY_SCHEDULING

返回值

成功时,sched_setscheduler()返回零。成功时,sched_getscheduler()返回进程的策略(非负整数)。出错时,返回-1,并相应地设置errno

错误

标签描述
EINVAL 调度policy不是已识别的策略之一,或者参数param对于policy没有意义。
EPERM 调用进程没有相应的权限。
ESRCH 找不到ID为pid的进程。

符合标准

POSIX.1-2001。SCHED_BATCH策略是Linux特有的。

备注

标准Linux是一个通用的操作系统,可以处理后台进程、交互式应用程序和软实时应用程序(通常需要满足定时期限的应用程序)。本手册页针对的是这些类型的应用程序。

标准Linux并非设计用于支持硬实时应用,即那些必须保证截止时间(通常远小于一秒)的应用,否则系统将发生灾难性故障。与所有通用操作系统一样,Linux的设计目标是最大化平均性能而不是最坏情况下的性能。Linux在中断处理方面的最坏情况性能远低于平均性能,其各种内核锁(例如用于SMP)会导致很长的最大等待时间,并且其许多性能改进技术通过增加最坏情况时间来减少平均时间。对于大多数情况来说,这就是你想要的结果,但是如果你真的在开发硬实时应用,请考虑使用Linux的硬实时扩展,例如RTLinux(http://www.rtlinux.org)或RTAI(http://www.rtai.org),或者使用专门为硬实时应用设计的其他操作系统。

另请参阅

Bill O. Gallmeister著,《面向现实世界的编程 - POSIX.4》,O’Reilly & Associates, Inc.出版,ISBN 1-56592-074-0

previous next Printer Friendly

广告


  

广告



广告
© . All rights reserved.