同步/异步和阻塞/非阻塞的区别

同步、异步:
概念:消息的通知机制

解释:涉及到IO通知机制;所谓同步,就是发起调用后,被调用者处理消息,必须等处理完才直接返回结果,没处理完之前是不返回的,调用者主动等待结果;所谓异步,就是发起调用后,被调用者直接返回,但是并没有返回结果,等处理完消息后,通过状态、通知或者回调函数来通知调用者,调用者被动接收结果。

阻塞、非阻塞:
概念:程序等待调用结果时的状态

解释:涉及到CPU线程调度;所谓阻塞,就是调用结果返回之前,该执行线程会被挂起,不释放CPU执行权,线程不能做其它事情,只能等待,只有等到调用结果返回了,才能接着往下执行;所谓非阻塞,就是在没有获取调用结果时,不是一直等待,线程可以往下执行,如果是同步的,通过轮询的方式检查有没有调用结果返回,如果是异步的,会通知回调。

经典故事案例:
人物:老张
道具:普通水壶(水烧开不响);响水壶(水烧开发出响声)
案例:
1、同步阻塞:
老张在厨房用普通水壶烧水,一直在厨房等着(阻塞),盯到水烧开(同步);
2、异步阻塞:
老张在厨房用响水壶烧水,一直在厨房中等着(阻塞),直到水壶发出响声(异步),老张知道水烧开了;
3、同步非阻塞:
老张在厨房用普通水壶烧水,在烧水过程中,就到客厅去看电视(非阻塞),然后时不时去厨房看看水烧开了没 (轮询检查同步结果);
4、异步非阻塞:
老张在厨房用响水壶烧水,在烧水过程中,就到客厅去看电视(非阻塞),当水壶发出响声(异步),老张就知道 水烧开了。

注意:
1、通常的IO、NIO操作,都是同步的;
2、JDK1.7提供了AIO异步操作的类,如AsynchronousSocketChannel、AsynchronousServerSocketChannel等;
Java也可以通过多线程,在开启的线程中,通过回调方式,实现异步操作。

网络IO的模型大致包括下面几种

同步模型(synchronous IO)
##1.阻塞IO(bloking IO)
##2.非阻塞IO(non-blocking IO)
##3.多路复用IO(multiplexing IO)
##4.信号驱动式IO(signal-driven IO)
异步IO(asynchronous IO)
##异步IO

网络IO的本质是socket的读取,socket在linux系统被抽象为流,IO可以理解为对流的操作。

对于一次IO访问,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间,所以一般会经历两个阶段:

  1. 等待所有数据都准备好或者一直在等待数据,有数据的时候将数据拷贝到系统内核;
  2. 将内核缓存中数据拷贝到用户进程中;
    对于socket流而言:
  3. 等待网络上的数据分组到达,然后被复制到内核的某个缓冲区;
  4. 把数据从内核缓冲区复制到应用进程缓冲区中;

转载自:https://blog.csdn.net/linhuaiyang/article/details/68483222
关于IO的详细介绍见:https://www.cnblogs.com/George1994/p/6702084.html

你可能感兴趣的:(网络,同步异步,阻塞非阻塞,IO,NetWork)