如何找出 I/O 任务是否绑定在 linux 内核中?

How to find out whether task is I/O bound in linux kernel?

我正在尝试为 linux 内核 (version 2.4.27) 实施调度程序,并且我正在尝试找出任务是 CPU 绑定还是 I/O 绑定。有什么 variables/function 可以用来获取此信息吗?

如果谈论 O(1) 调度程序:

一个进程可以根据它在 CPU.

上 运行 的时间片被确定为 CPU 边界或 I/O 边界

每个进程在允许它在处理器上调度之前都将设置其默认时间片 (100ms)。

一个进程被称为 CPU 绑定进程,如果这个进程消耗完整的时间片(运行 处理器上的整个时间片)。

类似地,任何不消耗其整个时间片但会在其时间片 运行-out、 之前调用 sched_yield 的进程,如果进程waits/sleeps有任何事件发生,那么调度器将被调用将其推入休眠队列,这意味着它正在等待某些I/O发生,是一个I/O绑定进程。

每个这样的 CPU 绑定进程将被优先惩罚,保持时间片相同,每个这样的 I/O 绑定进程将被优先级奖励,保持时间片相同.

因此,在 GPOS(通用操作系统)上,effective_priority 或 dynamic_priority 会告诉您进程是否正常运行(I/O 绑定) 或行为不端(CPU 绑定进程),因为新进程的默认优先级将为 20,除非以其他方式更改。

有一些参数是根据它来判断的,同样可以判断。

effective_prio: Returns 任务的有效优先级(基于静态优先级,但包括任何奖励或惩罚)。

recalc_task_prio:根据空闲时间决定任务的奖励或惩罚。

参考:https://www.cs.columbia.edu/~smb/classes/s06-4118/l13.pdf