Skip to content

Latest commit

 

History

History
25 lines (21 loc) · 2.15 KB

计算机网络.md

File metadata and controls

25 lines (21 loc) · 2.15 KB

什么是IO多路复用

例如当TCP客户端程序同时要处理两个输入,标准输入和套接字输入。如果用fgets方法读取标准输入会阻塞程序,而当套接字数据可读时,就没办法读出来。这个时候就需要IO多路复用,把标准输入和套接字都看成是IO的一路,当任何一路的一个或多个IO事件发生时,应用程序能及时收到通知。常见的IO多路复用技术有Select,Poll,EPoll

Select

Select(maxfd, readset, writeset, exceptset, time) maxfd是待测试的描述符基数, readset是读描述符集合,writeset是写描述符集合,exceptset是写描述符集合,time设置超时时间 一般程序会去循环Select待检测的描述符集合,当有描述符就绪时,就会读出然后判断各描述符的状态做出相应的处理

Poll

Select函数支持的描述符个数是有限的,Linux默认最大为1024,而Poll函数突破了描述符数量的限制 poll(pollfd * fds, long nfds, timeout) struct pollfd { int fd; short events; 该描述符待检测的事件,二进制表示 short revents;返回的事件 } fds是pollfd结构体数组,nfds是待检测的结构提数组的大小,timeout是超时时间

Epoll

Epoll在高并发连接场景下,性能会比Select和Poll好很多。 主要基于以下亮点:

  1. select和poll先要将监听的fd从用户空间拷贝到内核空间,然后在内核空间里面处理完毕以后,再拷贝回用户空间。这个就涉及到内核空间申请内存、释放内存等操作,在有大量fd的情况下,这是非常耗时的。而epoll维护了一个红黑树,通过对红黑树操作,可以避免大量申请内存和释放内存的操作,而且查找速度很快。
  2. select和poll在休眠中被唤醒时,假如监听了多个fd,只要有一个fd有时间发生,就会遍历fd列表,检查哪一个事件就绪了,然后返回给用户空间。而epoll维护了一个就绪fd列表,当fd有事件发生时,内核就会将fd添加到就绪列表中。每次扫描的时候只要扫描就绪列表就行了,大大加快了事件检测和通知的效率。

什么是C10K问题