linux - 如何找出任务是否在 linux 内核中绑定(bind)了 I/O?

标签 linux linux-kernel scheduled-tasks

我正在尝试为 linux 内核(版本 2.4.27)实现调度程序,并且我正在尝试找出任务是 CPU 绑定(bind)还是 I/O 绑定(bind)。是否有任何变量/函数可用于获取此信息?

最佳答案

如果说 O(1) 调度器:

一个进程可以根据它在 CPU 上运行的时间片来确定它是 CPU bound 还是 I/O bound。

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

如果进程消耗完整时间片(在处理器上运行整个时间片),则该进程称为 CPU 绑定(bind)进程。

类似地,任何不消耗其整个时间片但会在其时间片用完之前调用 sched_yield 的进程,,如果进程等待/休眠任何事件发生,然后调用调度程序将其插入 sleep 队列,这意味着它正在等待一些 I/O 发生,是一个 I/O 绑定(bind)进程。

每个此类 CPU 密集型进程将受到优先级惩罚,保持时间片相同,并且每个此类 I/O 密集型进程将获得优先级奖励,保持时间片相同。

因此,在 GPOS(通用操作系统)上,它是 effective_priority 或 dynamic_priority,它将告诉您进程是行为良好(I/O 绑定(bind))还是行为不良(CPU 绑定(bind)进程),如新进程的默认优先级为 20,除非另有更改。

有一些参数可以根据它来判断。

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

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

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

关于linux - 如何找出任务是否在 linux 内核中绑定(bind)了 I/O?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33490593/

相关文章:

spring - 在 Spring 使用@Schedule

java - 等待 ScheduledExecutorService 中的事件

C++ Shell 多管道不工作?

java - 树莓派和 Java 安装

c++ - 使用terminfo的终端颜色?

docker - Google的Container Optimized OS内置哪些内核选项?

c - 如何在 Linux 内核中生成 "artificial"中断?

linux - 我应该在时间函数上使用 "real"还是 "user+sys"?

android - 制作 Android 内核 - 模块准备

ruby - 在不同服务器上执行多项任务的作业