linux和unix中的IO模型总结

高性能网络IO编程模型

一、I/O模型简介

在一个 linux 操作系统中,一般分为用户空间和内核空间。

用户空间一般就是我们进行应用程序编程的地方。

内核空间就是 linux 操作系统自己运行的一些系统,比如内存系统,文件系统,进程调度,硬件驱动程序等等,都是操作系统内核进行控制。

处于 2 个不同的空间,那应用程序怎么对内核进行一些操作呢?

应用程序运行在用户空间,是不具备直接操作系统功能的权限。应用程序要访问内核系统的一些功能,需要通过系统调用(System Call)来完成。

具体就是操作系统内核为应用程序提供了一些接口 API(封装的函数),供应用程序使用,来访问操作内核的一些功能。

image-20220808162212380

Linux 中的 I/O 模型是什么?

在用户空间的应用程序与在内核空间的内核系统怎么进行数据交换,交换的方式有哪些?

在《unix网络编程》中总结了 5 种 I/O 模型。

二、5 种IO模型

在 《unix网络编程第1卷》中介绍了 5 种 IO 模型:

  • 阻塞 I/O - Blocking I/O
  • 非阻塞 I/O - Non-Blocking I/O
  • I/O 复用(select,poll和epoll)- I/O Multiplexin
  • 信号驱动 I/O - Signal Driven I/O
  • 异步 I/O(aio_ 系列函数)- Asynchronous I/O

1.阻塞IO模型

应用程序进程发起 IO 系统调用,这里是 recvfrom 函数。这个进程一直阻塞在 recvfrom 调用,直到内核把数据准备好,然后从内核空间拷贝数据到用户空间缓冲区,最后返回数据。

这里进程阻塞的整段时间是指调用 recvfrom 开始到系统返回成功指示,应用进程开始处理数据。

image-20220808164255331

​ (来自《unix网络编程第1卷》第6章)

2.非阻塞IO模型

把套接字接口设置成非阻塞方式,就是告诉内核,请求I/O操作没有数据时,不要使进程阻塞(进程睡眠),而是返回一个错误。

等到内核把数据准备好,被拷贝到应用程序缓冲区,程序返回成功。

image-20220808165131095

​ (来自《unix网络编程第1卷》第6章)

3.IO多路复用模型

把多个接收的 socket FD 注册到 select(多路复用器)上,然后使用一个进程监听 select。只要有一个 socket 上准备好,就返回该 socket 数据。

多路复用函数有select,poll,epoll。

image-20220809015721733

​ (来自《unix网络编程第1卷》第6章)

4.信号驱动IO模型

信号驱动就是内核在 FD(文件描述符)准备好时用信号 SIGIO 通知应用程序。

首先,套接字接口允许信号驱动I/O,通过系统调用 sigacton 安装一个信号处理。此系统调用立即返回,进程继续工作,它是非阻塞的。当

内核数据报准备好时,就为该进程生成一个 SIGIO 信号,给进程发信号。可以立即在信号处理程序中调用 recvfrom 程序读取数据报,

image-20220809015826415

​ (来自《unix网络编程第1卷》第6章)

5.异步IO模型

异步IO是Posix.1的一个扩展,让内核来操作整个数据过程,在内核把数据准备完成后,从内核拷贝到应用进程缓冲区,然后通知应用进程。

接口函数一般以 aio_ 开头。

image-20220809020542222

​ (来自《unix网络编程第1卷》第6章)

三、5种IO模型区别

从上面5种模型可以看出,各个模型都有 2 个阶段。

第一阶段:等待内核准备好数据。

第二阶段:将数据从内核拷贝到用户空间(应用进程缓冲区)

前面4种模型当数据从内核拷贝到应用进程缓冲区时,进程都会阻塞在 recvfrom 的调用。

最后第5种异步IO模型两阶段处理都不同于前面4种IO模型。

image-20220809021616717

​ (来自《unix网络编程第1卷》第6章)

四、参考

posted @ 2022-08-09 02:37  九卷  阅读(359)  评论(0编辑  收藏  举报