面试爱问 | 网络编程
- 阻塞、非阻塞、同步、异步的区别?
- IO的五种模型?
- epoll/poll/select 的区别?
- epoll中ET,LT的区别?
- Reactor/Proactor模式是什么?
- 大规模连接上来后,并发模型怎么设计?
- select返回可读,但是使用read一直只能读到0字节,什么情况?
- connect函数长时间阻塞该怎么办?
- socket什么情况下可读?
- UDP通信中调用connect有什么作用?和TCP连接中的connect有什么区别?
- keepalive是什么?如何使用?
- Socket编程中,如果client断开,服务器如何快速知道?
- Socket通信流程是怎样的?
阻塞、非阻塞、同步、异步的区别?
阻塞/非阻塞 关注的点是 进程/线程 是否需要等待数据;阻塞代表需要等待数据,非阻塞代表不需要等待数据。
同步/异步 关注的点是 主动/被动 读取数据;同步代表需要主动读取数据,异步代表被动读取数据。
同步有阻塞和非阻塞之分,异步一定是非阻塞的。
举例说明: 假设老实人小王去书店买书,然而书店没有小王想买的书。。。。。。
-
小王一直在书店等着,直到书店有书,这是 同步阻塞。
-
小王隔一段时间就去书店看看有没有书,这是 同步非阻塞。
-
老板在书店有书的时候给小王打电话,让小王过来拿书,这是 信号驱动IO同步非阻塞
-
老板在书店有书的时候直接把书寄到小王家里,这是 异步非阻塞。
此处的小王对应用户进程,书对应数据,买书对应系统调用,书店老板对应内核。
IO的五种模型?
IO的五种模型:
- 阻塞IO
- 非阻塞IO
- IO多路复用
- 信号驱动IO
- 异步IO
讲解五种IO模型的区别,仍然用上一个问题中小王去书店买书的例子说明。
- 阻塞IO
小王一直在书店等着,直到书店有书,这是 同步阻塞IO。
- 非阻塞IO
小王隔一段时间就去书店看看有没有书,这是 同步非阻塞IO。
- 多路复用IO
多路复用IO比较特别,在实际进行read/recv时并不会阻塞,但在select/poll/epoll时会阻塞。 小王来书店买书,但有一排书架,并不知道哪个书架上面有书,老板直接告诉小王哪个书架上面有书,这是多路复用IO。多路IO复用也属于同步非阻塞的一种。
- 信号驱动IO
老板在书店有书的时候给小王打电话,让小王过来拿书,这是 信号驱动IO,也是同步非阻塞的一种。
- 异步IO
老板在书店有书的时候直接把书寄到小王家里,这是 异步非阻塞。
以上1~4都属于同步,5属于异步。
epoll/poll/select 的区别?
select,poll,epoll都属于 IO多路复用,在本质上都属于 同步非阻塞IO。 IO多路复用的 特点在于可以同时监听多个描述符,一旦有描述符就绪,就可以进行相应的读写操作。
- select
select虽然可以同时监听多个描述符,但是select有三个比较大的缺点:
-
每一次调用select,都需要将fd集合从用户态拷贝到内核态,若fd数量很大,将会造成很大的开销;
-
每一次调用select,都需要在内核轮询遍历所有传递进来的fd集合,若fd数量很大,将会造成很大的开销;
-
select最多只能同时监听1024个描述符,显然不够用。
- poll
poll的内部实现原理和select类似,不过poll没有最大连接数的限制,因为它是基于链表存储的。
- epoll
epoll在select和poll上面进行了改进,解决了上面的三个问题。
-
针对第一个缺点:epoll先通过
epoll_create
创建句柄,再使用epoll_ctl
将fd集合拷贝进入内核,保证了fd集合只会拷贝一次。 -
针对第二个缺点:epoll在
epoll_ctl
的时候将所有的fd集合拷贝进入内核之后,将其放入等待队列,并为每个fd设置一个回调函数,当有fd描述符就绪时,会调用回调函数,将其加入就绪队列链表
。epoll_wait
的工作实质上就是主动在就绪链表中查看是否有就绪的fd描述符。这样直接从轮询遍历fd集合的O(N)
时间复杂度变为了直接读取就绪队列链表的O(1)
时间复杂度。 -
针对第三个缺点:epoll没有监听描述符数量的上限,具体数目可以通过
cat /proc/sys/fs/file-max
命令查看
总结
-
select和poll在每一次调用时都需要将所有的fd集合拷贝进入内核态,并以轮询遍历该fd集合,这两点会造成很大的开销;并且能够同时监听的最大数量为1024。
-
epoll在
epoll_craete
时创建句柄;并在epoll_ctl
时将文件描述符拷贝到内核态,再将其加入等待队列,设置相应的回调函数,当fd描述符就绪时,调用回调函数,将该描述符加入就绪链表;epoll_wait
的作用就是主动在就绪链表中查看是否有就绪的fd描述符;epoll没有最大监听描述符的限制。
epoll中ET,LT的区别?
- LT(Level Triggered)
LT水平触发是缺省的工作方式,只要缓冲区有数据就会,支持 和 。
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
让实战与真题助你offer满天飞!!! 每周更新!!! 励志做最全ARM/Linux嵌入式面试必考必会的题库。 励志讲清每一个知识点,找到每个问题最好的答案。 让你学懂,掌握,融会贯通。 因为技术知识工作中也会用到,所以踏实学习哦!!!