UNIX系统的IO模型.doc

上传人:11****ws 文档编号:2994544 上传时间:2019-05-16 格式:DOC 页数:7 大小:246.50KB
下载 相关 举报
UNIX系统的IO模型.doc_第1页
第1页 / 共7页
UNIX系统的IO模型.doc_第2页
第2页 / 共7页
UNIX系统的IO模型.doc_第3页
第3页 / 共7页
UNIX系统的IO模型.doc_第4页
第4页 / 共7页
UNIX系统的IO模型.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

1、 UNIX 系统的 IO 模型 其实并非原创,只是摘录了 Stevens的大作UNIX 网络编程,写下来,一、加深理解和记忆;二、书是借的,记录一下备忘。感谢臻,借我此书一阅,受益匪浅。6.2 I/O 模型阻塞式 I/O;非阻塞式 I/O;I/O复用;信号驱动式 I/O;异步 I/O;一个输入操作通常包括两个不同的阶段:1) 等待数据准备好;2) 从内核向进程复制数据;对于一个套接字上的输入操作,第一步通常涉及等待数据从网络中到达。当所等待分组到达时,它被复制到内核中的某个缓冲区。第二步就是把数据从内核缓冲区复制到应用进程缓冲区。6.2.1 阻塞式 I/O模型最流行的 I/O模型是阻塞式 I/

2、O(blocking I/O)模型,默认情况下,所有套接字都是阻塞的。以数据报套接字作为例子,我们有如图 6-1所示的情形。图 6-1 阻塞式 I/O模型在图 6-1中,进程调用 recvfrom,其系统调用直到数据报到达且被复制到应用进程的缓冲区中或者发生错误才返回。我们说进程在从调用 recvfrom开始到它返回的整段时间内是被阻塞的。recvfrom 成功返回后,应用进程开始处理数据报。6.2.2 非阻塞式 I/O模型进程把一个套接字设置成非阻塞是在通知内核:当所请求的 I/O操作非得把本进程投入睡眠才能完成时,不要把本进程投入睡眠,而是返回一个错误。非阻塞式 I/O(notblocki

3、ng I/O)模型如图 6-2所示:图 6-2 非阻塞式 I/O模型前三次调用 recvfrom时没有数据可返回,因此内核转而立即返回一个EWOULDBLOCK错误。第四次调用 recvfrom时已有一个数据报准备好,它被复制到应用进程缓冲区,于是 recvfrom成功返回。我们接着处理数据。当一个应用进程像这样对一个非阻塞描述符循环调用 recvfrom时,我们称之为轮询(polling)。应用进程只需轮询内核,以查看某个操作是否就绪。这么做往往耗费大量 CPU时间。6.2.3 I/O复用模型有了 I/O复用(I/O multiplexing),我们就可以调用 select或 poll,阻塞

4、在这两个系统调用中的某一个上,而不是阻塞在真正的 I/O系统调用上。图 6-3概括展示了 I/O复用模型。图 6-3 I/O复用模型我们阻塞于 select调用,等待数据报套接字变为可读。当 select返回套接字可读这一条件时,我们调用 recvfrom把所读数据报复制到应用进程缓冲区。比较图 6-3和图 6-1,I/O 复用并不显得有什么优势,事实上由于使用 select需要两个而不是单个系统调用,I/O 复用还稍有劣势。使用 select的优势在于我们可以等待多个描述符就绪。与 I/O复用密切相关的另一种 I/O模型是在多线程中使用阻塞式 I/O(我们经常这么干)。这种模型与上述模型极为

5、相似,但它并没有使用 select阻塞在多个文件描述符上,而是使用多个线程(每个文件描述符一个线程),这样每个线程都可以自由的调用 recvfrom之类的阻塞式 I/O系统调用了。6.2.4 信号驱动式 I/O模型我们也可以用信号,让内核在描述符就绪时发送 SIGIO信号通知我们。我们称这种模型为信号驱动式 I/O(signal-driven I/O),图 6-4是它的概要展示。图 6-4 信号驱动式 I/O模型我们首先开启套接字的信号驱动式 I/O功能,并通过 sigaction系统调用安装一个信号处理函数。改系统调用将立即返回,我们的进程继续工作,也就是说他没有被阻塞。当数据报准备好读取时

6、,内核就为该进程产生一个 SIGIO信号。我们随后就可以在信号处理函数中调用 recvfrom读取数据报,并通知主循环数据已经准备好待处理,也可以立即通知主循环,让它读取数据报。无论如何处理 SIGIO信号,这种模型的优势在于等待数据报到达期间进程不被阻塞。主循环可以继续执行,只要等到来自信号处理函数的通知:既可以是数据已准备好被处理,也可以是数据报已准备好被读取。6.2.5 异步 I/O模型异步 I/O(asynchronous I/O)由 POSIX规范定义。演变成当前 POSIX规范的各种早起标准所定义的实时函数中存在的差异已经取得一致。一般地说,这些函数的工作机制是:告知内核启动某个操

7、作,并让内核在整个操作(包括将数据从内核复制到我们自己的缓冲区)完成后通知我们。这种模型与前一节介绍的信号驱动模型的主要区别在于:信号驱动式 I/O是由内核通知我们何时可以启动一个 I/O操作,而异步 I/O模型是由内核通知我们 I/O操作何时完成。图6-5给出了一个例子。图 6-5 异步 I/O模型我们调用 aio_read函数(POSIX 异步 I/O函数以 aio_或 lio_开头),给内核传递描述符、缓冲区指针、缓冲区大小(与 read相同的三个参数)和文件偏移(与 lseek类似),并告诉内核当整个操作完成时如何通知我们。该系统调用立即返回,并且在等待 I/O完成期间,我们的进程不被

8、阻塞。本例子中我们假设要求内核在操作完成时产生某个信号。改信号直到数据已复制到应用进程缓冲区才产生,这一点不同于信号驱动 I/O模型。6.2.6 各种 I/O模型的比较图 6-6对比了上述 5中不同的 I/O模型。可以看出,前 4中模型的主要区别在于第一阶段,因为他们的第二阶段是一样的:在数据从内核复制到调用者的缓冲区期间,进程阻塞于 recvfrom调用。相反,异步 I/O模型在这两个阶段都要处理,从而不同于其他 4中模型。图 6-6 5种 I/O模型的比较6.2.7 同步 I/O和异步 I/O对比POSIX把这两个术语定于如下:同步 I/O操作(sysnchronous I/O opetation)导致请求进程阻塞,直到 I/O操作完成;异步 I/O操作(asynchronous I/O opetation)不导致请求进程阻塞。根据上述定义,我们的前 4种模型-阻塞式 I/O模型、非阻塞式 I/O模型、I/O复用模型和信号驱动 I/O模型都是同步 I/O模型,因为其中真正的 I/O操作(recvfrom)将阻塞进程。只有异步 I/O模型与 POSIX定义的异步 I/O相匹配。由东莞搬迁公司 东莞搬家公司 东莞搬运公司 东莞搬厂 东莞搬家公司 东莞搬家公司 东莞搬家公司 东莞搬家公司 整理

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 实用文档资料库 > 策划方案

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。