Unix下可用的5种IO模型

一、Unix可用的5种IO模型和区别:

1.阻塞式IO

2.非阻塞式IO

3.IO复用(select和poll)

4.信号驱动式IO(SIGIO)

5.异步IO(POSIX的aio_系列函数)

二、1.阻塞式IO模型:

最流行的IO模型是阻塞式IO模型

应用进程                    内核

(recvfrom)------>系统调用--------->  无数据报准备好

                     |

                   等待数据

                     |

                   数据报准备好

                     |

                   将数据从内核复制到用户空间

                     |

 处理数据报<-----返回成功指示<----- 复制完成

进程调用recvform,其系统调用直到数据报到达且被复制到应用进程的缓冲区中或者发生错误才返回。最常见的错误是系统调用被信号中断,我们说进程在从调用recvform开始到它返回的整段时间内是被阻塞的。recvfrom成功返回后,应用进程开始处理数据报。

2.非阻塞式IO模型

应用进程                    内核

recvfrom----->系统调用---------> 无数据准备好

     <---EWOULDBLOCK----       

recvfrom----->系统调用---------> 无数据准备好

<---EWOULDBLOCK----       

...                     ...

recvfrom------->系统调用-------> 数据准备好

复制数据报

                    |

处理数据报<------返回成功指示------完成复制 

进程把一个套接字设置成非阻塞:当所有请求的IO操作非得把本进程投入睡眠才能完成时,不要把本进程投入睡眠,而是返回一个错误。

当一个一个应用程序对一个非阻塞描述符循环调用recvfrom时,我们称之为轮训polling。应用程序持续轮训内核,以查看某个操作是否就绪。

这么做往往消耗大量CPU时间。

3、IO复用模型

有了IO复用,我们就可以调用select或poll,阻塞在这2个系统调用中的某一个之上,而不是阻塞在真正的IO系统调用上。            

应用进程                    内核

select     ------系统调用----------->     无数据准备好

                      |

                     等待数据

                      |

    <-----返回可读条件-----           数据准备好

recvfrom ----->系统调用------------>  复制数据报

                           |

                      将用户从内核复制到用户控件

                     |

处理数据报<----------返回成功指示-----复制完成

我们阻塞于select调用,等待数据报套接字变为可读。当selsect返回套接字可读这一条件时,我们调用recvfrom把所读数据报复制到应用进程缓冲区。

和上面模型比较IO复用并不显得有什么优势,事实上由于使用select需要两个而不是单个系统调用,IO复用还稍有劣势。

不过使用select的优势在于我们可以等待多个描述符就绪。

                      

时间: 2024-10-06 00:07:24

Unix下可用的5种IO模型的相关文章

Unix下可用的五种 I/O 模型

介绍 当TCP客户端同时处理两个输入时:标准输入和TCP套接字,当客户端fgets(在标准输入上)被阻塞并且服务器进程被终止时,我们遇到了问题.服务器TCP正确地将FIN发送到客户端TCP,但由于客户端进程被禁止从标准输入读取,所以它从没有看到EOF,直到它从套接字读取(可能更晚). 如果一个或多个I / O条件准备好(即,输入准备好被读取,或者描述符能够获得更多输出),我们希望得到通知.此功能称为 I/O 多路复用,由select和poll函数以及前者的较新POSIX变体提供,称为pselec

Linux下的五种IO模型

5种IO模型 Linux下五种IO模型 (1)阻塞I/O:什么都不干,导致应用程序阻塞,等待数据准备好,如果数据没有准备好,一直阻塞,等数据准备好了从内核拷贝到用户空间 (2)非阻塞I/O:把一个套接字接口设置为非阻塞,告诉内核,当所请求的IO无法完成时,不要将进程睡眠,而是返回一个错误,这样IO操作函数会不断地测试数据是否准备好,如果没有准备好 ,继续测试,直到准备好为止 (3)I/O复用(select epoll):select或epoll会使进程阻塞,但是和阻塞IO不同的是,这两个函数可以

聊聊 Linux 中的五种 IO 模型

本文转载自: http://mp.weixin.qq.com/s?__biz=MzAxODI5ODMwOA==&mid=2666538919&idx=1&sn=6013c451b5f14bf809aec77dd5df6cff&scene=21#wechat_redirect 上一篇<聊聊同步.异步.阻塞与非阻塞>已经通俗的讲解了,要理解同步.异步.阻塞与非阻塞重要的两个概念点了,没有看过的,建议先看这篇博文理解这两个概念点.在认知上,建立统一的模型.这样,大家在

Linux五种IO模型

Linux五种IO模型 转载:http://blog.csdn.net/jay900323/article/details/18141217 Linux五种IO模型性能分析 目录(?)[-] 概念理解 Linux下的五种IO模型 阻塞IO模型 非阻塞IO模型 IO复用模型 信号驱动IO 异步IO模型 个IO模型的比较 selectpollepoll简介 1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:

Windows五种IO模型性能分析和Linux五种IO模型性能分析

Windows五种IO模型性能分析和Linux五种IO模型性能分析 http://blog.csdn.net/jay900323/article/details/18141217 http://blog.csdn.net/jay900323/article/details/18140847 重叠I/O模型的另外几个优点在于,微软针对重叠I/O模型提供了一些特有的扩展函数.当使用重叠I/O模型时,可以选择使用不同的完成通知方式. 采用事件对象通知的重叠I/O模型是不可伸缩的,因为针对发出WSAWa

[转载] Linux五种IO模型

转载:http://blog.csdn.net/jay900323/article/details/18141217 Linux五种IO模型性能分析 目录(?)[-] 概念理解 Linux下的五种IO模型 阻塞IO模型 非阻塞IO模型 IO复用模型 信号驱动IO 异步IO模型 个IO模型的比较 selectpollepoll简介 1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:同步:      所谓同步

(转载) Linux五种IO模型

转载:http://blog.csdn.net/jay900323/article/details/18141217 Linux五种IO模型及分析 目录(?)[-] 概念理解 Linux下的五种IO模型 阻塞IO模型 非阻塞IO模型 IO复用模型 信号驱动IO 异步IO模型 个IO模型的比较 selectpollepoll简介 1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:同步:      所谓同步,

聊聊Linux 五种IO模型

1 概念说明 在进行解释之前,首先要说明几个概念: 用户空间和内核空间 进程切换 进程的阻塞 文件描述符 缓存 IO 1.1 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限.为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操作系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间.针对li

Linux之——五种IO模型

一. 同步与异步 之前在对线程的谈论中提到了线程对临界资源访问的一个同步与互斥的关系,这里要强调,在IO模型中的同步与异步与线程的同步与互斥完全不是一回事. 所谓同步,就是指当调用者发出调用的时候,在没有得到结果之前调用并不返回,而是调用者自身一直在那里等待结果,至于等待的方式不同可以分为不同IO模型,下面会进行具体讨论:因此,这里的同步就可以理解为:调用者发出的调用(如一个系统调用函数)和所需要的结果是保持一致性也就是同步性的,你不给我结果,我就一直在那里等着就不返回,我不能单飞我一定要带着结