• Linux网络服务器种类
    • web服务器
    • 邮件服务器
    • 数据库服务器
    • FTP服务器
    • 游戏服务器
    • etc ...
  • 多路复用
    • 所谓多路复用:一个进程,监听多个文件描述符(linux中,一切皆文件)
  • select POSIX系统标准支持
    • select的实现原理:有一个关注事件列表,selector扫描关注事件列表,生成一个新的数据,将其中就绪的事件置为1,未就绪的事件置为0, 事件处理进程只处理数组中置为1的事件
    • 缺陷:
      • 1、select最多只能处理1024个文件描述符(由FD_SETSIZE设置,包括linux进程自带的四个标准输入、标准输出、标注错误、except描述符)
      • 2、select采用轮询机制(线性扫描),select需要时刻轮询关注列表
      • 3、存在一个应用层数据拷贝到内核空间的过程
  • poll
    • 取消了select文件描述符1024个的限制,保留了select的轮询机制、内存拷贝机制
  • select poll 都是同步IO
  • epoll
    • 它所支持的文件描述符上限是整个系统最大可以打开的文件数目
      • EX:在1GB内存的机器上,这个限制的数量级为10万左右
    • 特点:
      • 1、每个fd上有callback函数,只有活跃的socket才会主动去调用callback函数,其他idle(闲置)状态的socket则不会。故epoll其实是一种异步通知机制
      • 2、内核空间与用户空间共享mmap内存,省去了select poll 拷贝内存的资源消耗
      • 3、epoll关注的 文件描述符和回调函数 挂载在红黑树上
      • 4、epoll中有一个就绪的事件链表,红黑树中就绪的事件挂载在这个就绪事件链表上
  • epoll 的API
    • int epoll_create(int size)
      • 1、创建一个epoll句柄
      • 2、当创建好epoll句柄后,它会占用一个fd值
      • 3、使用完一个epoll后,必须调用close函数关闭fd,否则会导致fd耗尽
    • int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
      • epoll control

      • epfd: epoll_create函数的返回句柄

      • op: 表示动作类型,有三个宏来表示:

          1. EPOLL_CTL_ADD 注册新的fd到epfd中
          2. EPOLL_CTL_MOD修改已经注册到fd的监听事件
          3. EPOLL_CTL_DEL 从epfd中删除一个fd
      • fd: 需要监听的文件描述符

      • event: 告诉内核需要监听什么事件

        • EPOLLIN: 表示对应的文件描述符可读
        • EPOLLOUT: 表示对应的文件描述符可写
        • EPOLLPRI: 表示对应的文件描述符有紧急数据可读(带外数据)
        • EPOLLERR: 表示对应的文件描述符有错误
        • EPOLLHUP: 表示对应的文件描述符被挂断
        • EPOLLET: 将epoll设置为边缘触发(EDGE Trigger)
        • EPOLLLT: 将epoll设置为水平触发(LEVEL Trigger)
    • int epoll_wait(int epfd, struct epoll_event *events, int masevents, int timeout)
      • 等待事件的产生,类似于select调用
      • epfd: 创建的epoll文件描述符
      • events: 用来从内核得到的事件集合,等待的事件集合
      • maxevents: 表示每次能处理的最大事件数,告诉内核这个events有多大,maxevents的值不能大于创建 epoll_create()时的size
      • timeout: 超时时间(毫秒)(-1,阻塞的;0, 立即返回,非等待的)
  • epoll工作模式
    • ET模式(Edge Triggered,边缘触发)
      • 高速模式,仅状态发生变化时才会获得通知。该模式假定开发者在收到一次通知后,会完整的处理该事件,因此内核将不再通知这一事件
      • 注意:缓冲区中还有未处理的数据不能说是状态变化,故在ET模式下,开发者如果只读取了一部分数据,也不会再次得到通知
    • LT模式(Level Triggered,水平触发)
      • 如果缓冲区存在数据,wait函数就会不停的发送通知
文章作者: Administrator
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 北溟鱼的博客
Linux
喜欢就支持一下吧