典型应用于以下场合
1.处理多个描述字时,比如同时处理套接字和磁盘IO、终端IO
2.一个客户同时处理多个套接字
3.服务器既要处理监听套接字,又要处理已连接套接字
4.既要处理TCP、也要处理UDP
5.一个服务器要处理多个服务和协议
I/O多路复用不局限于网络编程,也可以用于其他程序。
UNIX中五种I/O模型
1.阻塞I/O
2.非阻塞I/O
3.I/O多路复用
4.异步I/O
5.信号驱动I/O
信号驱动模型
5种I/O模型的比较
 

select函数有三种使用方式

1.函数阻塞直至有起码一个描述符就绪
2.函数等待timeval指定的时间,在一个描述符准备好I/O时返回,最长等待时间不超过timeval指定的时间。
3.根本不等待,检查描述字后立即返回
前两种使用方式中,控制流将会等待,如果等待中的控制流接收到一个信号,控制流将被中断并返回EINTR作为返回值。针对该错误,需要再次重启select
套接口准备好读的条件
1.套接口接收缓冲区的字节大于等于套接口接收缓冲区低潮限度的当前值,对这个套接口的读操作将不阻塞并返回一个大于0的值,我们可以通过SO_RCVLOWAT来设置这个低潮限度,对于TCP和UDP套接字,其值缺省为1
2.连接的读的这一边关闭,即接收了FIN的TCP连接,对于这样的套接字进行读将不阻塞并返回0(即文件结束符)。
3.套接口是一个监听套接字,且可用连接大于0的时候,对这样的套接字读取将不会阻塞。
4.有一个套接口错误待处理,对这样的套接口进行读取将不会阻塞,并返回-1,errno设置成明确的错误条件,这些待处理的错误也可以通过SO_ERROR调用getsockopt获得并清除。
套接口准备好写的条件
1.套接口可用发送缓冲区的字节数大于等于套接口发送缓冲区的低潮限度,且或者(1)套接口已连接,或者(2)套接口不要求连接(比如UDP),这意味着,如果我们将这样的套接口设为非阻塞,写操作将不阻塞并返回一个正值(由传输层接收的字节数),可以通过SO_SNDLOWAT设置该低潮限度,对于TCP和UDP,其缺省值一般是2048.
2.套接口的发送这一边关闭,对这样的套接口进行写入将产生SIGPIPE信号。
3.有一个套接口错误待处理,对这样的套接字写操作将不阻塞并返回一个错误-1,errno设置成明确的错误指示,对于这样的错误也可以通过SO_ERROR调用getsockopt获得并清除。
当一个套接口出错时,其被select标记为即可读又可写。
对于select来说,导致套接字可读或者可写的条件总结
shutdown的作用
正常终止网络连接的方式是调用close,但close有两个限制:引用计数,只有引用计数为0才真正关闭;同时关闭write和read。
1.close将socket的引用计数减1,只有当引用计数为0时才真正关闭,用shutdown可以激发socket的正常关闭流程,即从FIN开始的4次交互,而不管访问计数。
2.close终止了数据传送的两个方向。有很多时候我们需要通知对端己方已完成数据发送,即使对端有很多数据待发送。
第2种场景的应用:read返回0当作通知,告诉对端己方已发完所有数据。
1.客户端关闭shut_wr通知服务端,已完成所有客户请求的发送。
2.服务器关闭shut_wr通知客户端,所有应答已完成发送。
shutdown关闭写一端的socket连接
 

shutdown和close的几种应用场景和对比

拒绝服务型攻击
如果客户端连接到服务器并发送了不完整的请求就停止,而服务器循环read,期待收到一个完整的请求,此时就会阻塞在单个客户的请求,而不能给其他客户提供服务,这就叫做拒绝服务型攻击。
解决拒绝服务型攻击的方法就是不能让服务器阻塞于某一个客户端的请求。可以解决的办法有
1.非阻塞的I/O操作
2.每个客户的请求一个线程或者进程处理
3.设置超时,I/O设置超时时限
shut_down的SHUT_RDWR和close有什么区别
shutdown的动作会立即终止读和写操作,在发送缓冲区的数据被发往对端后,发出正常的TCP终止序列(FIN)
close的动作禁止在套接口上进行读和写操作,套接口发送缓冲区的内容被发往另一端,如果引用计数为0,发出正常的TCP终止序列。

I/O多路复用技术的更多相关文章

  1. Lind.DDD.RedisClient~对StackExchange.Redis调用者的封装及多路复用技术

    回到目录 两雄争霸 使用StackExchange.Redis的原因是因为它开源,免费,而对于商业化的ServiceStack.Redis,它将一步步被前者取代,开源将是一种趋势,商业化也值得被我们尊 ...

  2. 【计算机网络基础】数据交换技术和多路复用技术的正(nao)确(can)打开方式

    交换的作用   数据交换是计算机网络中两个终端进行数据传输的方式,它又可以分成两种类型:电路交换和分组交换.很显然,问题的核心在于“交换”,那么我们首先要思考的是:交换的作用是什么?   “交换”的作 ...

  3. 【计算机网络】数据交换技术和多路复用技术的正(nao)确(can)打开方式

    交换的作用   数据交换是计算机网络中两个终端进行数据传输的方式,它又可以分成两种类型:电路交换和分组交换.很显然,问题的核心在于“交换”,那么我们首先要思考的是:交换的作用是什么?   “交换”的作 ...

  4. Oracle体系结构之控制文件的多路复用技术

    在Windows操作系统中,如果注册表文件被损坏了,就会影响操作系统的稳定性.严重的话,会导致操作系统无法正常启动.而控制文件对于Oracle数据库来说,其作用就好象是注册表一样的重要.如果控制文件出 ...

  5. I/O多路复用技术(multiplexing)是什么?

    作者:知乎用户链接:https://www.zhihu.com/question/28594409/answer/52763082来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  6. 解读I/O多路复用技术

    前言 当我们要编写一个echo服务器程序的时候,需要对用户从标准输入键入的交互命令做出响应.在这种情况下,服务器必须响应两个相互独立的I/O事件:1)网络客户端发起网络连接请求,2)用户在键盘上键入命 ...

  7. Redis I/O 多路复用技术原理

    引言 Redis 是一个单线程却性能非常好的内存数据库, 主要用来作为缓存系统. Redis 采用网络 I/O 多路复用技术来保证在多个连接时,系统的高吞吐量(TPS). 系统吞吐量(TPS)指的是系 ...

  8. IO多路复用技术总结

    来源:微信公众号「编程学习基地」 IO 多路复用概述 I/O 多路复用技术是为了解决进程或线程阻塞到某个 I/O 系统调用而出现的技术,使进程不阻塞于某个特定的 I/O 系统调用. 在IO多路复用技术 ...

  9. IO多路复用技术详解

      IO多路复用:I/O是指网络I/O,多路指多个TCP连接(即socket或者channel),复用指复用一个或几个线程.意思说一个或一组线程处理多个TCP连接.最大优势是减少系统开销小,不必创建过 ...

随机推荐

  1. 值得收藏--GitHub Top 20 开源项目

    参考链接:https://github.com/Aufree/trip-to-iOS/blob/master/Top-100.md 项目名称                            项目 ...

  2. linux系统中给mysql配置环境变量

    安装过程就不写了,记得安装的路径就行,接下来要用到. 修改配置文件 vim /etc/profile 设置环境变量 写一个MYSQL_HOME,值为“mysql的安装路径” 在PATH后面加上$MYS ...

  3. lua返回页面时中文乱码

    1.在nginx.conf文件中的server标签里添加charset utf-8; 2.查看lua文件编码是否为utf-8

  4. 【codeforces 798B】Mike and strings

    [题目链接]:http://codeforces.com/contest/798/problem/B [题意] 给你n个字符串; 每次操作,你可以把字符串的每个元素整体左移(最左边那个字符跑到最后面去 ...

  5. Font Awesome使用方法

    Font Awesome(中文站点)是一套为Bootstrap而创造的图标字体库及CSS框架,在业界享有盛誉. FA包含了常规web开发所需要用到的几乎所有图标,并且免费授权使用,只需要下载即可.所有 ...

  6. 0120Keeplived实现自动切换Mysql服务

    转自http://biancheng.dnbcw.info/mysql/381020.html Keepalived+mysql 自动切换网络结构:VIP 192.168.88.200mysq11 1 ...

  7. owin-startup方法

    owin在根目录下有这个startup.cs文件,里面有个startup方法,这个和global.asax有什么区别呢? 测试一下执行顺序,是先执行了global.asax文件,再执行了startup ...

  8. [Java]对字符串中的每一个单词个数进行统计

    这是来自一道电面的题. 单词统计非常easy想到用Map来统计,于是想到了用HashMap. 可是我却没有想到用split来切割单词,想着用遍历字符的方式来推断空格.人家面试官就说了,假设单词之间不止 ...

  9. 【跟我一起学Unity3D】做一个2D的90坦克大战之AI系统

    对于AI,我的初始想法非常easy,首先他要能动,而且是在地图里面动. 懂得撞墙后转弯,然后懂得射击,其它的没有了,基于这个想法,我首先创建了一个MyTank类,用于管理玩家的坦克的活动,然后创建AI ...

  10. POJ 3280 Cheapest Palindrome DP题解

    看到Palindrome的题目.首先想到的应该是中心问题,然后从中心出发,思考怎样解决. DP问题通常是从更加小的问题转化到更加大的问题.然后是从地往上 bottom up地计算答案的. 能得出状态转 ...