Skip to content

Commit 8f95f98

Browse files
committed
完善I/O阻塞, 非阻塞的解释
1 parent d10d799 commit 8f95f98

File tree

1 file changed

+6
-1
lines changed

1 file changed

+6
-1
lines changed

Linux_OS/IO_Model.md

+6-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ Unix 下有5种可用的 I/O 模型,如下:
88
* 信号驱动 I/O
99
* 异步I/O
1010

11-
对于一个套接口上的输入操作,第一步通常涉及等待数据从网络中到达。当所等待分组到达时,它被拷贝到内核中的某个缓冲区。第二步就是把数据从内核缓冲区拷贝到应用进程缓冲区。
11+
对于一个套接口上的读写操作,其实分成了两个步骤:发起IO请求和实际的IO操作。第一步通常涉及等待数据从网络中到达,当所等待分组到达时,它被拷贝到内核中的某个缓冲区。第二步就是把数据从内核缓冲区拷贝到应用进程缓冲区。
1212

1313
## 阻塞式 I/O
1414

@@ -77,6 +77,11 @@ POSIX关于同步、异步的定义如下:
7777
1. `同步I/O操作`(synchronous I/O operation)导致请求进程阻塞,直到I/O操作完成。
7878
2. `异步I/O操作`(asynchronous I/O operation)不导致请求进程阻塞。
7979

80+
可以这样理解:
81+
82+
* 阻塞IO和非阻塞IO的区别在于第一步:发起IO请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞IO;如果不阻塞,那么就是非阻塞IO
83+
* 同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO,因此阻塞IO、非阻塞IO、IO复用、信号驱动IO都是同步IO;如果不阻塞,而是操作系统帮你做完IO操作再将结果返回给你,那么就是异步IO。
84+
8085
根据上述定义,前4种模型——阻塞I/O模型、非阻塞I/O模型、I/O复用模型和信号驱动I/O模型都是同步I/O模型,因为其中真正的I/O操作(recvfrom)将阻塞进程。只有异步I/O模型与POSIX定义的异步I/O相匹配。
8186

8287
关于同步/异步、阻塞/非阻塞可以这样理解,拿小明下载文件打个比方:

0 commit comments

Comments
 (0)