1.概念整理:
同步(异步),阻塞(非阻塞):
关于这两类概念,不知是否可以不用区分的太清楚,网上也是众说纷纭,自我总结下:
都是涉及事件的流程是否依赖于当前正在运行的事件是否结束,但是在java中,同步异步貌似更多涉及任务调度,而阻塞与非阻塞更加注重单个事件请求方面。
2.IO操作:
IO操作一般分为:硬盘读写,socket读写以及对外设的读写
其步骤通常可以分为两步:
1.查看数据是否就绪
2.进行数据拷贝
阻塞(非阻塞)IO:
根据查看数据是否就绪分为阻塞和非阻塞IO,阻塞就是要一直等待数据就绪,而非阻塞就是不需要等待,直接返回给调用者是否就绪
比如java里面socket的read就是阻塞IO函数
同步(异步)IO
同步(异步)IO是根据任务调度来说的
同步IO是指一个线程进行IO操作,在IO操作完成之前,线程会被阻塞,反之即为异步IO
3.IO模型:
IO模型分为阻塞IO,非阻塞IO,多路复用IO,信号驱动IO,异步IO
着重了解下多路复用IO和异步IO
多路复用IO:
典型案例:使用一个线程来管理多个socket。即一个线程轮询socket的状态,只有当socket可以进行读写时,才会进行实际的IO读写操作。
java NIO实际上就是多路复用的IO,相比与多线程+阻塞IO的操作,多路复用只需要使用一个线程
异步IO:
IO的两步操作都不会引起线程阻塞。
4.IO设计模式
经典模式:
多线程+线程池
高性能模式(Reactor,Proactor):
多路复用IO:Reactor模式
异步IO:Proactor模式