I/O分类和作用

6 篇文章 0 订阅
2 篇文章 0 订阅

I/O作用

在这里插入图片描述
I/O通信指的是将数据从数据源传输到接收端。

I/O分类

在这里插入图片描述

磁盘IO延迟主要有:磁盘寻道+块传输延迟,一般在5ms。
网络IO主要延时有: 服务器响应延时 + 带宽限制 + 网络延时 + 跳转路由延时 + 本地接收延时 决定。(一般为几十到几千毫秒,受环境干扰极大)
通过适当增大磁盘缓冲区大小和选择磁盘存储方式两个方面可以提升磁盘IO效率,增大磁盘缓冲区的大小,每次读取和写入的数据量增大,减少了磁盘访问的频率,顺序存储方式效率明显高于随机存储效率。
网络IO主要延迟在网络传输上,可以通过减少网络通信次数和减小传输的数据量提高网络IO通信效率,降低网络通信次数指的是,能一起请求得到的结果,尽量放在一起,但有可能导致单次传输的数据量过大,整体上来说提高了客户端和服务器端的传输效率,但单次传输数据量过大,可能导致增加单次传输时间;减少传输数据量指的是,在传输之前相对数据进行压缩,在本地解压缩的效率明显高于直接将不压缩原始数据传输的效率。

JAVA I/0 分类(BIO)

rmark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbm9vZGxlc19tZWU=,size_20,color_FFFFFF,t_70,g_se,x_16)

在这里插入图片描述
Java IO包中面向流(字节流和字符流)的读写方式都是阻塞式方式,也即BIO。

JDK 1.4 引入NIO包和原来IO区别

IO和NIO读取数据方式流程
在这里插入图片描述
IO和NIO读取数据原理图
在这里插入图片描述
IO和NIO模型对比
在这里插入图片描述

NIO从channel向buffer中读取数据时,当数据没有准备好的时候,线程并没有阻塞,而是采用轮询的方式检查数据是否准备好,准备好则从channel中读取数据。NIO缺点是:由于将数据从channel读取到buffer中的时机无法确定,所以要不断从buffer中获取数据,看自己需要的数据全部加入到缓存区中,将数据从磁盘通过channel写入到缓冲区是由操作系统完成(待确认todo。。。)
BIO使用场景: 单个连接的带宽很大,需要传输大量的数据,例如文件上传/下载,Java中对应网络IO的BIO实现是Socket/ServerSocket。
NIO使用场景: 服务器需要同时管理数千个连接,每个链接的数据量很少,例如聊天系统,Java中对应网络IO的的NIO实现是SocketChannel和ServerSocketChannel。
使用BIO,每个客户端请求服务器都要创建一个线程负责,在完成响应之前,服务器端的线程不能再接收客户端请求,为了可以实现一个服务可以同时响应多个请求,可以为每个请求创建一个线程实现,线程的创建和销毁都是一个重量级操作,为了防止线程创建过多将服务器资源耗尽,当单机线程连接数不超过1000,可以使用线程池设置最大线程数解决,使用该方法的弊端就是严重依赖线程数量,设置太小,会导致大量请求处理不过来,最大线程数设置过多将失去线程池创建的意义。
创建过多线程出现的问题:
1、线程创建和销毁成本高,创建一个线程需要占用512K~1M的内存,创建大量线程对JVM内存占用过高,程序正常执行可用空间将变小。
2、线程上限文切换需要消耗大量CPU资源。
3、容易造成锯齿状的系统负载(不是很懂。。。)。

NIO中三个核心组件-channel、buffer、selctor

NIO包中常见的channel

Channel的直接和具体要读取的数据源相连,可以理解为IO通信时的文件描述符。
FileChannel :读取文件的channel
DatagramChannel:通过UDP协议读取网络中的信号
SocketChannel:通过TCP读取网络中的传输的信息
ServerSocketChannel:服务器为每个连接的客户端建立一个channel

缓冲区

和通道直接相连的是缓冲区,缓冲区连接了数据源和接收端之间的通道。缓冲区的作用可以理解为仓库,商家下单时不用等待,厂商可以直接将仓库做好的鞋子发给商家,然后再对仓库进行补充。在I/O中,数据源提前准备好一部分数据放在缓冲区,接收端有I/O请求时,直接从缓冲区取数据,减少了阻塞等待的时间。
从缓冲区Buffer中读取数据和向缓冲区写数据的过程
在这里插入图片描述

上图页同时说明了NIO可以进行双向读写,而单个BIO链接只能读或只能写。

选择器selector

多个channel注册到selector中,selector采用轮询的方式检查每个通道是否可读、可写,实现一个线程同时处理多个channel,避免为一个channel一个线程时引起的上下文切换,其中一个线程处理多个连接的方式称为多路复用(mutiplexing),多路指多个连接,复用同一个线程,实现方式有三种。
1、select:使用轮询方式查询注册到Selector中就绪的文件连接,连接数(x86-1024,x64-2048)。
2、poll:也是采用轮询方式,连接数使用链表实现,和select最大区别时不再限制链接数量,相同点都是要进行轮询的方式判断哪个channel已经就绪,可以进行读写。
3、epoll:采用回调方式实现。
其中epoll的实现采用了事件驱动模型,将每个连接实例作为一个请求,事件驱动模型在UI应用广发应用。
其中Reactor是事件驱动模型的一种实现,Reactor模型主要由Reactor、acceptor和handler三部分组成。
Reactor: 相应所有io请求,可以有多个.
acceptor: 建立连接,只有一个。
handler: 有多个。
Reacotr有三种模型,通过改变处理handler线程的数量和reactor数量,也就是常说的线程模型,第一种是单Reactor+处理handler的线程有一个。
在这里插入图片描述
应用场景:redis线程模型,javaNIO线程模型。
第二种:单reactor+多线程模型
在这里插入图片描述

应用场景:tomcat线程模型,缺点是当同一时间请求非常多是,主线程处理所有网络事件,例如accptor建立连接阻塞,可能造成阻塞。
第三种,主从reactor+多线程处理handler
在这里插入图片描述
Nginx和netty中模型,将处理后的数据返回给客户端也交有subreactor执行。

AIO模型

在这里插入图片描述

NIO模型中非阻塞指的是读取I/O操作是非阻塞的,但是在处理期间,客户端对服务器请求依然保持连接,客户端会同步阻塞等待服务器的相应。AIO是将请求注册到服务器操作系统中,客户端随后就会处理自己的事情,等处理完毕,操作系统通知客户端响应数据准备完毕。真正实现了异步I/O请求。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值