Unix/Linux的五种IO模型简介
1. 阻塞blocking
2. 非阻塞 non-blocking
3. IO复用 (IO multiplexing)
一个线程可以监听多个sockfd,而上面的阻塞模型和非阻塞模型一个线程只能监听一个sockfd
4. 信号驱动 (signal-driven)
内核在第一个阶段是异步,但是在第二个阶段是同步;
- 在数据准备阶段,应用程序将自己感兴趣的sockfd告知内核,并约定通知方式,由内核去监听socfd内核缓冲区上是否有数据可读,这期间进程可以继续执行,等到内核监听到内核缓冲区上有数据可读时,就会按照约定好的方式(比如发送通知信号)去通知应用程序;
- 应用程序需要自己去将数据拷贝到应用程序缓冲区中
与非阻塞IO的区别在于它提供了消息通知机制,不需要用户进程不断的轮询检查数据是否准备就绪,减少了系统API的调用次数,提高了效率。
5. 异步(asynchronous)
性能高,但是设计复杂,调用也比较复杂