《Unix网络编程》笔记(I/O模型)
Unix
模型
- 阻塞式I/O
默认情况的socket,最简单常用的方式, - 非阻塞式I/O
- I/O复用(select和poll)
- 信号驱动式I/O(SIGIO)
- 异步I/O(POSIX的aio_系列函数)
解释
I/O复用
进程阻塞在select系统调用上,直到数据可读,系统调用recvfrom
I/O复用的意义在于(查阅资料后的个人理解):当多个众多客户连接,如果使用阻塞模型。则需要为每个客户开辟一个线程,否则就会引起阻塞,而维护大量线程,这些线程中许多又是非忙碌状态的,那么线程本身内存开销和切换对效率影响是极大。这时候引入非阻塞,而普通非阻塞模型需要不断读取写入,无效操作占比高。因此Linux下的select、poll和epoll就是(下面是select的流程)规避这些大量的无用操作的
以下转自:https://www.zhihu.com/question/28594409/answer/52763082
以select和tcp socket为例,所谓可读事件,具体的说是指以下事件: 1、
1socket内核接收缓冲区中的可用字节数大于或等于其低水位SO_RCVLOWAT;
2socket通信的对方关闭了连接,这个时候在缓冲区里有个文件结束符EOF,此时读操作将返回0;
3监听socket的backlog队列有已经完成三次握手的连接请求,可以调用accept;
4socket上有未处理的错误,此时可以用getsockopt来读取和清除该错误所谓可写事件,则是指:
1 socket的内核发送缓冲区的可用字节数大于或等于其低水位SO_SNDLOWAIT;
2socket的写端被关闭,继续写会收到SIGPIPE信号;
3 非阻塞模式下,connect返回之后,发起连接成功或失败;
4 socket上有未处理的错误,此时可以用getsockopt来读取和清除该错误
winsock
1 阻塞模型
2 select模型
3 WSAAsyncSelect模型 异步I/O模型
4 WSAEventSelect 异步事件通知I/O模型
5 重叠模型
6 完成端口模型