selec/poll中的读写事件和epoll中的读写事件

在Linux网络编程中,常常使用select和poll来做事件触发,监听socket的读写状态,然后进行读写操作。现在新的linux内核中,增加了epoll事件触发机制,具有更高的性能和更好的设计理念,可以用它来完全代替select和poll。相比于select,epoll最大的好处在于它不会随监听fd数目的增长而降低效率。因为在内核总的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且,在linux/posix_types.h头文件中有这样的声明:

[cpp] view plain copy

  1. #define __FD_SETSIZE 1024

表示select最多同时监听1024个fd,当然,可以通过修改头文件再重新编译内核来扩大这个数目,但这似乎并不治本。(引自《使用EPOLL进行网络编程》,这篇文章主要是进行一个读写事件的总结,不会过多地讨论epoll,而且本人也是初学)

一、select/poll中的读写事件

1.下列四个条件中的任何一个满足时,套接口准备好多:

a. 有数据可读,专业的说法是:套接字接收缓冲区中的数据字节数大于等于套接字接收缓冲区低潮限度的当前值。可以使用套接字选项SO_RCVLOWAT来设置低潮限度,对于TCP和UDP套接字,其值缺省为1

b. 连接的度这一半关闭,也就是说接收了FIN的TCP连接。对这样的套接字的套接字将不阻塞且返回0(即文件结束符)

c.套接字是一个监听套接字且已完成的连接数为非0,即连接建立后可读

d. 有一个套接字错误待处理。对这样的套接字的读操作将不阻塞且返回一个错误(-1),errno则设置成明确的错误条件。这些待处理的错误也可以通过指定套接口选项SO_ERROR调用getsockopt来取得并清除。

2.下列三个条件中的任一个满足时,套接字准备好写:

a. 缓冲区可写,专业的说法是:套接字发送缓冲区中的可用字节数大于等于套接字发送缓冲区低潮限度的当前值,且或者套接字已连接或者套接字不要求连接(例如UDP套接字),对于TCP和UDP套接字,其缺省值一半为2048

b. 连接的写这一半关闭。对这样的套接字的写操作将产生信号SIGPIPE

c.有一个套接字错误待处理。

二、 epoll的读写事件

EPOLL ET模式下:

读事件的发生条件

1、正常数据到达

2、关闭数据(FIN)到达,即关闭连接

3、连接错误数据(reset)到达

4、连接到到达时(对于监听套接字)

写事件的发生

1、连接建立成功后可写(accept获取的套接字或者客户端建立连接的套接字)

2、缓冲区可写

通过上面的分别阐述,epoll的读写事件区分要比select/poll清晰一些,epoll还有很多优点和细节,在以后的文章中再介绍

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2016-08-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云计算教程系列

使用SmokePing监控你的服务器

SmokePing是一款监控网络状态和稳定性的开源软件(它是rrdtool的作者开发的),通过它可以监控到公司IDC的网络状况,如延时,丢包率,是否BGP多线等...

58550
来自专栏hadoop学习

Hadoop伪分布式环境搭建之Linux操作系统安装

本篇文章是接上一篇《超详细hadoop虚拟机安装教程(附图文步骤)》,上一篇有人问怎么没写hadoop安装。在文章开头就已经说明了,hadoop安装会在后面写到...

9100
来自专栏IT 指南者专栏

基于 Hexo + GitHub Pages 搭建个人博客(三)

打开 themes 目录下的 next 主题配置文件,找到 Wechat Subscriber 标签,将该标签下的配置改成如下形式:

49740
来自专栏企鹅号快讯

JavaScript有这几种测试分类

原文:《What are Unit Testing, Integration Testing and Functional Testing?》https://b...

208100
来自专栏菩提树下的杨过

spring cloud: 使用consul来替换config server

上一篇提到了,eureka 2.x官方停止更新后,可以用consul来替代,如果采用consul的话,其实config server也没必要继续使用了,cons...

23230
来自专栏网络

强大的开源网络侦查工具:IVRE

IVRE简介 IVRE(又名DRUNK)是一款开源的网络侦查框架工具,IVRE使用Nmap、Zmap进行主动网络探测、使用Bro、P0f等进行网络流量被动分析,...

39770
来自专栏机器学习和数学

[无聊的软件安装] 从零搭建深度学习环境简明教程

前方图片已沦陷,建议后台回复 环境 获取word版,下载到电脑上方便查看。 主要包括以下内容: 1. 安装Ubuntu 16.04 系统 2.安装Ubuntu系...

36490
来自专栏信安之路

安全开发之 token 那些事

在开发网络应用时,不管是移动端的 APP 也好,还是 web 端 APP 也好,只要有用户群体存在,都绕不开身份认证这个话题,选择一种好的身份认证方法常常在应用...

13300
来自专栏郭耀华‘s Blog

危化品速查APP--Android Project

开发环境 Android studio 2.3.1 功能描述 集成多种查询方式,查看本地数据库中危险化学品的信息; 按照中文拼音和英文首字母,对化学品进行查询;...

32070
来自专栏网络

服务化基石之远程通信系列二:通信协议之应用层

通信协议之应用层 应用层包含所有的高层协议,例如FTP (File Transfer Protocol的简写,中文名称是文件传输协议)、SMTP (Simple...

21950

扫码关注云+社区

领取腾讯云代金券