浅谈几种服务器端模型——epoll

本文探讨了Linux服务器端的epoll模型,从基础API出发,详细介绍了epoll的创建、事件监控以及如何控制文件描述符上的事件。进一步讨论了epoll的进阶主题,特别是ET(边缘触发)模式,解释了在非阻塞文件句柄下如何有效地处理读写事件。通过实例展示了如何在实际应用中使用epoll进行高效并发处理。
摘要由CSDN通过智能技术生成
引言:上一篇说到线程池方式来处理服务器端的并发,并给出了一个线程池的方案(半同步,半异步方式)。再来说下同步异步,阻塞非阻塞区别:
同步和异步针对应用程序来,关注的是程序中间的协作关系;阻塞与非阻塞更关注的是单个进程的执行状态。
同步有阻塞和非阻塞之分,异步没有,它一定是非阻塞的。
阻塞、非阻塞、多路IO复用,都是同步IO,异步必定是非阻塞的,所以不存在异步阻塞和异步非阻塞的说法。真正的异步IO需要CPU的深度参与。换句话说,只有用户线程在操作IO的时候根本不去考虑IO的执行全部都交给CPU去完成,而自己只等待一个完成信号的时候,才是真正的异步IO。所以,拉一个子线程去轮询、去死循环,或者使用select、poll、epool,都不是异步。

同步:执行一个操作之后,进程触发IO操作并等待(也就是我们说的阻塞)或者轮询的去查看IO操作(也就是我们说的非阻塞)是否完成,等待结果,然后才继续执行后续的操作。
异步:执行一个操作后,可以去执行其他的操作,然后等待通知再回来执行刚才没执行完的操作。
阻塞:进程给CPU传达一个任务之后,一直等待CPU处理完成,然后才执行后面的操作。
非阻塞:进程给CPU传达任务后,继续处理后续的操作,隔断时间再来询问之前的操作是否完成。这样的过程其实也叫轮询。

言归正传,所谓多路IO转接服务器也叫多任务IO服务器。其主旨思想是:不再由应用程序自己监听客户端连接,取而代之由内核替应用程序监视文件。主要使用的方法有三种:select、poll、epoll,本章重点讲述epoll。
epoll是linux下多路复用IO接口select/poll的增强版本,内核采用红黑树机制,能显著提高了epoll 的性能。目前epoll是linux大规模并发网络c著名的 libevent Nginx等内部都采用这个机制。

基础API
  1. 创建一个epoll句柄,参数size用来告诉内核监听的文件描述符的个数,跟内存大小有关。
    #include <sys/epoll.h>
    int epoll_create(int size)     size :监听数目
  1. 控制某个epoll监控的文件描述符上的事件:注册、修改、删除。
    #include <sys/epoll.h>
    int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
        epfd    epoll_creat 的句柄
        op      表示动作,用 3 个宏来表示:
           EPOLL_CTL_ADD ( 注册新的 fd epfd)
           EPOLL_CTL_MOD ( 修改已经注册的 fd 的监听事件 )
           EPOLL_CTL_DEL ( epfd 删除一个 fd)
        event   告诉内核需要监听的事件
        struct epoll_event {
           __uint32_t events; /* Epoll events */
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hical_W

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值