• Java NIO系列 - IO模型


    IO的底层原理

    • 内核空间: kenel管理的内存, kernel运行在内核空间, 同时可以管理用户空间
    • 用户空间: 用户进程所在的内存, 用户进程运行在用户空间, 每个进程创建
    • 对底层资源的操作是通过系统调用实现的, OS这样做的目的: 保证系统安全.
    • IO操作的对象: 缓存(内核缓存, 进程缓存)
      我们进行的IO操作并非直接和硬件资源交互, 传递数据, 真正的IO传输过程如图

    IO底层原理示意图
    1, 用户进程通过系统调用read读取数据;
    2, 内核在硬件获取数据, 拷贝到内核缓存;
    3, 内核将准备好的数据复制到用户缓存中;
    4, 用户直接使用的是用户缓存中的数据.

    IO模型的分类

    • 同步阻塞
    • 同步非阻塞
    • 多路复用
    • 异步非阻塞

    IO模型的进化依靠的是底层操作系统这个基础设置的支持.
    同步阻塞
    用户态进程发出read调用后, 在内核准备数据和复制数据到用户缓存的这个时间段内, 阻塞等待;如果实现并发访问, 就需要针对每一个IO创建一个thread.

    同步非阻塞
    用户进程使用非阻塞的read, 发出该调用后, 继续执行进程, 内核准备数据的过程中不需要阻塞住.但是需要用户进程不断轮询发出read调用, 查看IO的执行结果.(一般不用, 但作为后续模型的基础)

    多路复用
    通过select/epoll系统调用, 不用阻塞, 也不需要轮询, 内核完成IO之后给调用进程返回内核数据准备结果, 这样面对多个IO请求, 只需要一个线程负责获取内核返回的状态结果, 有ready的io, 再通过非阻塞的read调用来完成IO(内核缓存到用户缓存的拷贝)

    异步非阻塞
    以上的多路复用离一步到位还有距离, 真正的异步非阻塞做到, 用户进程发出IO请求, 即返回执行自己的进程, 直到内核完成数据准备, 进而完成数据在内核缓存到用户缓存的复制, 给用户进程发送一个数据IO完成通知, 用户进程直接使用IO的结果.

  • 相关阅读:
    计算机网络-谢希任第八版学习笔记总结
    uniapp播放mp4省流方案
    JZ04 [剑指 Offer 04] 二维数组中的查找
    Dubbo学习-03-zookeeper和Dubbo Admin安装
    上网行为审计软件能审计到什么
    Python位运算符
    SQL Server中的NULL值处理:判断与解决方案
    重生之我是一名程序员 31
    [技术发展-21]:网络与通信技术的应用与发展快速概览-1- 互联网网络技术
    java_网路爬虫_1
  • 原文地址:https://blog.csdn.net/malipku/article/details/125440873