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) 组件。
有关调度类和优先级的更多信息,请参见“注释”部分。

读取和同步(O_DIRECT、O_SYNC)写入支持 I/O 优先级。异步写入不支持 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 nice 值(参见 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

广告


  

广告



广告