2021-07-29

Java I/O工作机制

(Java I/O类库的基本框架、磁盘I/O工作机制、网络I/O工作机制(Socket)、NIO、异步同步、阻塞非阻塞、I/O优化技巧)

Java I/O类库:

传输数据格式、传输方式

  1. 基于字节操作:InputStream和OutputStream
  2. 基于字符操作:Writer和Reader
  3. 基于磁盘操作:File
  4. 基于网络操作:Socket(不在io包下)

2.2磁盘I/O工作机制

2.2.1 访问文件方式

  • 缓存机制:将从磁盘读取的文件按照一定的组织方式进行缓存,如果用户程序访问同一段磁盘地址空间数据,操作系统直接从内核缓存中直接读取返回给用户,减少I/O响应时间。
  • 标准访问文件方式:应用程序调用read()->操作系统检查内核高速缓存->有则读返回,无则从磁盘中读取并写入缓存返回; 写入:应用程序调用write()->数据从用户地址空间复制到内核地址空间缓存中->操作系统写入磁盘由自己决定(注意sync同步命令)
  • 直接I/O:通常使用在对数据的缓存管理由应用程序实现的数据库管理系统中。缺点:比较缓慢
  • 同步访问文件方式:对数据安全性较高场景中使用,且硬件定制。
  • 异步访问文件:提高应用程序效率,但不会改变访问文件的效率。
  • 内存映射方式:操作系统内存映射磁盘文件,减少数据从内核空间缓存到用户空间的数据复制操作。

2.2.2 Java访问磁盘文件

数据在磁盘中的单位描述:文件

2.2.3 Java序列化

将一个对象转化为一串二进制表示的字符数组,通过保存或转移这些数据来达到持久化的目的。复杂对象序列化处理:

  • 子类实现Serializable接口,父类没有,父类中属性无法序列化(不报错,数据丢失),子属性仍能被序列化。
  • 序列化属性对象,则对象也必须实现Serializable接口,否则报错
  • 反序列化时,如果对象属性删减,则修改部分属性丢失,不报错
  • 反序列化时:serialVersionUID修改,反序列化失败
  • 多语言环境下,尽量存储通用的数据结构,如JSON或者XML等。

2.3.1 TCP状态转化

  1. 三次握手:B:(LISTEN)
    A:我想和你讲话可以吗(SYN=1,seq=x,SYN-SENT)?
    B:好的,我准备好了(SYN=1,ACK=1,seq=y,ack=x+1(SYN-RCVD))。
    A:好的,我要讲话了(ACK=1,seq=x+1,ack=y+1(ESTABLISHED))。吧啦吧啦。。。
    为何要发送第三次确认?防止已经失效的链接请求突然又传送到了服务器(在网络节点中滞留时间过长),导致不必要的错误和资源浪费。
  2. 四次挥手:A:我不想和你讲话了(FIN=1,seq=u,FIN-WAIT-1)
    B:确定好的。(ACK=1,ack=u+1,CLOSE-WAIT,TCP服务器通知高层应用进程,客户端向服务器端方向释放,此状态持续一段时间.A(收到服务器确认请求后,客户端进入FIN-WAIT-2状态,等待服务器端发送链接释放)
    B:我的话也说完了,那再见吧?(FIN=1,ACK=1,seq=w,ack=u+1,LAST-ACK)
    A:嗯(ACK=1,ack=w+1,seq=u+1)B(CLOSED)
    A:time-wait(2*MSL最长报文段寿命)
    为何客户端最后等待2MSL?
    1保证客户端发送的最后一个ACK报文能够达到服务器,因为该ack报文可能丢失,站在服务器角度看,服务器重传,客户端可以收到重传报文,给出回应
    2使用本连接持续时间内产生所有的报文段都从网络中消失,新的连接中不会出现就链接的请求报文

2.3.2 影响网络传输的因素

  1. 网络带宽
  2. 传输距离
  3. TCP拥塞控制

2.3.3 Java Socket 工作机制

socket套接字描述计算机之间完成相互通信的一种抽象功能,把Socket比作两个城市之间的交通工具,有多种,可以理解为一种稳定的通信协议。

2.3.4建立通信链路

CS通信时,需先建立Socket实例,操作系统分配未被使用的端口号,并创建一个包含本地地址、远程地址和端口号的套接字数据结构,并进行三握手;服务器端创建SocketServer实例。

2.3.5数据传输

连接建立成功后,CS端拥有Socket实例,每个实例拥有InputStream和OutputStream,并且通过此二对象交换数据,操作系统会为此二对象建立缓冲区,读写操作通过此缓冲区完成。缓冲区大小以及读取速度影响连接传输效率,网络I/O具有协调过程,否则易发生死锁。

2.4NIO的工作方式

NIO和IO到底有什么区别?有什么关系?
首先说一下核心区别:
1.NIO是以块的方式处理数据,但是IO是以最基础的字节流的形式去写入和读出的。所以在效率上的话,肯定是NIO效率比IO效率会高出很多。
2.NIO不再是和IO一样用OutputStream和InputStream 输入流的形式来进行处理数据的,但是又是基于这种流的形式,而是采用了通道和缓冲区的形式来进行处理数据的。
3.还有一点就是NIO的通道是可以双向的,但是IO中的流只能是单向的。
4.还有就是NIO的缓冲区(其实也就是一个字节数组)还可以进行分片,可以建立只读缓冲区、直接缓冲区和间接缓冲区,只读缓冲区很明显就是字面意思,直接缓冲区是为加快 I/O 速度,而以一种特殊的方式分配其内存的缓冲区。
5.补充一点:NIO比传统的BIO核心区别就是,NIO采用的是多路复用的IO模型,普通的IO用的是阻塞的IO模型,两个之间的效率肯定是多路复用效率更高

I/O 调优

(磁盘I/O和网络I/O常用优化技巧)

2.5.1 磁盘I/O优化

  1. 性能检测:
    1)压力测试应用程序,查看系统I/O wait指标是否正常,Linux下通过iostat查看
    2)查看应用程序需要最低IOPS,磁盘IOPS是否达到需求(磁盘转速有关)
    3)RAID技术:将不同磁盘组合起来提升I/O性能
  2. 提升I/O性能
    1)增加缓存,减少磁盘访问次数
    2)优化磁盘管理系统,设计磁盘方式策略,寻址策略(底层操作系统层)
    3)设计合理的磁盘存储数据块,以及访问策略,应用层面考虑,如:给存放的数据设计索引,采用异步和非阻塞方式加快磁盘的访问速度。
    4)应用合理的RAID策略提升I/O

2.5.2 TCP网络参数调优

2.5.3 网络I/O优化

基本原则:1)减少网络交互次数:设计缓存;合并访问请求;2)减少网络中传输数据量大小:压缩数据;设计简单协议读取协议头获取有用价值信息;3)尽量减少编码:尽量提前将字符转化为字节。

  1. 同步与异步:前者保证可靠性,后者保证性能
  2. 阻塞与非阻塞:从CPU角度考虑,系统线程切换增加。需评估CPU使用时间能否补偿系统切换成本。
  3. 二者组合:
    1)同阻:常用,性能差,CPU大部分时间处于空闲状态
    2)同非阻:提升I/O性能常用手段,尤其:网络I/O长时间连接同时传输数据不多,非常有效,增加CPU消耗,考虑增加的I/O性能可否补偿CPU消耗。
    3)异阻;分布式数据库,可对网络I/O提升效率,尤其是写多分数据库情况。
    4)异非阻:集群之间的消息同步机制,适合同时传送多份相同的数据到达集群中不同的机器。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值