典型应用于以下场合
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. Selenium3+python自动化-iframe

    一.frame和iframe区别 Frame与Iframe两者可以实现的功能基本相同,不过Iframe比Frame具有更多的灵活性. frame是整个页面的框架,iframe是内嵌的网页元素,也可以说 ...

  2. 【剑指Offer】8、跳台阶

      题目描述:   一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果).   解题思路:   首先考虑最简单的情况,如果只有1级台阶, ...

  3. qbxt 考前集训 Day1

    立方数(cubic) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方数 ...

  4. BZOJ 3744 Gty的妹子序列 (分块+树状数组+主席树)

    题面传送门 题目大意:给你一个序列,多次询问,每次取出一段连续的子序列$[l,r]$,询问这段子序列的逆序对个数,强制在线 很熟悉的分块套路啊,和很多可持久化01Trie的题目类似,用分块预处理出贡献 ...

  5. str使用注意点(未完待续)

    1.(切片)str[num1,num2],是指截取 str[num1] 到 str[num2-1] 直接的元素

  6. H5-video1 iOS苹果和微信中音频和视频实现自动播放的方法

    <audio preload="preload" controls id="car_audio" src="http://media.xitao ...

  7. 多层下firebird自增长字段的处理

    使用unidac可以解决自增长字段处理的问题. 对于多层就是一个比较烦人的事情,解决办法:cliendataset中自增长字段的处理:id:自增长字段.在client中的处理方法:clientdata ...

  8. eclipse中 使用maven搭建ssh项目 思路复习(含有pom.xml)

    首先在web.xml中配置监听器 在服务器启动的时候 进行bean对象的创建(只会创建单例对象 dao service   多例对象action可不会创建  每个多例对象是不同的 创建了有什么意义呢 ...

  9. Spring中获取Session的方法汇总

    Spring: web.xml <listener> <listener-class>org.springframework.web.context.request.Reque ...

  10. sqlserve 数据类型具体解释

    decimal   精确数值型  decimal 数据类型能用来存储从-10的38次幂-1到10的38次幂-1的固定精度和范围的数值型数据.使用这样的数据类型时,必须指定范围和精度. 范围是小数点左右 ...