首先明确一下定义:

  同步,异步:同步异步指的是一种通信方式

  阻塞,非阻塞:阻塞非阻塞是一种线程的工作模式

 

在IO中明确的有5种IO模型,这5种IO模型又有以下的分别

*参考的代码示例(偷懒用):https://www.cnblogs.com/smith-wang/p/15151381.html

同步IO:

  阻塞式IO模型(阻塞式IO模型一般情况下称呼为BIO,即使Block IO):

   A.阻塞IO模型   

                首先说说阻塞式的IO,阻塞式IO简单示例:

 while (true){
            //利用循环不停的监听用户的消息
            Socket socket= serverSocket.accept();
            service(socket);
}

               这里中间经过了accept(),accept()请求会让CPU处于一个等待的状况,等到内核空间准备好数据,然后复制到用户空间,这里全程都是阻塞的形式,中间从内核空间复制到用户空间需要多少时间,系统就必须在这里等到多少时间。

              *差点写错了,幸好问了人,用户空间和内核空间这个东西在Windows以及Linux中都是有的

    *https://blog.csdn.net/qq_34827674/article/details/113876849?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_v2~rank_aggregation-3-113876849.pc_agg_rank_aggregation&utm_term=windows+%E5%86%85%E6%A0%B8%E7%A9%BA%E9%97%B4&spm=1000.2123.3001.4430

 

     B;IO复用模型

    IO复用模型 或者可以称呼为事件驱动模型,是在IO非阻塞式模型上进行升级的。主要是在IO等待数据响应这一块增加了一个中间的线程,由中间的线程去管理所有的消息,然后进行事件的分发。这个中间线程也就是所谓的“Reactor”,用户在Reactor进行注册,Reactor进行统一的管理,接收到消息后向对应的注册对象通过事件的形式将消息发送过去。这样,用户这一块只需要进行一个注册,就可以去处理其他事项了, 有消息过来会由Reactor进行通知。

  非阻塞式IO模型(非阻塞式IO模型一般情况下称呼为NIO,即Non-Block Io,这里的Nio并不是New IO的意思):

    A:非阻塞IO模型

               非阻塞式IO其实整体和阻塞式IO的差异就在【等待数据到达】这一部分,在阻塞式IO的模式下,【等待数据到达-->内核空间复制到用户空间-->进程提取数据】这是一个完整的部分,而非阻塞式IO在【等待数据到达】这里进行了轮训操作,CPU会立刻返回【是否有数据】的结果,有数据再进入【内核空间复制到用户空间-->进程提取数据】这个部分,而等待过程中线程的资源就可以执行其他的操作。

         B:信号驱动IO模型

    信号驱动的IO模型这一块和非阻塞IO的区别在于,不在需要进行轮训,IO首次请求是向内核发送一个需求,然后就不需要关注结果,内核得到需求的数据后会通过一个信号的方式将信息通知到用户,用户收到信号后立刻去处理。*这个需要操作系统支持

异步IO

  异步IO模型

    异步IO模型和信号驱动是类似的,主要的差别部分在于信号驱动是准备完成后进行通知,异步IO是在数据从内核复制到用户区完成后的最终阶段进行通知,但是这个异步IO模型用的比较少,主要原因在于大部分操作系统不支持,目前只有Windows的IOCP是支持的

 

通常的情况下,用的更多的是同步的IO模型,其中NIO是目前比较常用的。

异步IO模型相对情况下用的会比较少