IO 模型

1.相关概念

相关概念 
1.1阻塞和非阻塞:阻塞和非阻塞在访问数据时候,数据内是否准备就绪的一种处理方式,当数据没有准备的时候。阻塞:需要等待缓冲区准备好后才处理其他事情,否则一直等待。非阻塞:当我们进程访问我们的数据缓冲区时候,数据没有准备好的时候,直接返回,不需要等待数据。 
1.2同步和异步:同步和异步都是基于应用程序和操作系统处理I/O时间锁采用的方式,比如同步应用程序要直接参与I/O读写操作,异步所有的I/O的读写都是交给了操作系统去做。同步的方式在处理IO事件的时候必须阻塞在某个方法上面等待我们的I/O时间完成(阻塞I/O事件或则通过轮询的I/O事件);对于异步来说,所有的I/O操作都交给了操作系统,程序可以继续往下执行,当操作系统完成I/O后给我们应用程序一个通知就可以了。

2.linux 几种I/O模型

几种IO模型

2.1阻塞 I/O:阻塞到read或者write,程序会被阻塞在这里,不不能继续继续执行,一般使用线程来解决。 
2.2非阻塞I/O:指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。 
2.3I/O复用:I/O复用 (select/poll模式)把读写事件交给一个单独线程来处理,这个线程会顺序扫描监听的fd(效率比较低),看是否处于就绪状态。select/poll,是扫描fd是否就绪,而且支持的fd数量有限;Linux 还提供了一个epoll 系统调用,epoll 使用基于事件驱动方式代替轮询,因此性能更高。

2.4I/O信号驱动I/O:信号驱动IO模型主要是在UDP套接字上使用。首先要开启套接口信号驱动I/O功能,并通过系统调用sigaction 执行信号处理函数(非阻塞的)。当有数据准备就绪时候(或者出错),就会给进程发SIGIO信号,因此我们很容易判断SIGIO出现的时候,如果不是发生错误,那么就是有数据报到达了。 
2.4 异步I/O:告知内核某个启动操作,并让内核在整个操作完成后(包括将数据从内核复制到用户自己的缓存区),通知我们。这种模型与信号驱动模型的主要区别是:信号驱动I/O是由内核通知我们何时可以开始一个I/O 操作;异步I/O模型由内核通知我们I/O操作何时已经完成。

3.javaI/O模型

在JDK1.4以前使用的都是BIO(阻塞IO),通过线程来提供性能,对于线程的本身的开销就是浪费。 
NIO: 在JDK1.4 借鉴linux(select 模式)实际的轮询机制,同步非阻塞的模式。 
AIO(异步I/O):JDK1.7 借鉴Linux epoll模式,异步非阻塞I/O。 
对于网络通信而言,NIO、AIO并没有改变网络通信的基本步骤,只是在原来的基础上(ServerSocket,Socket)做一个改进。 
对于读和写采用抽象的管道的概念,通道与流的不同之处在于通道是双向的,流只是在一个方向移动,而通道是全双工的可以用于读、写或者二者同时进行。 
NIO通信框架
原理:通过selctor(选择器,本质就是多路I/O复用),就相当于一个管家,管理所有的I/O事件,Connection、accept、客服端和服务端的读写IO事件。 
selctor是如何管理IO事件的 
当IO事件注册我给我们选择器的时候,选择器会给他们分配一个key(可以简单理解成一个时间的标签),当IO事件完成通过可以值来找到相应的管道,然后通过管道发送和接收数据。 
数据缓冲区:通过bytebuffer,提供读写方法。在NIO中所有的数据都是用缓冲区处理的。在读取数据时候,它是直接读取到缓冲区中的;写入数据,写入到缓冲区的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值