共计 697 个字符,预计需要花费 2 分钟才能阅读完成。
一个过程的地址空间分为用户空间 user space 和内核空间 kernel space。
利用程序运行在用户空间。内核空间进行零碎态级别的资源无关的操作,比方文件治理,过程通信,内存治理。
用户空间的程序不能间接拜访内核空间,想执行 io 操作的时候,只能发动零碎调用(io 调用)申请操作系统的内核来执行 io 操作。
应用程序发动 io 调用后,1. 内核期待 io 设施筹备好数据 2. 内核将数据从内核空间拷贝到用户空间。
5 种常见 io 模型 同步阻塞 io 同步非阻塞 io io 多路复用 信号驱动 io 异步 io
同步非阻塞:
内核筹备数据、数据就绪时重复调用 read,不阻塞。拷贝数据时阻塞。
轮询非常耗费 cpu 资源。
java 中常见的三种 io
bio blocking io
属于同步阻塞 io,应用程序发动 read 调用后,会始终阻塞,直到内核把数据拷贝到用户空间。
nio non-blocking io
属于 io 多路复用,线程先发动 select 调用,询问内核数据是否准备就绪,等内核把数据筹备好了,用户线程再发动 read 调用。read 调用的过程还是阻塞的。
目前反对 IO 多路复用的零碎调用,有 select,epoll 等等。
IO 多路复用模型,通过缩小有效的零碎调用,缩小了对 CPU 资源的耗费。
Java 中的 NIO,有一个十分重要的选择器 (Selector) 的概念,也能够被称为 多路复用器。通过它,只须要一个线程便能够治理多个客户端连贯。当客户端数据到了之后,才会为其服务。
AIO (Asynchronous I/O)
就是 NIO 2,是异步 IO 模型,基于事件和回调机制实现,利用操作之后会间接返回,不会梗塞在那里,当后盾解决实现,操作系统会告诉相应的线程进行后续的操作。