美文网首页Other
IO模型资料整理与理解

IO模型资料整理与理解

作者: ZX_周雄 | 来源:发表于2019-12-29 18:05 被阅读0次
    image

    It shows that the main difference between the first four models is the first phase, as the second phase in the first four models is the same: the process is blocked in a call to recvfrom while the data is copied from the kernel to the caller's buffer. Asynchronous I/O, however, handles both phases and is different from the first four

    参考资料

    下面列出参考资料,以及资料里边对于IO Models观点的整理。基本上,各方资料就是对上图的各角度阐述

    unix_network_programming IO Models

    POSIX defines these two terms as follows:

    • A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes.
    • An asynchronous I/O operation does not cause the requesting process to be blocked.

    Using these definitions, the first four I/O models—blocking, nonblocking, I/O multiplexing, and signal-driven I/O—are all synchronous because the actual I/O operation (recvfrom) blocks the process. Only the asynchronous I/O model matches the asynchronous I/O definition.

    IO-Models

    阻塞 (Blocking) 与非阻塞 (Non-Blocking) 描述的是请求在等待结果时的状态

    • 阻塞 (Blocking):调用的程序或应用程序发起请求,在获得结果之前,调用方的程序会悬(Hang)住不动,无法响应,直到获得结果
    • 非阻塞 (Non-Blocking):概念与阻塞相同,但是调用方不会因为等待结果,而悬着不动。后续通常透过轮询机制(Polling)取得结果

    同步 (Synchronous) 与 非同步 (Asynchronous) 描述的是:使用者执行端与 Kernel 的 通讯模式

    • 同步 (Synchronous):使用者执行端发出I / O请求后,要等待、或者轮询Kernel I / O的操作完成后,才能继续执行。
      • 等待Kernel回复:Blocking IO,简称 BIO
      • 轮询类似于Non-Blocking IO,简称 NIO
    • 非同步 (Asynchronous):或称异步,用户执行端发出I / O请求后仍继续执行下一个操作,当Kernel I / O操作结束后,会通知执行端,或者调用回调函数

    asynchronous-vs-non-blocking

    • synchronous / asynchronous is to describe the relation between two modules
    • blocking / non-blocking is to describe the situation of one module

    架构设计:系统间通信(4)——IO通信模型和JAVA实践 中篇

    • 什么叫做“同步IO”。实际上一句话就可以说清楚:只有上层(包括上层的某种代理机制)系统询问我是否有某个事件发生了,否则我不会主动告诉上层系统事件发生了
    • 异步IO则是采用“订阅-通知”模式:即应用程序向操作系统注册IO监听,然后继续做自己的事情。当操作系统发生IO事件,并且准备好数据后,在主动通知应用程序,触发相应的函数

    网络编程释疑之:同步,异步,阻塞,非阻塞

    • 阻塞,非阻塞:进程/线程要访问的数据是否就绪,进程/线程是否需要等待;
    • 同步,异步:访问数据的方式,同步需要主动读写数据,在读写数据的过程中还是会阻塞;异步只需要I/O操作完成的通知,并不主动读写数据,由操作系统内核完成数据的读写

    参考了多篇文章之后,个人对IO-Models的看法

    阻塞、非阻塞:描述的是请求方需要的数据未准备就绪时,要不要等待(一个人的寂寞)

    • 阻塞:要等待,体现在Linux上就是进程会进入到waiting状态(非Java Thread State)
    • 非阻塞:不等待

    同步、异步:描述的是两个事物之间的通信方式,可能是两个线程(池)、也可能是一个线程之内不同的执行态,取决于操作系统具体实现(两个人的错)

    • 同步,意味着需要协同两个事物之间的步调,需要一方主动等待另一方,表现的方式就是block住(即便不block,也需不断polling),只有这样,才能保持一定的步调(画话音:是同步导致了等待,并以阻塞的形式表现,而不是因为阻塞,所以同步)
    • 异步,意味着不需要协调二者的步调,请求方可以继续往下执行应用程序代码,不再需要询问数据是否就绪,只需当数据准备好之后,由另一方推送给请求方

    同步与异步还有一个特性在unix_network_programming没有明确表示出来,但却可以推断:

    1. Blocking I/O model: 询问数据是否到达,到达后取数据
    2. Nonblocking I/O model: 来回咨询数据是否达到,到达后取数据
    3. I/O multiplexing model: 通过其他途径(select)询问数据是否到达,到达后取数据
    4. Signal-Driven I/O model: 通过一些手段(sigaction)告知数据准备方,当数据准备好的时候,通知请求方来取数据
    5. Asynchronous I/O model: 通过另外手段(aio_read)告知数据准备方,当数据准备好的时候,直接读取,并将数据推送给请求方

    由上可知,同步需要请求方主动去取数据,而异步是请求方被动等待数据送达

    另外,从严格意义上,不存在同步非阻塞这种说法,网上流传的同步非阻塞,大抵上是为了强调请求方在wait for data阶段不阻塞recvfrom的特性。而实际上,在data copy阶段,同步调用仍然会阻塞于recvfrom。因此听到同步非阻塞这个概念时候,不需刻意去纠正谁对谁错,只要大家在理解上达成一致,明白描述是同一件事即可

    相关文章

      网友评论

        本文标题:IO模型资料整理与理解

        本文链接:https://www.haomeiwen.com/subject/nlxuoctx.html