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.