【高并发】高并发 IO 核心基础

IO基础

操作系统将内存(虚拟内存)分为两部分(为了避免用户进程直接操作内核,以保证内核安全)

  • 内核空间 · Kernel-Space

    • 运行内核模块,对应的进程处于内核态
  • 用户空间 · User-Space

    • 运行用户程序,对应的进程处于用户态

用户态进程必须要通过系统调用(System Call) 向内核发出指令,完成调用系统资源之类的操作;内核态进程则无限制

“用户程序进行IO的读写依赖于底层的IO读写,基本上会用到底层的read和write两大系统调用。虽然在不同的操作系统中read和write两大系统调用的名称和形式可能不完全一样,但是它们的基本功能是一样的。”

摘录来自: 尼恩. “Java高并发核心编程. 卷1, NIO、Netty、Redis、ZooKeeper。” Apple Books.

其实就是,操作系统内核完成物理设备(磁盘、网卡等)和内核缓冲区之间的交换;而应用程序完成内核缓冲区到进程缓冲区之间的数据交换

我们以为的IO实际上不是物理设备级别的读写,而是缓存的复制


4种主要的IO模型

  • 阻塞IO/非阻塞IO

    • “阻塞”指的是用户程序(发起IO请求的进程或者线程)的执行状态
    • 阻塞IO:指的是需要内核IO操作彻底完成后(非阻塞则无需)才返回到用户空间执行用户程序的操作指令
  • 同步IO/异步IO

    • 是发起IO的两种方式
    • 同步IO:用户空间主动发起,系统内核被动接收(例如input);异步IO则相反(例如output)

同步阻塞IO · Blocking IO

用户空间主动发起,需要等待内核IO操作彻底完成后,才返回到用户空间的IO操作;即在IO操作过程中,发起IO请求的用户进程/线程处于阻塞状态

默认情况下,在Java应用程序进程中所有对socket连接进行的IO操作都是同步阻塞IO

同步非阻塞IO · Non-Blocking IO

用户空间主动发起,无需等内核IO操作彻底完成,即可返回到用户空间去执行后续操作的IO操作(但会立刻返回给用户一个IO状态值);即在IO操作中,发起IO请求的用户进程/线程处于非阻塞状态

需要不断轮询内核,以确定数据是否准备好(一般不直接使用)

IO多路复用 · IO Multiplexing(也称异步阻塞IO)

用户进程/线程监视多个文件描述符,一旦有“就绪”的描述符(一般是内核缓冲区可读/可写),内核就会将文件描述符的就绪状态返回给用户进程/线程,用户空间可以根据文件描述符的就绪状态进行相应的IO系统调用

可避免同步非阻塞IO模型中轮询等待的问题,Java中的Selecter就属于这种模型

异步IO · Asynchronous IO(信号驱动IO)

内核空间主动调用,用户空间被动接收(不会被阻塞,但需要进行事件的注册与接收)

即当用户线程收到了通知时,数据已经被内核读取完毕并放在了用户缓冲区内

Java中的回调模式,用户进程/线程向内核空间注册了各种IO事件的回调函数,由内核主动调用

#Java##程序员#
全部评论

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务