linux - 像 select() 或 poll() 这样的系统调用在幕后是如何工作的?

标签 linux sockets asynchronous io

我知道通过 select()poll() 的异步 I/O 操作不使用处理器时间,即它不是一个繁忙的循环,但这些到底是怎么回事在引擎盖下实现?它是否以某种方式在硬件中得到支持,这就是为什么使用这些处理器没有太多明显的处理器成本的原因吗?

最佳答案

这取决于 select/poll 正在等待什么。让我们考虑一些情况;为了简化起见,我将假设一台单核机器。

首先,考虑 select 正在等待另一个进程的情况(例如,另一个进程可能正在执行一些计算,然后通过管道输出结果)。在这种情况下,内核会将您的进程标记为等待输入,因此它不会为您的进程提供任何 CPU 时间。当其他进程输出数据时,内核会唤醒你的进程(在CPU上给它时间),以便它可以处理输入。即使另一个进程仍在运行,这也会发生,因为现代操作系统使用抢占式多任务处理,这意味着内核会定期中断进程,让其他进程有机会使用 CPU(“时间片” ").

select 等待 I/O 时,图片发生变化;例如网络数据或键盘输入。在这种情况下,虽然过时的硬件必须让 CPU 旋转以等待输入,但所有现代硬件都可以将 CPU 本身置于低功耗“等待”状态,直到硬件提供中断 - 一个特殊的handled 内核处理的事件。在中断处理程序中,CPU 将记录传入的数据,并在从中断返回后唤醒您的进程以允许其处理数据。

关于linux - 像 select() 或 poll() 这样的系统调用在幕后是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11496059/

相关文章:

linux - 在 openstack 上使用 ansible 实现网络自动化

linux - 循环中的函数会破坏每隔一次迭代

c++ - 关于so​​cket编程中如何发送图片的问题?

javascript - 在 React 组件中等待异步函数并显示 Spinner

java - 在 java shell 上执行 Linux 命令 (mutt) 无法正常工作

sockets - 使用 phpmyadmin 同步两个数据库 - 此操作的 'socket' 是什么?

python - 使用 python 后端的客户端授权

javascript - 在列表上异步操作时保留结果顺序

java - 客户端 JAX-RS 异步请求

linux - 操作第一个字段,然后使用 awk 打印 csv 文件的其余行