IO、NIO、BIO傻傻分不清吗,让我对象告诉你~~

手机游戏开发者 2024-9-22 23:38:53 23 0 来自 中国
1、Stream 与 Channel


  • stream 不会自动缓冲数据,channel 会使用体系提供的发送缓冲区、吸取缓冲区(更为底层)
  • stream 仅支持壅闭 API,channel 同时支持壅闭、非壅闭 API,网络 channel 可共同 selector 实现多路复用
  • 二者均为全双工,即读写可以同时举行
  • 固然 Stream 是单向活动的,但是它也是全双工的
2、IO 模子


  • 同步:线程本身去获取结果(一个线程)

    • 比方:线程调用一个方法后,必要等待方法返回结果

  • 异步:线程本身不去获取结果,而是由别的线程返回结果(至少两个线程)

    • 比方:线程 A 调用一个方法后,继承向下运行,运行结果由线程 B 返回

当调用一次 channel.read 或 stream.read 后,会由用户态切换至利用体系内核态来完成真正数据读取,而读取又分为两个阶段,分别为:

  • 等待数据阶段
  • 复制数据阶段

根据 UNIX 网络编程 - 卷 I,IO 模子重要有以下几种
壅闭 IO

2.png

  • 用户线程举行 read 利用时,必要等待利用体系实验现实的 read 利用,此期间用户线程是被壅闭的,无法实验其他利用
非壅闭IO



  • 用户线程
    在一个循环中不停调用 read 方法,若内核空间中还没有数据可读,立刻返回

    • 只是在等待阶段非壅闭

  • 用户线程发现内核空间中有数据后,等待内核空间实验复制数据,待复制竣事后返回结果
多路复用

Java 中通过 Selector 实现多路复用

  • 当没有变乱是,调用 select 方法会被壅闭住
  • 一旦有一个或多个变乱发生后,就会处置惩罚对应的变乱,从而实现多路复用
多路复用与壅闭IO的区别

  • 壅闭 IO 模式下,若线程因 accept 变乱被壅闭,发生 read 变乱后,仍需等待 accept 变乱实验完成后,才气行止置惩罚 read 变乱
  • 多路复用模式下,一个变乱发生后,若另一个变乱处于壅闭状态,不会影响该变乱的实验
异步IO



  • 线程 1 调用方法后明白返回,不会被壅闭也不必要立刻获取结果
  • 当方法的运行结果出来以后,由线程 2 将结果返回给线程 1
3、零拷贝

零拷贝指的是数据无需拷贝到 JVM 内存中,同时具有以下三个长处

  • 更少的用户态与内核态的切换
  • 不使用 cpu 盘算,减少 cpu 缓存伪共享
  • 零拷贝得当小文件传输
传统 IO 标题
传统的 IO 将一个文件通过 socket 写出
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 20:30, Processed in 0.172399 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表