五种IO模型

目录

1.五种IO模型

1.0介绍

1.1阻塞IO

1.2非阻塞IO

1.3IO复用

1.4信号驱动式IO

1.5异步IO

2.Reactor与Proactor

2.1 Reactor

2.2 Proactor

3.Java IO 技术

3.1 BIO

3.2 NIO

3.3 AIO


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值