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复用,如需转载请自行联系原博主。

相关文章
|
2月前
C 函数怎么实现复用
在 C 语言中,函数复用主要通过定义、调用、使用头文件、参数化及库的使用来实现。定义一个函数完成特定任务,并在需要的地方调用它,避免重复代码。将函数声明放在头文件中,供多个源文件包含,进一步提升复用性。参数化使函数能处理不同输入,增强灵活性。将常用函数编译成库,在多个项目中引用,提高代码可维护性和可读性。
|
4月前
|
JSON 测试技术 数据格式
软件复用问题之如果待复用的组件是需要新建的,应该如何解决
软件复用问题之如果待复用的组件是需要新建的,应该如何解决
|
4月前
软件复用问题之在复用组件降低成本和复用组件引入依赖之间取得平衡,如何解决
软件复用问题之在复用组件降低成本和复用组件引入依赖之间取得平衡,如何解决
|
6月前
模块功能复用和扩展性
模块功能复用和扩展性 模块功能复用和扩展性是软件工程中的重要概念,主要体现在设计和实现阶段。
93 1
|
设计模式 Java Linux
I/O复用前世今生
之前总结了一篇文章《单服务器知识》[1],主要整理两方面的: 一是socket以及IO常识 二是单机高性能模式 你会一般不会出现socket连接IO相关知识结合,所以在学习IO的时候,总会有很多的背景知识,出现现在会很吃力,或者说不知道就在里面。 这是为什么呢?
127 0
I/O复用前世今生
分集和复用
分集和复用
127 0
|
Java Windows 调度
|
存储 编解码 容器
mux复用 demux解复用
保存音频包: 直接输出解复用之后的的音频数据码流。只需要在每次调用av_read_frame()之后将得到的音频的AVPacket存为本地文件即可。 但在分离AAC码流的时候,直接存储AVPacket后的文件可能是不能播放的。
1797 0