内部无限循环' do_select' Linux内核的功能

时间:2015-03-29 15:40:22

标签: linux unix linux-kernel

我很惊讶Linux内核在“do_select”中有无限循环。功能实现。这是正常的做法吗?

此外,我对如何在Linux内核中实现文件更改监控感兴趣?它又是无限循环吗?

select.c source code

1 个答案:

答案 0 :(得分:4)

这不是一个无限循环;该术语保留用于没有退出条件的循环。这个循环在中间中有退出条件:http://lxr.linux.no/#linux+v3.9/fs/select.c#L482这是C中非常常见的习语。它被称为"循环和半个"这里有一个简单的伪代码示例:https://stackoverflow.com/a/10767975/388520清楚地说明了为什么要这样做。 (那个问题谈到了Java,但这并不重要;这是一个通用的结构化编程习惯用法。)

我不是内核专家,但是这个特殊的循环似乎是用这种方式编写的,因为内部循环的逻辑需要在调用{{}之前和之后运行1}}在外循环的最底部。该代码正在检查是否有任何事件要返回;如果在调用poll_schedule_timeout时有已经事件要返回,它应该立即返回;如果最初没有,那么select会返回。因此在正常操作中,外环应循环0.5或1.5次。 (可能存在边缘情况,其中外循环的循环次数多于此。)我可能已经选择将内循环拉出到它自己的函数,但这可能涉及将指针传递给太多的局部变量。

这也不是 spin 循环,我的意思是,CPU不会浪费电力检查事件一次又一次,直到一个发生。如果控件到达poll_schedule_timeout的调用时没有要报告的事件,那么该函数(通过最终调用__schedule)将导致调用线程阻止 - CPU被从该线程中移除并分配给另一个可以对其执行有用操作的进程。 (如果有 no 进程需要CPU,它将被置于低功耗状态"停止"直到下一个中​​断触发。)当其中一个事件发生时发生,或超时,调用poll_schedule_timeout的线程将被唤醒"被唤醒"并且select将返回。

从更大的角度来看,操作系统内核通常会在其他工程目标(效率,代码重用,避免竞争条件)的服务中做一些被认为是奇怪的,糟糕的风格甚至是错误的事情。发生在某些CPU上,...)它们是由那些知道完全他们正在做什么的人编写的,完全他们可以在多大程度上违反规则。您可以通过阅读操作系统代码学到很多东西,但是在您获得更多经验之前,您可能不应该尝试模仿它。你不会尝试将詹姆斯乔伊斯的风格作为你的第一次创意写作练习,ne?同样的交易。