每日一句
You cannot swim for new horizons until you have courage to lose sight of the shore. 除非有勇气离开岸边,否则你永远游不到彼岸。
概念
IO 是主存和外部设备(硬盘、终端和网络等)拷贝数据的过程。IO是操作系统的底层功能实现,底层通过I/O指令进行完成。
以下是5种类Unix下可用的I/O模型
-
阻塞式I/O:Blocking IO
-
非阻塞式I/O:nonblocking IO
-
I/O 复用(Select,poll epoll):IO multiplexing
-
信号驱动式I/O(SIGIO):signal driven IO
-
异步 I/O(posix 的 aio 系列函数):asynchromous IO
Blocking IO
在 Linux 中,默认情况下所有的 socket 都是 Blocking,一个典型的读操作流程大概是这样:
-
通常涉及等待数据从网络到达。当所有等待数据到达时,它被复制到内核中的某个缓冲区
-
把数据从内核缓冲区复制到应用程序缓冲区
当用户进程调用了 recvfrom 这个系统调用, kernel 就开始了 IO 的第一个阶段:准备数据。对于 network IO 来说,很多时候数据在一开始还没有到达(比如,还没有收到一个完整的 UDP 包)。这个时候 kernel 就要等待足够的数据到来。而在用户进程这边