SCHED - Linux手册页

时间:2019-08-20 18:02:01  来源:igfitidea点击:

Linux程序员手册 第7部分
更新日期: 2019-08-02

名称

sched-CPU调度概述

说明

从Linux 2.6.23开始,默认的调度程序是CFS,即"完全公平的调度程序"。 CFS调度程序替换了早期的" O(1)"调度程序。

API summary

Linux提供以下系统调用,以控制CPU调度行为,策略和进程(或更准确地说,线程)的优先级。

nice(2)
为调用线程设置一个新的nice值,并返回新的nice值。
getpriority(2)
返回线程,进程组或指定用户拥有的线程集的精确值。
setpriority(2)
设置线程,进程组或指定用户拥有的线程集的值。
sched_setscheduler(2)
设置指定线程的调度策略和参数。
sched_getscheduler(2)
返回指定线程的调度策略。
sched_setparam(2)
设置指定线程的调度参数。
sched_getparam(2)
获取指定线程的调度参数。
sched_get_priority_max(2)
返回指定调度策略中可用的最大优先级。
sched_get_priority_min(2)
返回指定调度策略中可用的最小优先级。
sched_rr_get_interval(2)
提取用于在"循环"调度策略下调度的线程的数量。
sched_yield(2)
使调用者放弃CPU,以便执行其他一些线程。
sched_setaffinity(2)
(特定于Linux)设置指定线程的CPU关联性。
sched_getaffinity(2)
(特定于Linux)获取指定线程的CPU关联性。
sched_setattr(2)
设置指定线程的调度策略和参数。此(特定于Linux的)系统调用提供了sched_setscheduler(2)和sched_setparam(2)功能的超集。
sched_getattr(2)
获取指定线程的调度策略和参数。此(特定于Linux的)系统调用提供了sched_getscheduler(2)和sched_getparam(2)功能的超集。

Scheduling policies

调度程序是内核组件,它决定接下来将由CPU执行哪个可运行线程。每个线程都有一个关联的调度策略和一个静态调度优先级sched_priority。调度程序基于调度策略的知识和系统上所有线程的静态优先级进行决策。

对于根据常规调度策略(SCHED_OTHERSCHED_IDLE,SCHED_BATCH)之一调度的线程,sched_priority不在调度决策中使用(必须指定为0)。

根据一种实时策略(SCHED_FIFO,SCHED_RR)调度的进程的sched_priority值在1(低)到99(高)之间。 (如数字所示,实时线程始终比普通线程具有更高的优先级。)请注意:POSIX.1要求实现至少支持实时策略的最低32个不同优先级,并且某些系统仅提供此功能。最低。可移植程序应使用sched_get_priority_min(2)和sched_get_priority_max(2)查找特定策略支持的优先级范围。

从概念上讲,调度程序为每个可能的sched_priority值维护一个可运行线程的列表。为了确定下一步运行哪个线程,调度程序将查找具有最高静态优先级的非空列表,并在该列表的开头选择线程。

线程的调度策略确定将其以相等的静态优先级插入到线程列表中的位置以及如何在列表中移动。

所有调度都是抢先的:如果具有较高静态优先级的线程准备就绪,可以运行当前正在运行的线程,并返回其静态优先级的等待列表。调度策略仅在具有相同静态优先级的可运行线程列表中确定顺序。

SCHED_FIFO: First in-first out scheduling

SCHED_FIFO只能在静态优先级高于0的情况下使用,这意味着当SCHED_FIFO线程变为可运行时,它将始终立即抢占任何当前正在运行的SCHED_OTHER,SCHED_BATCH或SCHED_IDLE线程。 SCHED_FIFO是一种简单的调度算法,无需进行时间分片。对于根据SCHED_FIFO策略调度的线程,适用以下规则:

1)
已被另一个更高优先级的线程抢占的正在运行的SCHED_FIFO线程将以其优先级停留在列表的开头,并在再次阻止所有更高优先级的线程后将立即恢复执行。
2)
当阻塞的SCHED_FIFO线程变为可运行时,它将根据优先级插入列表的末尾。
3)
If a call to sched_setscheduler(2),

sched_setparam(2),

sched_setattr(2),

pthread_setschedparam(3),

or
pthread_setschedprio(3)

changes the priority of the running or runnable
SCHED_FIFO

thread identified by
pid

the effect on the thread's position in the list depends on
the direction of the change to threads priority:

*
如果提高了线程的优先级,则将其放在新优先级列表的末尾。因此,它可能会抢占具有相同优先级的当前正在运行的线程。
*
如果线程的优先级不变,则其在运行列表中的位置不变。
*
如果线程的优先级降低,则将其放在新优先级列表的前面。
根据POSIX.1-2008,使用pthread_setschedprio(3)以外的任何机制更改线程的优先级(或策略)都应导致该线程按其优先级放在列表的末尾。
4)
调用sched_yield(2)的线程将放在列表的末尾。

没有其他事件会在静态优先级相等的可运行线程的等待列表中移动根据SCHED_FIFO策略调度的线程。

SCHED_FIFO线程将一直运行,直到被I / O请求阻止,被更高优先级的线程抢占或调用sched_yield(2)。

SCHED_RR: Round-robin scheduling

SCHED_RR是SCHED_FIFO的简单增强。上面针对SCHED_FIFO所述的所有内容也适用于SCHED_RR,不同之处在于,每个线程只允许在最大时间范围内运行。如果SCHED_RR线程已经运行了等于或大于时间范围的时间段,则将其放在优先级列表的末尾。 SCHED_RR线程已被较高优先级的线程抢占,并随后在运行线程时恢复执行,将完成其循环时间范围的未到期部分。可以使用sched_rr_get_interval(2)检索时间量的长度。

SCHED_DEADLINE: Sporadic task model deadline scheduling

从3.14版开始,Linux提供了截止日期调度策略(SCHED_DEADLINE)。当前,此策略是使用GEDF(全球最早截止日期优先)与CBS(恒定带宽服务器)一起实施的。要设置和获取此策略及相关属性,必须使用特定于Linux的sched_setattr(2)和sched_getattr(2)系统调用。

零星任务是具有一系列任务的任务,每个任务每个周期最多激活一次。每个作业还具有一个相对的截止日期(在该截止日期之前应完成执行)和一个计算时间,该时间是执行该作业所需的CPU时间。由于必须执行新作业而唤醒任务的时刻称为到达时间(也称为请求时间或释放时间)。开始时间是任务开始执行的时间。因此,通过将相对期限添加到到达时间来获得绝对期限。

下图阐明了这些术语:

arrival/wakeup                    absolute deadline
     |    start time                    |
     |        |                         |
     v        v                         v
-----x--------xooooooooooooooooo--------x--------x---
              |<- comp. time ->|
     |<------- relative deadline ------>|
     |<-------------- period ------------------->|

使用sched_setattr(2)为线程设置SCHED_DEADLINE策略时,可以指定三个参数:运行时,截止日期和期间。这些参数不一定与上述术语相对应:通常的做法是将"运行时"设置为比平均计算时间(或硬实时任务的最坏情况执行时间)更长的时间,将"最后期限"设置为相对期限,将"期限"设置为任务期限。因此,对于SCHED_DEADLINE调度,我们有:

arrival/wakeup                    absolute deadline
     |    start time                    |
     |        |                         |
     v        v                         v
-----x--------xooooooooooooooooo--------x--------x---
              |<-- Runtime ------->|
     |<----------- Deadline ----------->|
     |<-------------- Period ------------------->|

这三个期限调度参数分别对应于sched_attr结构的sched_runtime,sched_deadline和sched_period字段。请参阅sched_setattr(2)。这些字段以纳秒为单位表示值。如果将sched_period指定为0,则使其与sched_deadline相同。

内核要求:

sched_runtime

另外,在当前实施方式下,所有参数值都必须至少为1024(即刚好超过一微秒,这是实施方式的分辨率),并且小于2 ^ 63。如果这些检查中的任何一个失败,则sched_setattr(2)都会失败,并显示错误EINVAL。

CBS通过限制试图超出其指定运行时的线程来保证任务之间的不干扰。

为了确保有期限的调度保证,内核必须防止在给定的约束范围内SCHED_DEADLINE线程集不可行(可调度)的情况。内核因此在设置或更改SCHED_DEADLINE策略和属性时执行导纳测试。该入学测试计算更改是否可行;如果不是,则sched_setattr(2)失败,并显示错误EBUSY。

例如,要求(但不一定足够)总利用率必须小于或等于可用的CPU总数,其中,由于每个线程可以在"每个周期"中最大化地运行,因此该线程的利用率是其运行时间除按其时期。

为了实现在将线程加入SCHED_DEADLINE策略时所做出的保证,SCHED_DEADLINE线程是系统中最高优先级(用户可控制)的线程。如果任何SCHED_DEADLINE线程是可运行的,它将抢占根据其他策略之一调度的任何线程。

由SCHED_DEADLINE策略调度的线程对fork(2)的调用失败,并显示错误EAGAIN,除非该线程设置了其"分叉复位"标志(请参见下文)。

调用sched_yield(2)的SCHED_DEADLINE线程将产生当前作业,并等待新的时期开始。

SCHED_OTHER: Default Linux time-sharing scheduling

SCHED_OTHER只能以静态优先级0使用(即,实时策略下的线程始终比SCHED_OTHER进程具有优先级)。 SCHED_OTHER是标准的Linux分时调度程序,适用于不需要特殊实时机制的所有线程。

基于仅在此列表内确定的动态优先级,从静态优先级0列表中选择要运行的线程。动态优先级基于适当的值(请参见下文),并且每次线程准备运行时都会增加,但调度程序拒绝运行它。这样可以确保所有SCHED_OTHER线程之间取得公平的进展。

在Linux内核源代码中,SCHED_OTHER策略实际上被命名为SCHED_NORMAL。

The nice value

nice值是一个属性,可用于影响CPU调度程序在调度决策时赞成或反对进程。它会影响SCHED_OTHER和SCHED_BATCH(请参见下文)进程的调度。可以使用nice(2),setpriority(2)或sched_setattr(2)修改nice值。

根据POSIX.1,nice值是每个进程的属性;也就是说,进程中的线程应该共享一个不错的值。但是,在Linux上,nice值是每个线程的属性:同一进程中的不同线程可能具有不同的nice值。

nice值的范围在UNIX系统上有所不同。在现代Linux上,范围是-20(高优先级)到+19(低优先级)。在某些其他系统上,范围是-20..20。早期的Linux内核(在Linux 2.0之前)的范围是-infinity..15。

好的值影响SCHED_OTHER进程的相对调度的程度在UNIX系统和Linux内核版本之间也不同。

随着内核2.6.23中CFS调度程序的出现,Linux采用了一种算法,该算法会导致漂亮值的相对差异产生更强的效果。在当前的实现中,两个进程的nice值的每个单位差异导致调度程序偏爱优先级更高的进程的程度为1.25。每当系统上有其他更高优先级的负载时,这都会导致极低的理想值(+19)真正为进程提供很少的CPU,并使较高的理想值(-20)为需要它的应用程序提供大部分CPU(例如某些音频应用程序)。

在Linux上,可以使用RLIMIT_NICE资源限制来定义一个限制,可以将非特权进程的好值提高到该限制;有关详细信息,请参见setrlimit(2)。

有关nice值的更多详细信息,请参阅下面有关自动分组功能和分组调度的小节。

SCHED_BATCH: Scheduling batch processes

(从Linux 2.6.16开始。)SCHED_BATCH仅可用于静态优先级0。此策略与SCHED_OTHER类似,因为它根据线程的动态优先级(基于nice值)调度线程。区别在于,此策略将使调度程序始终假定线程占用大量CPU。因此,调度程序将对唤醒行为施加较小的调度代价,从而使该线程在调度决策中受到轻微影响。

此策略对于非交互式但又不想降低其合理价值的工作负载,以及需要确定性调度策略而又不会引起交互(导致工作负载之间的任务)的交互的工作负载很有用。

SCHED_IDLE: Scheduling very low priority jobs

(从Linux 2.6.23开始。)SCHED_IDLE仅可以在静态优先级0上使用;否则,不能使用。过程良好的值对此策略没有影响。

该策略旨在以极低的优先级运行作业(对于SCHED_OTHER或SCHED_BATCH策略,该值甚至低于+19 nice值)。

Resetting scheduling policy for child processes

每个线程都有一个"分叉重置"调度标志。设置此标志时,fork(2)创建的子代不会继承特权调度策略。可以通过以下任一方式来设置前叉复位标志:

*
在调用sched_setscheduler(2)时,将SCHED_RESET_ON_FORK标志与策略参数进行或运算(从Linux 2.6.32开始);要么
*
在调用sched_setattr(2)时在attr.sched_flags中指定SCHED_FLAG_RESET_ON_FORK标志。

请注意,这两个API所使用的常量具有不同的名称。可以使用sched_getscheduler(2)和sched_getattr(2)类似地检索叉上复位标志的状态。

"分叉重置"功能专用于媒体播放应用程序,可用于通过创建多个子进程来防止应用程序逃避RLIMIT_RTTIME资源限制(请参阅getrlimit(2))。

更准确地说,如果设置了分叉重置标志,则以下规则适用于随后创建的子代:

*
如果调用线程的调度策略为SCHED_FIFO或SCHED_RR,则该策略将在子进程中重置为SCHED_OTHER。
*
如果调用进程的负值尼斯值,则子进程中的尼斯值将重置为零。

启用"分叉复位"标志后,仅当线程具有CAP_SYS_NICE功能时,才能将其复位。在fork(2)创建的子进程中禁用此标志。

Privileges and resource limits

在2.6.12之前的Linux内核中,只有特权(CAP_SYS_NICE)线程可以设置非零静态优先级(即,设置实时调度策略)。非特权线程可以进行的唯一更改是设置SCHED_OTHER策略,并且只有在调用者的有效用户ID与目标线程的实际或有效用户ID(即pid指定的线程)匹配时,才能执行此操作正在更改其政策。

必须设置一个线程特权(CAP_SYS_NICE)才能设置或修改SCHED_DEADLINE策略。

从Linux 2.6.12开始,RLIMIT_RTPRIO资源限制为SCHED_RR和SCHED_FIFO策略的非特权线程的静态优先级定义了上限。更改调度策略和优先级的规则如下:

*
如果非特权线程的软限制RLIMIT_RTPRIO不为零,则它可以更改其调度策略和优先级,但前提是不能将优先级设置为高于其当前优先级和RLIMIT_RTPRIO软限制的最大值的限制。
*
如果RLIMIT_RTPRIO软限制为0,则唯一允许的更改是降低优先级或切换到非实时策略。
*
遵循相同的规则,只要进行更改的线程的有效用户ID与目标线程的实际或有效用户ID相匹配,另一个非特权线程也可以进行这些更改。
*
特殊规则适用于SCHED_IDLE策略。在2.6.39之前的Linux内核中,无论RLIMIT_RTPRIO资源限制的值如何,在此策略下运行的非特权线程都无法更改其策略。从2.6.39开始的Linux内核中,无特权线程可以切换到SCHED_BATCH或SCHED_OTHER策略,只要它的好值落在其RLIMIT_NICE资源限制所允许的范围内(请参阅getrlimit(2))。

特权(CAP_SYS_NICE)线程忽略RLIMIT_RTPRIO限制;与较早的内核一样,它们可以对调度策略和优先级进行任意更改。有关RLIMIT_RTPRIO的更多信息,请参见getrlimit(2)。

Limiting the CPU usage of real-time and deadline processes

SCHED_FIFO,SCHED_RR或SCHED_DEADLINE策略下调度的线程中的无阻塞无限循环可能会潜在地阻止所有其他线程永远访问CPU。在Linux 2.6.25之前,防止失控的实时进程冻结系统的唯一方法是(在控制台上)运行以比测试的应用程序更高的静态优先级调度的shell。这样可以紧急终止未按预期阻塞或终止的经过测试的实时应用程序。

从Linux 2.6.25开始,还有其他技术可以处理失控的实时和截止时间流程。其中之一是使用RLIMIT_RTTIME资源限制来设置实时进程可能消耗的CPU时间的上限。有关详细信息,请参见getrlimit(2)。

从2.6.25版本开始,Linux还提供了两个/ proc文件,可用于保留一定数量的CPU时间,以供非实时进程使用。以这种方式保留CPU时间允许将一些CPU时间分配给(例如)可用于杀死失控进程的根shell。这两个文件都以毫秒为单位指定时间值:

/proc/sys/kernel/sched_rt_period_us
该文件指定的调度周期等于100%CPU带宽。该文件中的值的范围可以从1到INT_MAX,给出的操作范围是1微秒到35分钟左右。该文件的默认值为1,000,000(1秒)。
/proc/sys/kernel/sched_rt_runtime_us
该文件中的值指定系统上所有实时和截止时间计划的进程可以使用多少"时间"时间。此文件中的值的范围可以从-1到INT_MAX-1。指定-1将使运行时间与时间段相同;也就是说,没有为非实时进程预留CPU时间(这是内核2.6.25之前的Linux行为)。该文件中的默认值为950,000(0.95秒),这意味着5%的CPU时间被保留用于不在实时或截止时间调度策略下运行的进程。

Response time

等待I / O的高优先级阻塞线程在重新调度之前有一定的响应时间。设备驱动程序编写器可以通过使用"慢中断"中断处理程序来大大减少此响应时间。

Miscellaneous

子进程沿fork(2)继承调度策略和参数。调度策略和参数在execve(2)中保留。

实时过程通常需要使用内存锁定来避免分页延迟。这可以通过mlock(2)或mlockall(2)完成。

The autogroup feature

从Linux 2.6.38开始,内核提供了一种称为自动分组的功能,可以在面对多进程,占用大量CPU的工作负载时提高交互式桌面性能,例如使用大量并行构建进程(即make(1))构建Linux内核。 -j标志)。

此功能与CFS调度程序一起运行,并且需要使用CONFIG_SCHED_AUTOGROUP配置的内核。在正在运行的系统上,可以通过文件/ proc / sys / kernel / sched_autogroup_enabled启用或禁用此功能。值0禁用该功能,而值1启用它。除非使用noautogroup参数引导内核,否则该文件的默认值为1。

通过setsid(2)创建新会话时,将创建一个新的自动组。例如,当启动新的终端窗口时,就会发生这种情况。 fork(2)创建的新进程继承了其父级的自动组成员身份。因此,会话中的所有进程都是同一自动组的成员。当组中的最后一个进程终止时,自动组将被自动销毁。

启用自动分组后,自动分组的所有成员都放在同一内核调度程序"任务组"中。 CFS调度程序采用一种算法,该算法可均衡任务组中CPU周期的分配。可以通过以下示例来描述此方法对于交互式桌面性能的好处。

假设有两个自动组争用同一CPU(即假定一个CPU系统或使用tasket(1)将所有进程限制在SMP系统上的同一CPU上)。第一组包含以make-j10开头的内核构建中的十个与CPU绑定的进程。另一个包含一个受CPU约束的进程:一个视频播放器。自动分组的作用是,两组将各自接收一半的CPU周期。也就是说,视频播放器将获得50%的CPU周期,而不是仅仅9%的周期,这很可能导致视频播放质量下降。 SMP系统上的情况更为复杂,但是总体效果是相同的:调度程序将CPU周期分布在各个任务组中,这样,包含大量CPU绑定进程的自动组就不会浪费CPU周期了系统上其他作业的数量。

可以通过文件/ proc / [pid] / autogroup查看进程的自动组(任务组)成员资格:

$ cat /proc/1/autogroup
/autogroup-1 nice 0

该文件还可用于修改分配给自动组的CPU带宽。这是通过在文件" nice"范围内写入一个数字来设置自动组的nice值来完成的。允许的范围是+19(低优先级)到-20(高优先级)。 (超出此范围的值将导致write(2)失败,并显示错误EINVAL。)

autogroup nice设置的含义与进程nice值的含义相同,但是基于其他自动组的相对nice值,适用于将CPU周期分配给整个autogroup。对于自动组内部的进程,其收到的CPU周期将是自动组的nice值(与其他自动组相比)与该进程的nice值(与同一自动组中的其他进程相比)的乘积。

使用cgroups(7)CPU控制器将进程放置在根CPU cgroup以外的cgroup中会覆盖自动分组的效果。

自动分组功能仅对在非实时策略(SCHED_OTHER,SCHED_BATCH和SCHED_IDLE)下调度的进程进行分组。它不会将根据实时和截止时间策略调度的进程进行分组。这些过程是根据前面描述的规则安排的。

The nice value and group scheduling

在调度非实时进程(即在SCHED_OTHER,SCHED_BATCH和SCHED_IDLE策略下调度的进程)时,如果内核配置了CONFIG_FAIR_GROUP_SCHED选项(典型情况下),则CFS调度程序采用称为"组调度"的技术。 )。

在组调度下,线程在"任务组"中调度。任务组具有层次结构关系,该关系植根于系统上的初始任务组(称为"根任务组")。在以下情况下组成任务组:

*
CPU cgroup中的所有线程均组成一个任务组。该任务组的父级是相应父级cgroup的任务组。
*
如果启用了自动分组功能,则(隐式)放置在自动分组中(即,由setsid(2)创建的同一会话)的所有线程均构成一个任务组。因此,每个新的自动组都是一个单独的任务组。根任务组是所有此类自动组的父级。
*
如果启用了自动分组,则根任务组将由根CPU cgroup中的所有进程组成,否则这些进程将不会隐式放置到新的自动组中。
*
如果禁用了自动分组,则根任务组将由根CPU cgroup中的所有进程组成。
*
如果禁用了组调度(即在配置内核时未配置CONFIG_FAIR_GROUP_SCHED),则系统上的所有进程在概念上都将置于单个任务组中。

在组调度下,线程的nice值仅对相对于同一任务组中的其他线程的决策调度效果。就UNIX系统上nice值的传统语义而言,这产生了一些令人惊讶的结果。特别是,如果启用了自动分组(这是各个发行版中的默认设置),则在进程上使用setpriority(2)或nice(1)仅对相对于同一会话中执行的其他进程进行调度有影响(通常是:相同的终端窗口)。

相反,对于两个进程(例如),它们是不同会话中唯一受CPU约束的进程(例如,不同的终端窗口,每个窗口的工作与不同的自动组相关联),则在其中一个会话中修改该进程的值在调度程序相对于另一会话中的过程的决策方面没有影响。此处可能有用的解决方法是使用以下命令修改终端会话中所有进程的autogroup nice值:

$ echo 10 > /proc/self/autogroup

Real-time features in the mainline Linux kernel

从内核版本2.6.18开始,Linux逐渐配备了实时功能,其中大多数功能是从以前的实时抢先补丁集衍生而来的。在将补丁完全合并到主线内核之前,必须先安装补丁才能获得最佳的实时性能。这些补丁名为:

patch-kernelversion-rtpatchversion

并可以从以下位置下载

在没有补丁的情况下,并且在将补丁完全包含到主线内核之前,内核配置仅提供三个抢占类CONFIG_PREEMPT_NONE,CONFIG_PREEMPT_VOLUNTARY和CONFIG_PREEMPT_DESKTOP,它们分别不提供,不提供某些服务,并且可以大大减少最坏情况下的调度延迟。

应用补丁或将补丁完全包含在主线内核中之后,附加配置项CONFIG_PREEMPT_RT变为可用。如果选择此选项,则Linux将转换为常规的实时操作系统。然后,FIFO和RR调度策略用于以真正的实时优先级和最小的最坏情况调度延迟运行线程。

备注

cgroups(7)CPU控制器可用于限制进程组的CPU消耗。

最初,标准Linux旨在用作通用操作系统,能够处理后台进程,交互式应用程序以及要求不高的实时应用程序(通常需要满足时间期限的应用程序)。尽管Linux内核2.6允许进行内核抢占,并且新引入的O(1)调度程序确保了调度所需的时间是固定的和确定性的,而不管活动任务的数量如何,但直到内核版本2.6为止,无法进行真正的实时计算.17。

另外参见

chcpu(1),chrt(1),lscpu(1),ps(1),taskset(1),top(1),getpriority(2),mlock(2),mlockall(2),munlock(2), munlockall(2),nice(2),sched_get_priority_max(2),sched_get_priority_min(2),sched_getaffinity(2),sched_getparam(2),sched_getscheduler(2),sched_rr_get_interval(2),sched_setaf sched_setscheduler(2),sched_yield(2),setpriority(2),pthread_getaffinity_np(3),pthread_getschedparam(3),pthread_setaffinity_np(3),sched_getcpu(3),功能(7),cpuset(7)

面向现实世界的编程-POSIX.4,由O'Reilly&Associates,Inc.的Bill O. Gallmeister提供,ISBN 1-56592-074-0。

Linux内核源文件Documentation / scheduler / sched-deadline.txt,Documentation / scheduler / sched-rt-group.txt,Documentation / scheduler / sched-design-CFS.txt和Documentation / scheduler / sched-nice-design。文本

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/