epoll的边缘触发与水平触发

epoll的边缘触发与水平触发

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

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

 

posted @ 2019-05-26 20:48  AKUNFYK  阅读(1047)  评论(0编辑  收藏  举报