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 排程策略不是已識別的策略之一,或者引數param對於策略沒有意義。
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.