共计 541 个字符,预计需要花费 2 分钟才能阅读完成。
Linux 网络 IO 模型
阻塞 IO 模型
- 1. 当应用程序发起网络 IO 的请求时会调用操作系统 recvfrom 函数
- 2. 等待系统内核准备数据报 (获取网络数据: 网卡把数据拷贝到内核)
- 3. 数据报准备好后将数据从内核拷贝到用户空间,即应用程序空间
非阻塞 IO 模型
一般很少用这个非阻塞模型,因为反复调用消耗 CPU
IO 复用模型
IO 复用模型是 linux 下用的最多的, 也就是 JDK 中的 NIO。
特点:
- 对于某一个应用进程而言,或者说在某一次网络通信, 它还是阻塞的, 但是可以同时服务于多个网络通信。
- 多个 select 函数即多个 socket 请求,会挂在内核中, 操作系统会轮询检查数据报是否准备好再返回可读条件即就绪, 应用程序再发起 recefrom 函数拷贝内核中的数据.
select 和 epoll;对一个 socket,两次调用,两次返回,比阻塞 IO 并没有什么优越性;
关键是能实现同时对多个 socket 进行处理。
信号驱动 IO—(相对少用)
异步 IO 模型
当一个异步过程调用发出后,系统直接返回, 调用者不能立刻得到结果。
实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者的输入输出操作。
五种 IO 模型的比较:
除异步 IO 模型,前面四种 IO 模型第二阶段都是相同的,阻塞于 recefrom 调用。
参考书籍:《UNIX 网络编程 》
正文完