zoukankan      html  css  js  c++  java
  • epoll的边缘触发与水平触发

    epoll的边缘触发与水平触发

      Tcp连接是双向的,内核为每个socket维护两个缓冲区,读缓冲区与写缓冲区,内核会一个关注这两个缓冲区,当采用水平触发时,对于写缓冲区而言,如果有多余空间可写,对于读缓冲区而言,如果有数据可读,内核就会通知epoll,使得wait函数返回,进而通过IO线程对这两个事件进行处理,如果一次没有处理好,eg:没有读全或者写全,下次epoll时,内核还会继续提醒上次的未完成的可读可写的情况,因此,在使用水平触发的时候,应该很谨慎的关注文件描述符的读写事件,如果关注了不去处理,导致epoll每次都返回,会造成busy loop。而对于边缘触发的方式来说,当内核通过读写就绪之后,对于读来说,必须一直读到不能读,对于写来说必须写到不能再写,如果没有读全或者写全,下次epoll时,即使该缓冲区可读或者可写,内核也不会有任何的通知,一个类似的比喻就是电平的边缘触发,必须是高低电平在进行切换之后,内核才会有通知,将低电平比作不可读操作,高电平比作可读操作,则每次读到底的操作就相当于一直读到高电平变为低电平时,本次读操作才完成,下次当低电平(不可读)变为高电平(可读)时,才会有提醒。而水平触发则是于之前的状态无关的,至于当前的状态有关,当内核向读写缓冲区看过去时,他看到什么就通知什么(可读可写状态)。

      问题:如果边缘触发的时候写不满怎么办。

  • 相关阅读:
    day52—JavaScript拖拽事件的应用(自定义滚动条)
    day51—JavaScript绑定事件
    day50—JavaScript鼠标拖拽事件
    day49—JavaScript阻止浏览器默认行为
    day48—JavaScript键盘事件
    day47—JavaScript事件基础应用
    day41—JavaScript运动的停止条件
    Java Web项目使用图形验证码 — Kaptcha
    Disconf-Web管理端安装
    Git基本常用指令
  • 原文地址:https://www.cnblogs.com/AKUN-FYK/p/10927479.html
Copyright © 2011-2022 走看看