编程基础:入门理解BIO、NIO、AIO

问题:什么是BIO?

  • BIO(同步并阻塞):一个请求对应一个线程,如果线程数不够连接则会等待空余线程或者拒绝连接。
  • 核心原理:利用CPU中断
    • 阻塞线程进入休眠,将执行权限交给其他线程。
  • 优缺点:
    • 优点:阻塞是不会占用系统资源且程序易编程与理解。非常适合
    • 缺点:高并发场景需要较高的线程数量(资源占用);线程切换有成本。
  • 使用范围:适用于连接数目比较小且固定的场景,适合处理重量级IO,这种方式对服务器资源要求比较高,并发局限于应用中。并行量特别大的场景除外。
    BIO模型

问题:什么是NIO?

  • NIO(同步非阻塞):基于事件驱动的,采用了Reactor模式,它使用一个线程管理所有的socket通道,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
  • 核心原理:由专门的数据结构(sellctor与epoll)负责统计发生I/O,再允许程序监听变更。
  • 优缺点:
    • 缺点:编程复杂,针对特别大量IO才有明显的性能提升,不适合处理重量级IO传输。
    • 优点:可处理大量IO请求场景
  • 适用范围:一般只适用与连接数目较大但数据传输量少的应用,如聊天应用等。
    在这里插入图片描述

问题:什么是AIO?

  • AIO(异步非阻塞):AIO引入异常通道的概念,采用Proactor模式,一个有效的请求才启动一个线程,它的特点是先由操作系统完成后才通知服务端程序启动线程去处理,一般适用与连接数较多且连接时间长的应用。
  • 核心原理:异步编程,本质异步转同步,通常结合epoll以及directmemory。例如内存屏障以及java的Future。
  • 优缺点:
    • 缺点:不适合轻量级数据传输,因为进程之间频繁的通信在追错、管理和资源消耗上不是很可观。
    • 优点:并发性高、CPU利用率高、线程利用率高
  • 适用场景:对并发有需求的重量级数据传输。
    在这里插入图片描述

问题:三种IO场景对比如何?

线程数指的是对应的是IO处理线程:

  • BIO是一个IO事件对应一个线程进行监听处理。
  • NIO是一个selector的线程监听所有IO,对应IO的事件处理交给监听的事件创建线程处理。
  • AIO是将所有IO交给内核系统处理,内核系统处理完事件后将数据回调给应用。
    在这里插入图片描述

问题:NIO的关键设计?

  • Channel的设计

    • 对系统内部的(selctor或epoll)进行了一次封装,每个用户的连接就是一个channel。
    • 具体可理解Reactor模型
      在这里插入图片描述
  • DirectMapping的设计

    • 在内核空间创建一块内存DirectMemory提供给用户空间直接使用。
    • DirectMemory本质是Java的堆外内存,由内核创建。内核将这部分内存提供给JVM调用,减少一次数据拷贝。
      在这里插入图片描述

参考:

https://blog.csdn.net/qq_35458371/article/details/106827390

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萌白在努力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值