Gary Kildall

导航

SOCKET编程系列epoll原理(2)epoll关于读写缓存区问题

关于读写缓冲区 -------->在系统底层封装的一个区域,我们是不可见的。正是因为这样,缓冲区对于程序员来讲会带来一系列隐晦的问题。

作用: 写缓冲区 -------> 当前用户状态下的数据写到系统状态的数据缓冲区当中然后发送给底层(如果是socket的fd则将数据通过数据链路发出去网络)

      读穿冲区 -------> 当前系统状态当中接收到来自其他地方的数据,那么就缓存数据且fd可读,等待运行的进程(用户状态)来取走数据,取走数据之后读缓冲区会变小哦

 

关于EPOLL的缓冲区问题来了。

在LT模式之下

写:

(1)写缓冲区只需要缓冲区不满,马上就会加到ready_fd_List(描述符就绪队列)当中,然后马上在下一个循环让epoll_wait返回这个描述符回来。

读:

(1)读缓冲区只需要缓冲区内仍然后没读出的数据(不为空),也会马上加到ready_fd_List(描述符就绪队列),等下一次epoll_wait返回回来。

概括起来:只要缓冲区能用就可以了(不为空--->读取 //// 不满---->写)

 

在ET模式下缓冲区仅在状态变化的时候才会返回(比较复杂)

 

写:

(1)缓冲区由满数据---->不满有可写进去空间)的时候才可以被放到ready_fd_List。

(2)缓冲区是空,然后用户态进程有数据要写进去的时候,也会放到ready_fd_List。 

(SPECIAL)有一个隐藏问题,(当写缓冲区输入的速度大于发送的速度)当缓冲区有数据但是不满,用户态进程需要写数据进去,我们也需要找办法

 将描述符放置到ready_fd_List当中,让epoll_wait返回(他自己可不会返回哦),将对应的events变成epoll_mod_out。

 

读:

(1)缓冲区为空突然来了数据。空--->非空有可以读取数据在缓冲区)。

(2)有新数据到达。用户态进程有东西要写

(SPECIAL)同上也是隐藏问题,(当读缓冲区接受外来数据的速度大于用户自己读取的速度)缓冲区数据不空,但仍然有数据可以读,我们也是要想办法

将描述符状态改过来防止带ready_fd_List当中,就是讲对应的event编程epoll_mod_In.

 

posted on 2016-10-24 15:01  Gary Kildall  阅读(350)  评论(0)    收藏  举报