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

广告


  

广告



广告