美文网首页
同步、异步、阻塞、非阻塞

同步、异步、阻塞、非阻塞

作者: 追梦小蜗牛 | 来源:发表于2020-09-28 17:47 被阅读0次
    image.jpg

    介绍:

    同步IO、异步IO、阻塞IO、非阻塞IO的简单理解笔记。
    对于一个network IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的process (or thread),另一个就是系统内核(kernel)。当一个read操作发生时,它会经历两个阶段:

    • 等待数据准备 (Waiting for the data to be ready)
    • 将数据从内核拷贝到进程中 (Copying the data from the kernel to the process)

    blocking IO:

    用户进程在进行系统调用(recvfrom)的时候,系统在进行底层IO操作的时候,用户进程会一直处于阻塞状态的。


    image.png

    nonblockingIO:

    用户进程在进行系统调用(recvfrom)的时候,系统依然要进行底层IO的操作,底层操作包括两部分:1、数据准备 2、把数据从内核空间拷贝到用户空间。


    image.png

    IO multiplexing:

    IO多路复用,就是一个main reactor(一个线程),一个sub reactor,多个socket注册到selector上面并阻塞着直到有可read字节或者可write字节可用;然后从sub reactor 线程池里面选取一个线程用来处理这个socket里面的内容。


    image.png

    synchronous IO:

    A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes;

    asynchronous IO :

    An asynchronous I/O operation does not cause the requesting process to be blocked;
    用户进程在进行系统调用(recvfrom)的时候,会直接返回,然后进程就可以做自己的事情;当IO操作处理完成的时候,会通知用户的。


    image.png

    区别:

    image.png

    两者的区别就在于synchronous IO做”IO operation”的时候会将process阻塞。按照这个定义,之前所述的blocking IO,non-blocking IO,IO multiplexing都属于synchronous IO。有人可能会说,non-blocking IO并没有被block啊。这里有个非常“狡猾”的地方,定义中所指的”IO operation”是指真实的IO操作,就是例子中的recvfrom这个system call。non-blocking IO在执行recvfrom这个system call的时候,如果kernel的数据没有准备好,这时候不会block进程。但是,当kernel中数据准备好的时候,recvfrom会将数据从kernel拷贝到用户内存中,这个时候进程是被block了,在这段时间内,进程是被block的。而asynchronous IO则不一样,当进程发起IO 操作之后,就直接返回再也不理睬了,直到kernel发送一个信号,告诉进程说IO完成。在这整个过程中,进程完全没有被block。

    总结:

    IO操作其实也就是对字节进行read和write,读进来,写出去;IO模型有很多种,每一种都用对应的场景;然后再进行编码、解码,转换成应用对象,接下来进行对应的业务逻辑处理。

    相关文章

      网友评论

          本文标题:同步、异步、阻塞、非阻塞

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