I/O复用

简介:

I/O复用的场合:

1 客户处理多个描述字时

2 客户处理多个套接口

3 服务器处理监听套接口,又要处理已连接套接口

4 既处理TCP,又处理UDP

5 处理多个服务或者多个协议

套接口上的输入操作:

1 数据到达网络,分组到达时,被拷贝到内核的某个缓冲区

2 将数据从内核缓冲区拷贝到应用缓冲区

非阻塞模型,应用进程连续不断的查询内核,看看某操作是否准备好。这对CPU时间是极大的浪费。

I/O复用,调用select或pool,调用某一个阻塞

通过系统调用sigaction安装信号处理程序,当数据准备好时,就生成一个SIGIO信号,调用recvfrom读取数据报

异步IO模型

调用函数aio_read传递给内核相关信息,内核数据拷贝完成后,返回信号

select()函数:

允许进程指示内核等待多个事件中的任一个发生,并仅在一个或多个时间发生或经过某指定的事件后才唤醒进程。

套接口准备读:

1 接收缓冲区中的数据字节数大于等于套接口接收缓冲区低潮限度的当前值

2 连接的读这一半关闭

3 套接口是一个监听套接口且已完成的连接数为非0

4 有一个套接口错误待处理

套接口准备写:

1 发送缓冲区中的可用字节数大于等于套接口发送缓冲区低潮限度的当前值,且或 套接口已连接,套接口不要求连接

2 连接的写这一半关闭

3 有一个套接口错误待处理

接收和发送低潮限度的目的:

在select返回之前,应用进程知道有多少出具可读或有多大的空间可用于写

使用shutdown相对于cloose的好处:

1 close将描述字的计数减1,在此计数为0时才关闭套接口。用shutdown激发TCP正常连接终止序列,不管访问计数

2 close终止了数据传送两个方向:读和写。

使用shutdown半关闭连接:

int shutdown(int sockfd,int howto);

howto类型:

1 SHUT_RD 关闭连接读的这一半,不再接受数据,现有的都作废。

2 SHUT_WR 关闭连接的写的这一半,当前缓冲区的数据都被发送,后跟正常的TCP终止序列。

3 SHUT_RDWR 连接的读这一半,和写这一半都关闭。相当于两次shutdown

拒绝服务型攻击:

当一个服务器整处理多个客户时,服务器不能阻塞于单个客户相关的函数调用。如果这样,服务器将悬挂并拒绝为所有其他的客户提供服务。

本文转自博客园xingoo的博客,原文链接:I/O复用,如需转载请自行联系原博主。

相关文章
|
5月前
|
存储 Cloud Native Linux
软件开发方法:复用与扩展
软件开发方法:复用与扩展
|
1月前
模块功能复用和扩展性
模块功能复用和扩展性 模块功能复用和扩展性是软件工程中的重要概念,主要体现在设计和实现阶段。
19 1
|
6月前
合成复用原则~
合成复用原则~
|
缓存 JavaScript 网络架构
多路由复用页面组件问题
多路由复用页面组件问题
76 0
多路由复用页面组件问题
|
设计模式 Oracle 关系型数据库
软件架构设计原则--合成复用原则
本专栏内容参考自:咕泡学院Tom老师的《Spring5核心原理与30个类手写实战》,仅作个人学习记录使用,如有侵权,联系速删
|
设计模式 Java Linux
I/O复用前世今生
之前总结了一篇文章《单服务器知识》[1],主要整理两方面的: 一是socket以及IO常识 二是单机高性能模式 你会一般不会出现socket连接IO相关知识结合,所以在学习IO的时候,总会有很多的背景知识,出现现在会很吃力,或者说不知道就在里面。 这是为什么呢?
98 0
I/O复用前世今生
分集和复用
分集和复用
107 0
|
存储 编解码 容器
mux复用 demux解复用
保存音频包: 直接输出解复用之后的的音频数据码流。只需要在每次调用av_read_frame()之后将得到的音频的AVPacket存为本地文件即可。 但在分离AAC码流的时候,直接存储AVPacket后的文件可能是不能播放的。
1760 0