select,poll,epoll的基本使用

函数原型:

int selectint nfds,struct fd_set*readfds,struct fd_set*writefds,struct fd_set*execptfds,struct timeval* timeout);
int poll(struct pollfd*fds,nfds_t fds,int timeout);
**epoll:**
int epoll_create(int size);
int epoll_ctl(int epollfd,int op,int fd,struct epoll_event* event);
int epoll_wait(int epollfd,struct epoll_event*events,int maxevents,int timeout);

使用方面:
select函数通过-》三个fd_set结构体变量-》给内核传递用户关注的所有可读,可写,异常事件-》内核通过这三个结构体变量返回就绪的文件描述符-》每次使用,重新设置这三个结构体变量

poll函数-》将用户关注的文件描述符及其关注的事件,内核返回的文件描述符上发生的事件分离开表示-》通过一个用户数组将所有的文件描述符传递给内核-》poll关注的事件类型更多,每次调用不需要重新设置

epoll函数-》通过一组函数完成-》通过epoll_create创建一个内核事件表,通过epoll_ctl函数添加,删除修改事件,epoll_wait只需要从内核事件表中读取用户的注册事件

使用限制:
select:单个进程能够监视的文件描述符的数量存在最大限制-》1024个,采用轮询的方式扫描文件描述符,文件描述符数量越多,性能越差

poll和epoll-》nfds和maxevents -》指定最多监听多少个文件描述符,这两个值都能达到系统允许打开的最大文件描述符数

使用效率:
select,poll每次调用都需要将用户空间的文件描述符拷贝到内核空间,epoll则直接从内核读取,效率更高

select,poll每次要将所有的文件描述符返回,应用程序检索就绪文件描述符的事件复杂度为
O(n),epoll通过events参数将所有就绪的文件描述度返回的时间复杂度为O(1)

select,poll只能工作在效率较低的LT模式,epoll工作在ET模式-》还支持EPOLLONESHOT事件,从而减少事件被触法的次数

内核效率:
链接活动较频繁-》select’和poll的效率比epoll高,因为epoll的回调函数调用过去频繁,所以epoll适用链接较多,但活动不频繁的情况。

问题:如何让多个客户端连接?
解决方案:
I/O复用技术:
(同步):
1.循环:循环遍历打开的网络连接列表,来判断是否有要读取的数据 。1)速度缓慢 2)效率低
2.select:首先将第二三四个参数指向的fd_set拷贝到内核,然后对每个被SET的描述符进行调用进行 poll,并记录在临时结果中(fd_set),如果有事件发生,select会将临时结果写到用户空间并返回;当轮询一遍后没有任何事件发生时,如果指定了超时时间,select会睡眠到超时,睡眠结束后再一次轮询,并将临时结果写到用户空间,然后返回。
select返回后,需要逐一检查关注的描述符是否被SET(事件是否发生)。(select支持的文件描述符数量太小了,默认是1024)。
3.poll:通过一个pollfd数组向内核传递需要关注的事件,没有描述符个数的限制,pollfd中的events字段和revents分别用于标示关注的事件和发生的事件,pollfd数组只需要被初始化一次。
对应sys_poll,poll向内核传递pollfd数组,然后对pollfd中的每个描述符进行poll,比select效率更高,poll返回后,需要对pollfd中每个元素检查其revents,来指事件是否发生。
4.epoll:通过epoll_create创建一个用于epoll轮询的描述符,通过epoll_ctl添加/修改/删除事件,通过epoll_wait检查事件,epoll_wait的第二个参数用来存放结果。在第一次调用后,事件信息与对应的epoll描述符关联起来,等待描述符上注册回调函数,事件发生时,回调函数负责把事件存储在就绪事件链表中,最后写到用户空间。epoll返回后,参数指向的缓冲区中即为发生的事件,对缓冲区中每个元素进行处理。

多线程技术或多进程技术:
处理高并发的数据连接,在服务器中可以产生大量的进程和线程和处理需要监视的连接,但:多进程模型不适合大量的短连接,因为进程的产生和关闭需要消耗较大的系统性能;多进程间的通信,在CPU不足的情况下不适合;多线程不适合长连接,建立一个进程时,linux会消耗栈空间,大量长连接,会导致大量的内存消耗。

上述两者复合使用:
多进程+I/O复用或多线程+I/O复用,例:多线程+I/O复用,使用一个主线程负责监听一个端口和接手的描述符是否有读写事件发生,若有,把事件分发给其它工作进程去完成。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值