epoll和select的区别

本文对比了epoll和select这两种网络I/O模型的特点。select受限于文件句柄检测数量且存在轮询效率问题,而epoll则无此限制,并通过只检测活跃句柄和使用mmap提高内存复制速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做以简单区分为面试作答提供一些帮助:

        select 和 epoll都为一种网络I/O模型,都是采用了檢測了句柄集合中的数据,来实现多路复用。

        select文件句柄检测数有限,内核中_FD_SETSIZE定义为2048超出范围将无法检测,在扫描上select

        采用的是轮询的方式当检测的量太大时会造成轮询不过来引起的超时。为了克服select的缺陷

        linux引入了epoll其特点是句柄集合量没有限制,可以比select大的多,epoll只检测活跃的句柄,这样可以避免

        不必要的太长时间的轮询。epoll中还使用了mmap来提高内存复制的数度只需要把消息传入内核一次就好,select

        却要每次都复制。

        主要函数为:create_epoll(int maxfd);创建一个epoll句柄 其中maxfd是支持的最大句柄数。

                          epoll_ctl(int epfd, int op, int fd, struct epoll_event* event);第一个参数是epoll_create()的返回值,

                           创建Epoll的专用文件描述符,相当于FD_SET 和 FD_CLR

                           第二个参数表示动作,用三个宏来表示

                                                          EPOLL_CTL_ADD:注册新的fd到epfd;

                                                          EPOLL_CTL_MOD:修改已经注册的fd的监听事件

                                                          EPOLL_CTL_DEL:从epfd中删除一个fd

                           第三个参数是要监听的fd

                           第四个参数是要告诉内核要监听什么事件,struct epoll_event结构如下:

                              struct epoll_event{

                                        _uint32 events;

                                        epoll_data_t data;

                               };

                                events:可以一下几个宏集合:

                                        EPOLLIN:  表示对应文件描述符可写

                                        EPOLLOUT: 表示对应的文件描述符可写

                                        EPOLLPRI: 表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);

                                        EPOLLERR: 表示对应的文件描述符发生错误;

                                        EPOLLHUP: 表示对应的文件描述符被挂断;

                                        EPOLLET: 将EPOLL设为边缘触发(EdgeTriggered)模式,这是相对于水平触发(LevelTriggered)来说的。

                                        EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个

      int epoll_wait(int epfd, struct epoll_event*events, int maxevents, int timeout);这个函数返回的数据是发生的事件数

                                      

                         等待I/O 事件的发生;参数说明:

                                       epfd: epoll_create() 生成的Epoll 专用的文件描述符;

                                        epoll_event:用于回传代处理事件的数组;

                                         maxevents:每次能处理的事件数;

                                         timeout: 等待I/O 事件发生的超时值;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值