IO模型呀

IO流
java中IO流分为几种
(1)按照流的流向分,可以分为输入流和输出流
(2)按照操作单元划分,可以分为字节流和字符流。
(3)按照流的角色可以分为节点流和处理流。
常见的3中IO模型
BIO(blocking I/O):同步阻塞IO模型
同步阻塞IO模型中,当应用程序发起read之后,会一直阻塞,直到在内核把数据拷贝到用户空间,
它在连接数比较少的情况下,是比较适用的。
缺点:一个线程维护一个IO,当并发量大的时候要创建大量的线程来维护网络连接,内存、线程开销非常大。
在这里插入图片描述
NIO(Non-blocking-IO)
NIO同步非阻塞模型,是在java1.4的时候引入的NIO框架,对应java.nio包,提供了channel,buffer,selector等抽象。它是支持面向缓冲的,基于通道的IO操作方法。它它支持同步阻塞和同步非阻塞两种模式,对于高并发、高负债的应用,应使用NIO的非阻塞模式来开发。

在同步非阻塞的IO模型中,应用程序会不断地发起read调用,等待数据从内核拷贝到用户空间的这段时间,线程依旧是阻塞的,直到内核把数据拷贝到内存空间。
相较于BIO,NIO在轮询的时候线程不会阻塞。缺点是长时间的轮询操作也会造成CPU资源浪费。

NIO也可以看做是一个IO多路复用模型,线程首先会发起一个select调用,询问内核中的数据准备好了没有,当内核中的数据准备好了之后,用户线程再发起read调用,read调用的过程也是阻塞的。
缓冲区 buffer
缓冲区是一段内存空间,在NIO库中,所有数据都是用缓冲区处理的。在读取数据的时候是直接从缓冲区中读取数据,在写入数据的时候也是直接写入到缓冲区。
通道channel
通道和传统IO的Stream相似。主要区别为通道是双向的,通过一个通道,既可以读也可以写。但是Stream只能进行单向操作,通过一个Stream只能进行读或写。InputStream\outputstream.
选择器selector
selector提供了可以选择已经就绪的任务的能力。selector可以不断的轮询注册在上面的所有channel,如果发现某个channel已经为读写做号了准备,那么就处于就绪状态,进行后序的IO操作。一个selector可以同时轮询多个channel,这样的话就可以用一个线程管理多个网络连接,避免多线程上下文切换的开销。

select poll epoll的区别
select的时间复杂度为o(n),在有IO事件发生后,它不清楚是哪一个流,就会采用无差别轮询所有流。
poll时间复杂度也是o(n),它和select一样,也是将用户传入的数据拷贝到内核空间,然后查询每个fd对应的状态。
epoll时间复杂度是o(1),因为epoll会把哪个流发生的IO事件通知给我们。
但是呢,select有几个缺点:
监听的IO最大连接数有限,在Linux系统上一般为1024。
select函数返回后,是通过遍历fdset,找到就绪的描述符fd。(仅知道有I/O事件发生,却不知是哪几个流,所以遍历所有流)
需要维护一个用来存放大量fd的数据结构,使得用户空间和内核空间在传递该结构的时候复制开销比较大。
poll本质上和select没有区别,它没有最大的连接数限制,因为它是由链表存储的。
epoll先通过epoll_ctl()来注册一个fd(文件描述符),一旦基于某个fd就绪时,内核会采用回调机制,迅速激活这个fd,当进程调用epoll_wait()时便得到通知。这里去掉了遍历文件描述符的坑爹操作,而是采用监听事件回调的机制。这就是epoll的亮点。
epoll有epollLT和epollET两种模式,LT是默认模式,ET是高速模式,LT模式下,只有这个fd还有数据,每次epoll_wait都会返回它的事件。而ET模式下,read一个fd的话一次就要把它的buffer读光。
在这里插入图片描述

AIO
AIO是改进版的NIO,它实现了异步非阻塞IO模型。异步IO是基于事件和回调机制实现的,也就是应用程序操作完成之后会直接返回,不会阻塞在那里,当后台处理完成,操作系统会通知相应的线程进行后序操作。它的应用不是很广泛。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值