典型应用于以下场合
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. swift-UITableView的基本使用

    废话不多说了,直接贴我今天写的代码吧:如果新手有什么不懂的,可以发我邮箱. // //  singleInfo.swift            个人信息 //  Housekeeper // //  ...

  2. Git 基础教程 之 Bug分支和Stash

    在Git中,每个Bug都可以通过一个新的临时分支修复,修复后,合并分支,然后删除. ①    当接到一个Bug任务时,但dev上进行的工作还没有提交时: ②    git stash 把现场工作“储藏 ...

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

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

  4. tp5 权限设置

    ============================== <?php/** * Created by PhpStorm. * User: 14155 * Date: 2018/11/10 * ...

  5. jvm学习-ClassLoader(二)

    ClassLoader结构 jdk加载的4个步骤 CustomClassLoader 用户自定义的classLoader APPClassLoader主要加载classPath下面的class Ext ...

  6. 神奇的JAVA多态

    以前理解了基本思想,这版本的演示和应用比较真实. 顺路下来抽象方法和类,接口,就顺理成章啦... JAVA文件放一块了,分别对照前一个帖子的文件名: ///////////////////////// ...

  7. [bzoj2588][Spoj10628]Count on a tree_主席树

    Count on a tree bzoj-2588 Spoj-10628 题目大意:给定一棵n个点的树,m次查询.查询路径上k小值. 注释:$1\le n,m\le 10^5$. 想法:好像更博顺序有 ...

  8. Linux排序命令sort(转)

    Linux sort命令用于将文本文件内容加以排序.sort可针对文本文件的内容,以行为单位来排序. 语法 sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符&g ...

  9. 手把手实现Java权限(1)-Shiro介绍

    功能介绍 Authentication :身份认证/登录.验证用户是不是拥有对应的身份:  Authorization :授权,即权限验证.验证某个已认证的用户是否拥有某个权限:即推断用  户能否做事 ...

  10. 学习日记之原型模式和Effective C++

    原型模式(Prototype):用原型实例制定创建对象的种类,而且听过拷贝这些原型创建新的对象. 浅复制:假设字段是值类型的,则对该字段运行逐位复制.假设字段是引用类型.则复制引用但不复制引用的对象. ...