典型应用于以下场合
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. 09.正则表达式re-2.complie函数

    compile 函数用于编译正则表达式,生成一个 Pattern 对象,它的一般使用形式如下: import re # 将正则表达式编译成 Pattern 对象 pattern = re.compil ...

  2. nginx下部署showdoc

    1. 安装nginx服务器sudo apt-get install nginx -y 2. 启动服务sudo service nginx start 3. 安装php环境 sudo apt-get i ...

  3. Vue CLI 3 中文文档

    翻译文档 文档翻译全貌 前言 之前写了一篇Vue CLI 3.x 版本的简单体验,当时文档还不全,具体的使用方法并不是很清楚,大概是2月7号,收到Vue CLI 3接近Beta版的提示,作者尤雨溪也讲 ...

  4. poj 3177&&poj 3352加边构双联通(有重边)用tarjan 模板求的

    #include<stdio.h>/* 求边双联通分量和求强连通差不多,先缩点求出叶子节点的个数 */ #include<string.h> #define N 5100 st ...

  5. SIM卡中UCS2编码的三种格式(80,81,82)分析

    网上看到一篇比较好的说ucs2编码的文章,保存一下,原文地址: http://hi.baidu.com/youren4548/blog/item/fa08bd1bf61005058618bf1d.ht ...

  6. 优酷土豆资深工程师:MySQL高可用之MaxScale与MHA

    本文根据DBAplus社群第67期线上分享整理而成 本次分享主要包括以下内容: 1.MySQL高可用方案 2.为什么选择MHA 3.读写分离方案的寻找以及为什么选择Maxscale 一.MySQL  ...

  7. Linux Storage Stack Diagram 4.0

    https://www.thomas-krenn.com/en/wiki/Linux_Storage_Stack_Diagram

  8. Go在Ubuntu 14.04 64位上的安装过程

    1. 从 https://golang.org/dl/  或  https://studygolang.com/dl 下载最新的发布版本go1.10即go1.10.linux-amd64.tar.gz ...

  9. 安装Maven并搭建Maven私有仓库

    一.说明 Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具.我们在进行Java代码开发的时候,Eclipse+Maven+Jetty是一个十 ...

  10. 【iOS开发系列】九宫格布局

    /** * 这个尽管非常easy,算是一个小技巧,可是碰到了就记录下来吧.积跬步,致千里嘛. */ - (void)scratchableLatex { for (int i=0; i<9; i ...