ioprio_set() - Unix、Linux 系統呼叫 - 技術教學
Tutorials Point


  Unix 初學者指南
  Unix Shell 程式設計
  高階 Unix
  Unix 有用參考
  Unix 有用資源
  精選閱讀

版權所有 © 2014 tutorialspoint



  首頁     參考     討論論壇     關於 TP  

ioprio_set() - Unix、Linux 系統呼叫


previous next AddThis Social Bookmark Button

廣告

名稱

ioprio_get、ioprio_set - 獲取/設定 I/O 排程類和優先順序

語法

int ioprio_get(int which, int who); 
int ioprio_set(int which, int who, int ioprio); 

描述

ioprio_get() 和 ioprio_set() 系統呼叫分別獲取和設定一個或多個程序的 I/O 排程類和優先順序。

whichwho 引數標識系統呼叫操作的程序。which 引數確定如何解釋 who,並具有以下值之一

標籤描述
IOPRIO_WHO_PROCESS
  who 是一個程序 ID,標識單個程序。
IOPRIO_WHO_PGRP
  who 是一個程序組 ID,標識程序組的所有成員。
IOPRIO_WHO_USER
  who 是一個使用者 ID,標識所有具有匹配的真實 UID 的程序。
如果在呼叫 ioprio_get() 時將 which 指定為 IOPRIO_WHO_PGRPIOPRIO_WHO_USER,並且多個程序與 who 匹配,則返回的優先順序將是在所有匹配程序中找到的最高優先順序。如果一個優先順序屬於更高優先順序的類(IOPRIO_CLASS_RT 是最高優先順序類;IOPRIO_CLASS_IDLE 是最低優先順序類),或者它屬於與另一個程序相同的優先順序類但具有更高的優先順序級別(較低的優先順序數字表示較高的優先順序級別),則稱該優先順序高於另一個優先順序。

傳遞給 ioprio_set() 的 ioprio 引數是一個位掩碼,它指定要分配給目標程序的排程類和優先順序。以下宏用於組裝和分解 ioprio

IOPRIO_PRIO_VALUE(class, data)
 給定一個排程 class 和優先順序 (data),此宏將這兩個值組合起來生成一個 ioprio 值,該值作為宏的結果返回。
IOPRIO_PRIO_CLASS(mask)
 給定 mask(一個 ioprio 值),此宏返回其 I/O 類元件,即 IOPRIO_CLASS_RTIOPRIO_CLASS_BEIOPRIO_CLASS_IDLE 中的一個。
IOPRIO_PRIO_DATA(mask)
 給定 mask(一個 ioprio 值),此宏返回其優先順序 (data) 元件。
有關排程類和優先順序的更多資訊,請參見“註釋”部分。

I/O 優先順序支援讀取和同步 (O_DIRECT、O_SYNC) 寫入。I/O 優先順序不支援非同步寫入,因為它們是在使記憶體變髒的程式上下文之外發出的,因此特定於程式的優先順序不適用。

返回值

成功時,ioprio_get() 返回與 whichwho 中指定的條件匹配的任何程序中具有最高 I/O 優先順序的程序的 ioprio 值。發生錯誤時,返回 -1,並且 errno 設定為指示錯誤。

成功時,ioprio_set() 返回 0。發生錯誤時,返回 -1,並且 errno 設定為指示錯誤。

錯誤

標籤描述
EPERM 呼叫程序沒有將此 ioprio 分配給指定程序所需的許可權。有關 ioprio_set() 所需許可權的更多資訊,請參見“註釋”部分。
ESRCH 找不到與 whichwho 中的規範匹配的任何程序。
EINVAL whichioprio 的值無效。有關 ioprio 可用的排程程式類和優先順序級別,請參閱“註釋”部分。

版本

這些系統呼叫自核心 2.6.13 起在 Linux 上可用。

符合標準

這些系統呼叫是 Linux 特定的。

註釋

Glibc 沒有為這些系統呼叫提供包裝器;使用 syscall(2) 呼叫它們。

僅當與支援 I/O 優先順序的 I/O 排程程式結合使用時,這些系統呼叫才有效。截至核心 2.6.17,唯一的此類排程程式是完全公平佇列 (CFQ) I/O 排程程式。

選擇 I/O 排程程式

I/O 排程程式是透過特殊檔案 /sys/block/<device>/queue/scheduler 在每個裝置的基礎上選擇的。

可以透過 /sys 檔案系統檢視當前的 I/O 排程程式。例如,以下命令顯示核心中當前載入的所有排程程式的列表

$ cat /sys/block/hda/queue/scheduler
noop anticipatory deadline [cfq]

括號中的排程程式是裝置(示例中的 hda)實際使用的排程程式。透過將新排程程式的名稱寫入此檔案來設定另一個排程程式。例如,以下命令將 hda 裝置的排程程式設定為 cfq

$ su
Password:
# echo cfq > /sys/block/hda/queue/scheduler

完全公平佇列 (CFQ) I/O 排程程式

自 v3(又名 CFQ 時間切片)以來,CFQ 實現了類似於 CPU 排程的 I/O 良好級別。這些良好級別分為三個排程類,每個類包含一個或多個優先順序級別
標籤描述
IOPRIO_CLASS_RT (1)
 這是即時 I/O 類。此排程類比任何其他類都具有更高的優先順序:來自此類的程序每次都首先訪問磁碟。因此,需要謹慎使用此 I/O 類:一個 I/O 即時程序可能會使整個系統飢餓。在即時類中,有 8 個類資料(優先順序)級別,這些級別確定此程序每次服務需要磁碟多長時間。最高的即時優先順序級別是 0;最低的是 7。將來這可能會更改為更直接地對映到效能,方法是傳入所需的傳輸速率。
IOPRIO_CLASS_BE (2)
 這是盡力而為排程類,它是任何未設定特定 I/O 優先順序的程序的預設值。類資料(優先順序)決定程序將獲得多少 I/O 頻寬。盡力而為優先順序級別類似於 CPU 良好值(參見 getpriority(2))。優先順序級別決定了與盡力而為排程類中其他程序的相對優先順序。優先順序級別範圍從 0(最高)到 7(最低)。
IOPRIO_CLASS_IDLE (3)
 這是空閒排程類。執行在此級別的程序僅在沒有其他人需要磁碟時才獲得 I/O 時間。空閒類沒有類資料。將此優先順序類分配給程序時需要謹慎,因為它如果高優先順序程序不斷訪問磁碟,則可能會被餓死。
有關 CFQ I/O 排程程式和示例程式的更多資訊,請參閱 Documentation/block/ioprio.txt

設定 I/O 優先順序所需的許可權

更改程序優先順序的許可權是根據兩個斷言授予或拒絕的
標籤描述
程序所有權
 非特權程序只能設定其真實 UID 與呼叫程序的真實或有效 UID 匹配的程序的 I/O 優先順序。具有 CAP_SYS_NICE 功能的程序可以更改任何程序的優先順序。
所需的優先順序是什麼
 嘗試設定非常高的優先順序 (IOPRIO_CLASS_RT) 或非常低的優先順序 (IOPRIO_CLASS_IDLE) 需要 CAP_SYS_ADMIN 功能。
ioprio_set() 的呼叫必須遵循這兩個規則,否則呼叫將失敗並出現錯誤 EPERM

錯誤

Glibc 尚未提供合適的標頭檔案來定義此頁面上描述的函式原型和宏。可以在 linux/ioprio.h 中找到合適的定義。

參見

核心原始碼樹中的 Documentation/block/ioprio.txt

previous next Printer Friendly

廣告


  

廣告



廣告
© . All rights reserved.