I/O多路复用技术

典型应用于以下场合

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终止序列。

时间: 2025-01-31 06:45:43

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

控制文件的多路复用技术

在Windows操作系统中,如果注册表文件被损坏了,就会影响操作系统的稳定性.严重的话,会导致操作系统无法正常启动.而控制文件对于Oracle数据库来说,其作用就好象是注册表一样的重要.如果控制文件出现了意外的损坏,那么此时Oracle数据库系统很可能无法正常启动.为此作为Oracle数据库管理员,务必要保证控制文件的安全. 在实际工作中,数据库管理员可以通过备份控制文件来提高控制文件的安全性.但是笔者认为这是下下之策.因为当控制文件出现损坏时,通过备份文件来恢复的话,会出现数据库在一段时间内的

[libevent]支持I/O多路复用技术

Libevent的核心是事件驱动.同步非阻塞,为了达到这一目标,必须采用系统提供的I/O多路复用技术,而这些在Windows.Linux.Unix等不同平台上却各有不同,如何能提供优雅而统一的支持方式,是首要关键的问题. 统一的关键 Libevent支持多种I/O多路复用技术的关键就在于结构体eventop,这个结构体前面也曾提到过,它的成员是一系列的函数指针, 定义在event-internal.h文件中: struct eventop { const char *name; void *(*

【Flume】flume的多路复用技术multiplexing

多路复用技术意在可以将一个event根据配置信息发送特定的channel上. A source instance can specify multiple channels, but a sink instance can only specify one channel. Flume supports fanning out the flow from one source to multiple channels. There are two modes of fan out, replic

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

回到目录 两雄争霸 使用StackExchange.Redis的原因是因为它开源,免费,而对于商业化的ServiceStack.Redis,它将一步步被前者取代,开源将是一种趋势,商业化也值得被我们尊重,毕竟人家研究代码也不容易,做商品也很正常,当然这不是我们今天的重要,今天主要说一下对StackExchange.Redis的封装,它与ServicesStack.redis最大的不同就是,它没有线程池的概念,这对于初学者绝对是个坑,大家使用时一定要注册,StackExchange.redis的对

多路复用技术

复用的概念是从提高通信的有效性角度提出来的,其主要目的是为了有效地利用带宽.多路复用通常分为频分多路复用.时分多路复用.波分多路复用.码分多址和空分多址. 1. 频分多路复用(FDM,Frequency Division Multiplexing) 频分多路复用的基本原理是:如果每路信号以不同的载波频率进行调制,而且各个载波频率是完全独立的,即各个信道所占用的频带不相互重叠.相邻信道之间用“警戒频带”隔离,那么每个信道就能独立地传输一路信号. 频分多路复用的主要特点是,信号被划分成若干通道(频道

Java IO多路复用技术简介

<span style="font-size:18px;">package com.winwill.nio; /** * @author qifuguang * @date 15-2-4 下午2:07 */ public class TimeServerMain { public static void main(String[] args) throws Exception { // 启动时间服务器 new Thread(new SelectorTimeServer())

IO多路复用——select

IO多路复用 是同步IO的一种,用一个进程一次等待多个IO就绪事件的发生,加大概率,尽可能高效的等. 适用场景 (1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/O复用. (2)当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现. (3)如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用. (4)如果一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用. (5)如果一个服务器要处理多个服务或多个协议,一般要使用I/O

Python之路【第七篇续】:I/O多路复用

回顾原生Socket 一.Socket起源: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用[打开][读写][关闭]模式来操作. socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭) “他是所有WEB服务器的祖宗” pupepet.ansible.他们也可以通过输入命令然后返回结果这个也是基于Socket来实现的. 二.socket和file的区别:    file模块是针

IO多路复用之select

基本概念 IO多路复用是指内核(线性扫描)一旦发现进程指定的一个或者多个IO条件准备就绪,它就通知该进程,执行定义的操作. 适用场景 1.当客户处理多个描述符时(一般是交互式输入和网络套接字),必须使用I/O复用. 2.当一个客户同时处理多个套接字时,而这种情况是可能的,但很少出现. 3.如果一个TCP服务器既要处理监听套接字,又要处理已连接套接字,一般也要用到I/O复用. 4.如果一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用. 5.如果一个服务器要处理多个服务或多个协议,一般