I/O多路复用方案
1. 本节思维导图

2. 基本的网络编程接口
2.1 基于TCP的通信模型

2.2 基于UDP的通信模型

3. 非阻塞的服务器程序
file、pipe、fifo、socket在默认创建过程中都是阻塞的(block),非阻塞的接口相比于阻塞型接口的显著差异在于,在被调用之后立即返回,在linux中我们可以使用fcntl()函数来设置描述符的状态
fcntl(fd,F_SETFL, O_NOBLOCK)
fcntl函数重点关注第二个参数中的F_SETFL和F_GETFL设置或获取描述符的状态
状态包括:O_NONBLOCK O_APPEND O_ASYNC
O_DIRCT(最小化或去掉reading和writing的缓存影响.系统将企图避免缓存你的读或写的数据)
在非阻塞的状态下,recv()接口在被调用后立即返回,返回值代表了不同的含义:
()recv()返回值大于0,表示接收数据完毕,返回值即是接收到的字节数
()recv()返回值为0,表示链接已经正常断开
()recv()返回值为-,且errno等于EAGAIN,表示recv操作还没有执行完成
()recv()返回值为-,且error不等于EAGAIN,表示recv操作遇到系统错误errno
注意:绝不推荐循环调用recv()来检测“操作是否完成”,循环调用recv将大幅度推高CPU占用率,实际操作系统提供了更为高效的方法来检测“操作是否完成”,比如select、epoll
4. select()接口的基于事件驱动的服务器模型
大部分UNIX/LINUX都支持select函数,改函数用于探测多个文件句柄的状态变化,以下为select接口的原型:
FD_ZERO(int fd, fd_set *fds) // fd_set类型变量的所有位都设为0
FD_SET(int fd, fd_set *fds ) // 设置变量的某个位置位
FD_ISSET(int fd, fd_set *fds) // 测试某个位置是否被置位
FD_CLR(int fd, fd_set *fds) // 清除某个位时可以使用
int select(int nfds, fd_set *readfds, fd_set *writefds, df_set *exceptfds, struct timeval *timeout)
关于select更加详细的说明和使用请参考:https://www.cnblogs.com/skyfsm/p/7079458.html
5. 使用epoll实现异步事件通知模型
已经在前面的博客中总结了epoll用法,具体参考:linux之epoll
这里重点说明下accept的使用技巧:
(1)阻塞模式accept存在的问题,考虑这种情况:TCP链接被客户端夭折,即在服务器调用accept之前,客户端主动发送RST终止链接,导致刚刚建立的链接从就绪队列中移除,如果套接口被设置为阻塞模式,服务器就会一直阻塞在accept调用上,直到其它某个客户端建立一个新的链接为止,但是在此期间,服务器单纯地阻塞在accept调用上,就需队列中的其它描述符都得不到处理
解决方法:把监听套接口设为非阻塞,当客户端在服务器调用accept之前中止某个连接时,accept调用可以立即返回-1,这时源自Berkeley的实现会在内核中处理该事件,并不会将该事件同质epoll。而其它实现把errno设置为ECONNABORTED或者EPROTo错误,我们可以忽略这两个错误。
(2)ET模式相爱的accept存在的问题,考虑这种情况:多个链接同时到达时,服务器的TCP就绪队列瞬间基类多喝就绪链接,由于是边缘触发模式,epoll只会通知一次,accept只处理第一个链接,导致TCP就绪队列中剩下的链接都得不到处理
解决方法:用while循环包住accept,处理完TCP就绪队列中的所有链接后再退出循环,如何知道是否处理完就绪队列中的所有链接呢?accept返回-1并且errno设置为EAGAIN就表示所有的链接都处理完。
I/O多路复用方案的更多相关文章
- 网络编程基础【day10】:IO多路复用
这些名词比较绕口,理解涵义就好.一个epoll场景:一个酒吧服务员(一个线程),前面趴了一群醉汉,突然一个吼一声“倒酒”(事件),你小跑过去给他倒一杯,然后随他去吧,突然又一个要倒酒,你又过去倒上,就 ...
- Socket网络编程-IO各种概念及多路复用
Socket网络编程-IO各种概念及多路复用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.操作系统相关知识 1>.同步和异步 函数或方法被调用的时候,调用者是否得到最 ...
- 【转】Reactor与Proactor两种模式区别
转自:http://www.cnblogs.com/cbscan/articles/2107494.html 两种IO多路复用方案:Reactor and Proactor 一般情况下,I/O 复用机 ...
- 分析Tornado的协程实现
转自:http://www.binss.me/blog/analyse-the-implement-of-coroutine-in-tornado/ 什么是协程 以下是Wiki的定义: Corouti ...
- 两种高性能I/O设计模式(Reactor/Proactor)的比较
原文出处: Alex Libman 译文出处:潘孙友 欢迎分享原创到伯乐头条 综述 这篇文章探讨并比较两种用于TCP服务器的高性能设计模式. 除了介绍现有的解决方案,还提出了一种更具伸缩性,只 ...
- 关于Reactor和Proactor的差别
/********************************************************************* * Author : Samson * Date ...
- LPC43xx SGPIO Experimentation
LPC4350 SGPIO Experimentation The NXP LPC43xx microcontrollers have an interesting, programmable ser ...
- [转]两种高性能I/O设计模式(Reactor/Proactor)的比较
[原文地址:http://www.cppblog.com/pansunyou/archive/2011/01/26/io_design_patterns.html] 综述 这篇文章探讨并比较两种用于T ...
- python 多线程编程之进程和线程基础概念
多线程编程 在多线程(multithreaded,MT)出现之前,计算机程序的执行都是由单个步骤序列组成的,该序列组合在主机的CPU中按照同步顺序执行.无论是任务本身需要按照步骤顺序执行,还是整个过程 ...
随机推荐
- Flume1.7.0的安装与使用
Flume下载后,解压,新增一个配置文件,写入配置即可 我将配置文件写在 conf 下,取名为 flume-conf-spooldir.properties Flume 运行命令: bin/flume ...
- VS2012安装完成之后,用自带的Blend无法创建WPF项目,打开WPF项目无法设计
Visual Studio 2012安装完成之后, 打开自带的Blend for Visual Studio 无法创建新的WPF或者Silverlight项.打开WPF项目无法编辑的原因: 1.VS自 ...
- 【Java并发】Executor框架
Executor框架简介 Java的线程既是工作单元,也是执行机制.从JDK5开始,把工作单元和执行机制分离开来. Executor框架由3大部分组成 任务. 被执行任务需要实现的接口:Runna ...
- 介绍几个C#正则表达式工具
这里将为大家推荐介绍几个C#正则表达式工具,这些小工具能帮助大家在.NET开发过程中起到事半功倍的效果,希望大家喜欢. 推荐三个C#正则表达式工具,理由如下 第一个C#正则表达式工具,REGEX 这个 ...
- Linux嵌入式 -- 内核简介(x86)
0. 嵌入式系统 以应用为中心,软硬件可裁剪,对功耗.对体积.对成本等都有严格要求的专用计算机系统. 1. linux体系结构 2. 为什么 划分为 用户空间 和 内核控件 ? 分两级,内核和应用 ...
- Generate parentheses,生成括号对,递归,深度优先搜索。
问题描述:给n对括号,生成所有合理的括号对.比如n=2,(()),()() 算法思路:利用深度优先搜索的递归思想,对n进行深度优先搜索.边界条件是n==0:前面电话号组成字符串也是利用dfs. pub ...
- HttpClient示例01
1.要使用 HttpClient 需要下载 Apache的相关包 我这里下载的是 httpcomponents-client-4.5.2-bin.zip.httpcomponents-client-4 ...
- 开发中Dialog多弹窗管理
随着项目的不断迭代,加上产品经理大法(这里加一个弹窗提示,这里加一个引导….)各种弹窗在应用启动时候需要展示, 然而它们出现的时机还有可能重叠.我勒个擦...有没有一种优(tou)雅(lan)的方式来 ...
- Android仿IOS底部弹出选择菜单ActionSheet
使用Dialog的实现方式,解决原ActionSheet使用Fragment实现而出现的部分手机取消按钮被遮盖的问题 java部分代码: import android.app.Dialog; impo ...
- Intellij IDEA 配置Subversion插件实现步骤详解
在使用Intellij的过程中,突然发现svn不起效了,在VCS–>Checkout from Version Control中也未发现Subversion这一项.如下图: 一.原因查找 经过 ...