nio的优势_1. NIO简介

最早的时候由于虚拟机的性能很差,所以很少有人去关注通讯的速度问题。大部分的问题都出现在了CPU的处理上。但随着硬件的性能提升,实际上CPU的处理速度增强了。

1. NIO概述


在前言的背景下,随后Java NIO(New IO)是从Java1.4版本开始引入的一组新的IO API(其核心构成有Channals,BUffers,selectors三部分),目的主要是基于这组API该删IO操作性能

2.NIO&IO分析

1.1 IO操作流程

对于一个IO(这里我们以read举例)操作而言,它会设计到两个系统对象,一个是调用这个IO的process(or thread),另一个就是系统内核(kernel)。当一个read操作发生时,该操作会经历两个阶段:

  • 将数据拷贝到操作系统内核Buffer。
  • 讲操作系统内核数据拷贝到用户进程。

1.2 面向流与面向缓冲区

Java NIO和IO之间第一个最大的区别是:IO是面向流的,NIO是面向缓冲区的。例如:

  • 面向流的操作(输入&输出流操作是单向的)
  • 面向缓冲区的擦偶作(操作是双向且可移动指针)

面向缓冲区的操作时,是缓冲区中的读写模式进行操作的,写模式用于向缓冲区写数据,读模式用于从缓冲区读。

1.3 阻塞与非阻塞

阻塞和非阻塞的概念描述的是用户线程调用内核IO操作的方式

  • 阻塞:是指调用操作需要等待结果的完成,同时会影响后操作的执行。 例如阻塞式IO操作,用户线程会在内核等待数据以及拷贝数据期间都属于阻塞状态。

d8443ff5ee3da679563c087e5d0097fb.png

用户线程向操作系统发起read请求,操作系统肯定需要从磁盘中去读数据(系统底层需要把磁盘中的内容读到磁盘驱动),这个过程操作系统处于等待的状态(操作系统在等待磁盘中的数据到磁盘驱动中的过程),操作系统拿到数据后把数据拷贝到操作系统中的内核(kernel)中。内核拿到数据后,还需要把数据拷贝到用户线程中去。整个过程中,用户线程一直处于阻塞的状态。这导致用户咋发起IO请求时,不能做任何事情,对CPU的利用率不够。

用户发起请求->操作系统访问磁盘-->磁盘驱动->操作系统内核->用户线程

话外音: 小李去或车站买票,排队两天后买到一张票。

非阻塞:是指IO操作被调用后立即返回给用户一个状态值(用户线程无需等待)。无需等到IO操作彻底完成。

6e1d780558166c1d1a6e9e060007d6c5.png

虽然用户线程每次发起IO请求后可以立即返回,但是为了等到数据,仍需要不断轮询、重复请求,消耗了大量的CPU资源。

话外音:小李去火车站买票,火车站没票,但是他每隔3小时去火车站问有没有票,两天后火车站有人退票,小李买到了一张票。

为了避免同步非阻塞IO模型中轮询等待的问题,基于内核提供的多路分离函数select(),可以实现IO的多路复用。例如:

c71076773bb01a2831c7382646b21992.png

使用是select以后最大的优势是用户可以在一个线程内处理多个socket的IO请求,用户可以注册多个socket,然后不断地调用select读取被激活的socket,即可达到在同一个线程内同时处理多个IO请求的目的,而在同步阻塞IO模型中,必须通过多线程的方式才能达到这个目的。

白话:用户线程把读取数据这个操作交给一个中间人(select),中间人来检测内核是否已经有数据了, 数据到达之后再把这个消息返回给用户线程,此时用户线程发起read请求。
话外音:小李去火车站买票,委托给黄牛,然后每隔1小时就询问黄牛,黄牛两天后得知有票了,通知小李去火车站交钱领票。(在此期间小李只是阻塞在黄牛(select)阶段,而并不是真正的IO系统之上)。

1.4 图解说明

82193cac94a5e59ab40856651be94e49.png

f1df7c5322d435af1917daabf435049e.png

1.5 区别

  • 阻塞IO和非阻塞IO的区别在于第一步发起IO请求是否会被阻塞。如果阻塞直到完成那么就是传统的阻塞IO,如果不阻塞那么就是非阻塞IO。
  • 阻塞与非阻塞是对同一个线程来说的,在某个时刻,线程要么处于阻塞,要么处于非阻塞。
  • 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态:
阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值