Timetombs

泛义的工具是文明的基础,而确指的工具却是愚人的器物

66h / 117a
,更新于 2024-09-22T17:55:08Z+08:00 by   d729f8f

[计算机网络] IO 模型

版权声明 - CC BY-NC-SA 4.0

1 基本概念

在开始前先解释两组概念。

1.1 Blocking / Non-Blocking

Blocking和Non-Blocking通常指的这次操作会不会阻碍后续操作。比如在等红绿灯,或者遇上了堵车,我们通常都会说是被堵了,导致你只能在此等着,虽然你闲下来了,但是干不了后续其他事情。

1.2 Synchronous / Asynchronous

Synchronous和Asynchronous通常指的是这次操作能不能立即得到想要的结果。如果可以,那就是Synchronous,否则就是Asynchronous。比如你去打印店打印文件,你去了之后把东西给到店主,说:“打印好告诉我,我先去忙其他的了”,这就是异步。

通常情况下就可以自由组合:

  1. Synchronous Blocking。
  2. Synchronous Non-Blocking。
  3. Asynchronous Non-Blocking。

2 IO 模型

在I/O模型中,设想如此场景 : application通过kernelread函数读取数据,但是kernel还未准备好数据。那么此时read函数有两种处理方式(大致的流程):

1等待数据准备好后再返回。此时:
对于applicationBlocking的。
对于kernelread函数是Synchronous的。
2立即返回,告知application数据还未准备好。此时:
对于applicationNon-Blocking的;
对于kernelread函数是Asynchronous的。

由于read函数没有返回application期望读到的数据,那么就必须通过另外的方式把数据给到application。那么此时,也有2种处理方式:
2.1application一直不停的调用read函数,直到返回了期望读到的数据。此时read函数虽然没有Blockingapplication,但是application也无法处理其他事情,只能不停的调用read
2.2read函数要求application调用时提供一个callback_function,在数据准备好时通过callback_function告知application。此时application就可以继续做其他事情,直到callback_function被调用。

在处理callback_function时,也还有2种处理方式。
2.2.1数据准备好时调用callback_function,交由application去读取。
2.2.2数据准备好并且写入到application提供的缓冲区,调用callback_function
I/O Model

2.1 Blocking I/O

Blocking I/O

对应上述表格中的1。这种方式模型简单,Blockingapplication的进程/线程被挂起,基本不会占用CPU资源。但是当并发大时就需要创建N个进程/线程,造成内存、线程切换开销增大。

2.2 Non-Blocking I/O

Non-Blocking I/O

对应上述表格中的2.1。这种方式明显看起来和Blocking没什么区别,不停的调用会造成CPU负担过重。

2.3 I/O Multiplexing (select, poll, epoll)

I/O Multiplexing (select)

对应上述表格中的2.1。但是会同时通过(select, poll, epoll)在一个进程/线程中Blocking多个连接(故而称为I/O多路复用),当其中有一个连接的有数据可读时就返回。但是实质上还是Blocking的,只是不会Blockingread环节,而是(select, poll, epoll)环节。因为不会为每个连接创建对应的进程/线程,故而性能较好。

2.4 Signal Driven I/O (SIGIO)

对应上述表格中的2.2.1。

2.5 Asynchronous I/O (POSIX aio, Windows iocp)

Asynchronous Non-Blocking I/O (aio)

对应上述表格中的2.2.2。当application接收到回调通知时,数据已经复制给application,故而性能最佳。

3 Reference

The C10K Problem

  1. http://www.kegel.com/c10k.html
  2. http://www.52im.net/thread-566-1-1.html

Select

  1. https://en.wikipedia.org/wiki/Select_(Unix)

Epoll

  1. https://en.wikipedia.org/wiki/Epoll

AIO(Asynchronous Input/Output)

  1. https://en.wikipedia.org/wiki/Asynchronous_I/O

IOCP(Input/Output Completion Port)

  1. https://en.wikipedia.org/wiki/Windows_NT_3.5
  2. https://en.wikipedia.org/wiki/Input/output_completion_port
  3. https://docs.microsoft.com/zh-cn/windows/win32/fileio/i-o-completion-ports

I/O Model Article

  1. http://www.52im.net/thread-1935-1-1.html
  2. https://developer.ibm.com/articles/l-async/
上一篇 : [计算机网络] NAT
下一篇 : [计算机网络] Tool