1. IO模型
对于一个network IO(这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的process(or thread),另一个就是系统内核(kernel)。
当一个read操作发生时,它会经历两个阶段:
1)等待数据准备(Waiting for the data to be ready)
2)将数据从内核拷贝到进程中(Copying the data from the kernel to the process)
IO模型的区别就是在两个阶段上各有不同的。
2. 阻塞(blocking)IO和非阻塞(non-blocking)
描述的是用户线程调用内核I0操作的方式:
阻塞是指IO操作需要彻底完成后才返回到用户空间;例如send()
、recv()
等接囗都是阻塞型的。
非阻塞是指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成。
3. 同步(synchronous)IO和异步(asynchronous)
描述的是用户线程与内核的交互方式:
同步是指用户线程发起IO请求后需要等待或者轮询内核IO操作完成后才能继续执行;
异步是指用户线程发起IO请求后仍继续执行,当内核IO操作完成后会通知用户线程,或者调用用户线程注册的回调函数。
4. 6种I/O模型
- 阻塞(blocking)模型(传统的IO模型)
- 选择(select)模型
- WSAAsyncSelect模型
- WSAEventSelect 模型
- 重叠(overlapped)模型
- 完成端口(completion port)模型