我是靠谱客的博主 美丽缘分,最近开发中收集的这篇文章主要介绍c语言编程---网络编程之epoll后续01,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Epoll的LT模式和ET模式的比较

         先简单比较一下level trigger 和 edge trigger 模式的不同。

LT模式的特点是:

  •   若数据可读,epoll返回可读事件
  •   若开发者没有把数据完全读完,epoll会不断通知数据可读,直到数据全部被读取。
  •   若socket可写,epoll返回可写事件,而且是只要socket发送缓冲区未满,就一直通知可写事件。
  •   优点是对于read操作比较简单,只要有read事件就读,读多读少都可以。
  •   缺点是write相关操作较复杂,由于socket在空闲状态发送缓冲区一定是不满的,故若socket一直在epoll wait列表中,则epoll会一直通知write事件,所以必须保证没有数据要发送的时候,要把socket的write事件从epoll wait列表中删除。而在需要的时候在加入回去,这就是LT模式的最复杂部分。

ET模式的特点是:

  •   若socket可读,返回可读事件
  •   若开发者没有把所有数据读取完毕,epoll不会再次通知epoll read事件,也就是说存在一种隐患,如果开发者在读到可读事件时,如果没有全部读取所有数据,那么可能导致epoll在也不会通知该socket的read事件。(其实这个问题并没有听上去难,参见下文)。
  •   若发送缓冲区未满,epoll通知write事件,直到开发者填满发送缓冲区,epoll才会在下次发送缓冲区由满变成未满时通知write事件。
  •   ET模式下,只有socket的状态发生变化时才会通知,也就是读取缓冲区由无数据到有数据时通知read事件,发送缓冲区由满变成未满通知write事件。
  •   缺点是epoll read事件触发时,必须保证socket的读取缓冲区数据全部读完(事实上这个要求很容易达到)
  •   优点:对于write事件,发送缓冲区由满到未满时才会通知,若无数据可写,忽略该事件,若有数据可写,直接写。Socket的write事件可以一直发在epoll的wait列表。Man epoll中我们知道,当向socket写数据,返回的值小于传入的buffer大小或者write系统调用返回EWouldBlock时,表示发送缓冲区已满。

    总结

      LT模式主要是读操作比较简单,但是对于ET模式并没有优势,因为将读取缓冲区数据全部读出并不是难事。而write操作,ET模式则流程非常的清晰,按照完全状态机来理解和实现就变得非常容易。而LT模式的write操作则复杂多了,要频繁的维护epoll的wail列表。

          在代码编写时,把epoll ET当成状态机,当socket被创建完成(accept和connect系统调用返回的socket)时加入到epoll列表,之后就不用在从中删除了。为什么呢?man epoll中的FAQ告诉我们,当socket被close掉后,其自动从epoll中删除。对于监听socket简单说几点注意事项:

    •   监听socket的write事件忽略
    •   监听socket的read事件表示有新连接,调用accept接受连接,直到返回EWouldBlock。
    •   对于Error事件,有些错误是可以接受的错误,比如文件描述符用光的错误

    故,综上所述,服务器程序中推荐使用epoll 的ET 模式!!!!


最后

以上就是美丽缘分为你收集整理的c语言编程---网络编程之epoll后续01的全部内容,希望文章能够帮你解决c语言编程---网络编程之epoll后续01所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部