本博文后续将介绍五种IO模型,并介绍linux,window提供的多路复用机制,Java的BIO,NIO,AIO的底层机制(同步阻塞,非阻塞,多路复用,异步IO)
同步,异步,阻塞,非阻塞概念
同步和异步:描述的是用户线程与内核的交互方式(消息通信机制)
阻塞和非阻塞:描述的是程度等等结果时的状态(调用者的状态)
同步:用户线程发起IO需要等待(调用者主动等待这个调用的结果)
异步:用户线程发起IO请求后仍然继续执行,当内核操作完成后会通知用户线程,或者调用用户线程注册的回调函数
阻塞:在调用结果返回之前,调用者的执行线程会挂起,线程不能做其它事情,只有等待结果返回才能往下执行
非阻塞:IO操作被调用后立即返回给调用者一个状态值,无需等待IO操作彻底完成
同步和异步的实际差别
访问数据的方式,同步需要当前线程读写数据,在读写数据的过程中还是会阻塞,异步只需要IO操作完成的通知,当前线程不主动读写数据,由操作系统内核完成数据的读写(后续在介绍各种的模式的时候,会发现在第二个阶段,同步依然需要线程发起,内核才进行数据的拷贝)
模式
内存空间分用户空间和内核空间,用户进程无法直接操作底层硬件,只能将请求提交给CPU,由CPU去执行
进程(线程)将请求提交给CPU,等待CPU返回数据(两段式的过程)
1 等待数据准备:内核从IO设备将数据拷贝至内存空间的Buffer中
2 内核将数据从内部的Buffer中拷贝至进程空间
CPU在内部IO时,会为每一个IO设备维护一个Buffer,等待数据输入到Buffer,从Buffer复制到进程内存空间,都需要时间,根据等待模式分为:
blocking IO 阻塞式IO 两段都阻塞
nonblocking IO 非阻塞式IO 第一段不阻塞,第二段阻塞 (不断轮询,去查看内核是否准备好,准备好后就接着处理)
IO multiplexing IO多路复用 两段都阻塞(区别于第一种,一个线程管理多个连接)
signal driver IO 信号驱动IO 第一段不阻塞,第二段阻塞 (区别于第二种 不进行轮询,内核准备好后通过信号通知用户进程,去发起系统调用)
asynchrounus IO 异步IO 两段都不阻塞