Asynchronous 是否所有异步I/O最终都在轮询中实现?

Asynchronous 是否所有异步I/O最终都在轮询中实现?,asynchronous,io,Asynchronous,Io,我一直认为异步I/O总是有一个回调形式。但最近我发现一些低级实现使用轮询式API 这让我想到,也许所有(或大部分)异步I/O(文件、套接字、mach端口等)最终都是以轮询方式实现的。也许回调表单只是更高级API的抽象 这可能是一个愚蠢的问题,但我不知道大多数异步I/O实际上是如何在低级别实现的。我刚刚使用了系统级通知,当我看到kqueue-这是系统通知时,它是一种轮询方式 我应该如何理解低级异步I/O如何从低级轮询系统发出高级异步通知?(如果确实如此)在最低(或至少,最低值得一看)硬件级别,

我一直认为异步I/O总是有一个回调形式。但最近我发现一些低级实现使用轮询式API

  • 这让我想到,也许所有(或大部分)异步I/O(文件、套接字、mach端口等)最终都是以轮询方式实现的。也许回调表单只是更高级API的抽象

    这可能是一个愚蠢的问题,但我不知道大多数异步I/O实际上是如何在低级别实现的。我刚刚使用了系统级通知,当我看到
    kqueue
    -这是系统通知时,它是一种轮询方式

    我应该如何理解低级异步I/O如何从低级轮询系统发出高级异步通知?(如果确实如此)

    在最低(或至少,最低值得一看)硬件级别,异步操作在现代操作系统中确实是异步的

    例如,当您从磁盘读取文件时,操作系统会将对
    read
    的调用转换为一系列磁盘操作(查找位置、读取块X到Y等)。在大多数现代操作系统上,这些命令要么被写入特殊寄存器,要么被写入主内存中的特殊位置,磁盘控制器会被告知有操作挂起。然后,操作系统继续其业务,当磁盘控制器完成分配给它的所有操作时,它会触发一个事件,导致请求读取的线程从停止的位置重新开始

    不管您所看到的是哪种类型的低级异步操作(磁盘I/O、网络I/O、鼠标和键盘输入等),最终都会有一个阶段将命令发送到硬件,直到硬件伸出并通知操作系统该操作已完成,才会执行原来的“回调”,通常以中断的形式

    这并不是说不存在使用轮询实现的异步操作。异步实现任何阻塞操作的一种简单(但简单且昂贵)方法就是生成一个线程,等待操作完成(可能是在紧循环中轮询),然后在完成后调用回调。不过,一般来说,操作系统级别的常见异步操作是真正异步的

    还值得一提的是,仅仅因为API是阻塞的并不意味着它是轮询的:您可以将阻塞API放在异步操作上,将非阻塞API放在同步操作上。例如,对于
    select
    和kqueues之类的东西,线程实际上只是进入睡眠状态,直到发生有趣的事情。“有趣的事情”以中断的形式出现(通常),这表明操作系统应该唤醒相关线程以继续工作。它不只是坐在那里等着什么事情发生


    真的没有办法仅仅从系统的API来判断系统是使用轮询还是“真正的”回调(如中断),但是是的,有一些异步API是真正由异步操作支持的。

    如果这个问题不适合这个问题,那么我能问一个更好的地方来发布这个问题吗?(例如:其他SE站点,如程序员或Unix和Linux…)有趣的问题。不是很适合Stackoverflow格式,但我不打算关闭它。。。因为我想听到一些答案!“中断”是一个非常相关的词