目录
1.五种IO模型
1.0介绍
IO指读写磁盘或Socket数据,以读为例,分为2个阶段:第一阶段(数据准备),数据复制到内核中;第二阶段(数据拷贝),数据从内核拷贝到应用进程。
1.1阻塞IO
应用进程阻塞到第一和第二阶段完成
举例:A用的是最老式的鱼竿,所以呢,得一直守着,等到鱼上钩了再拉杆
1.2非阻塞IO
第一阶段通过轮询询问内核数据是否准备好,准备好了进入第二阶段,应用进程仍会阻塞在第二阶段
举例:B的鱼竿有个功能,能够显示是否有鱼上钩,所以呢,B就和旁边的MM聊天,隔会再看看有没有鱼上钩,有的话就迅速拉杆
1.3IO复用
第一阶段使用select监听多个IO,当有IO数据准备好,让其进入第二阶段(阻塞),然后继续监听IO
举例:C用的鱼竿和B差不多,但他想了一个好办法,就是同时放好几根鱼竿,然后守在旁边,一旦有显示说鱼上钩了,它就将对应的鱼竿拉起来
1.4信号驱动式IO
开始第一阶段时提交一个信号标识,当第一阶段完成时,将信号标识返回给信号处理程序,然后信号处理程序进行IO第二阶段(阻塞)
1.5异步IO
需要操作系统支持(不同系统上,底层支持不同),IO第一和第二阶段均由内核完成,IO完成后,信号处理程序进行后续业务处理
举例:D是个有钱人,干脆雇了一个人帮他钓鱼,一旦那个人把鱼钓上来了,就给D发个短信
2.Reactor与Proactor
2.1 Reactor
很多地方叫反应器模式,并发系统常使用reactor模式,代替常用的多线程的处理方式,节省系统的资源,提高系统的吞吐量。
例如:在高并发的情况下
多线程的处理:为每个单独到来的请求,专门启动一条线程,这样的话造成系统的开销很大,并且在单核的机上,多线程并不能提高系统的性能,除非在有一些阻塞的情况发生。否则线程切换的开销会使处理的速度变慢。
Reactor模式的处理:服务器端启动一条单线程,用于轮询IO操作是否就绪,当有就绪的才进行相应的读写操作,这样的话就减少了服务器产生大量的线程,也不会出现线程之间的切换产生的性能消耗。(目前JAVA的NIO就采用的此种模式,这里引申出一个问题:在多核情况下NIO的扩展问题)
以上两种处理方式都是基于同步的,多线程的处理是我们传统模式下对高并发的处理方式,Reactor模式的处理是现今面对高并发和高性能一种主流的处理方式。
1单线程模型
2多线程模型
3多Reactor多线程模型
2.2 Proactor
运用于异步I/O操作,Proactor模式中,应用程序不需要进行实际的读写过程,它只需要从缓存区读取或者写入即可,操作系统会读取缓存区或者写入缓存区到真正的IO设备.
3.Java IO 技术
3.1 BIO
基于流(单向)读写文件和Socket,如:InputStream、OutputStream、ServerSocket、Socket
3.2 NIO
基于通道(双向)读写文件和Socket,如:FileChannel、ServerSocketChannel、SocketChannel
核心组件:Selector、Channel、Buff
3.3 AIO
NIO2.0,异步IO