`
378629846
  • 浏览: 212506 次
  • 性别: Icon_minigender_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/Oblocking I/O)模型,默认情况下,所有套接字都是阻塞的。以数据报套接字作为例子,我们有如图6-1所示的情形。

 

6-1 阻塞式I/O模型

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

6.2.2 非阻塞式I/O模型

进程把一个套接字设置成非阻塞是在通知内核:当所请求的I/O操作非得把本进程投入睡眠才能完成时,不要把本进程投入睡眠,而是返回一个错误。非阻塞式I/O(notblocking 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),我们就可以调用selectpoll,阻塞在这两个系统调用中的某一个上,而不是阻塞在真正的I/O系统调用上。图6-3概括展示了I/O复用模型。

6-3 I/O复用模型

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

比较图6-3和图6-1I/O复用并不显得有什么优势,事实上由于使用select需要两个而不是单个系统调用,I/O复用还稍有劣势。使用select的优势在于我们可以等待多个描述符就绪。

I/O复用密切相关的另一种I/O模型是在多线程中使用阻塞式I/O(我们经常这么干)。这种模型与上述模型极为相似,但它并没有使用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系统调用安装一个信号处理函数。改系统调用将立即返回,我们的进程继续工作,也就是说他没有被阻塞。当数据报准备好读取时,内核就为该进程产生一个SIGIO信号。我们随后就可以在信号处理函数中调用recvfrom读取数据报,并通知主循环数据已经准备好待处理,也可以立即通知主循环,让它读取数据报。

无论如何处理SIGIO信号,这种模型的优势在于等待数据报到达期间进程不被阻塞。主循环可以继续执行,只要等到来自信号处理函数的通知:既可以是数据已准备好被处理,也可以是数据报已准备好被读取。

6.2.5 异步I/O模型

异步I/Oasynchronous I/O)由POSIX规范定义。演变成当前POSIX规范的各种早起标准所定义的实时函数中存在的差异已经取得一致。一般地说,这些函数的工作机制是:告知内核启动某个操作,并让内核在整个操作(包括将数据从内核复制到我们自己的缓冲区)完成后通知我们。这种模型与前一节介绍的信号驱动模型的主要区别在于:信号驱动式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完成期间,我们的进程不被阻塞。本例子中我们假设要求内核在操作完成时产生某个信号。改信号直到数据已复制到应用进程缓冲区才产生,这一点不同于信号驱动I/O模型。

6.2.6 各种I/O模型的比较

6-6对比了上述5中不同的I/O模型。可以看出,前4中模型的主要区别在于第一阶段,因为他们的第二阶段是一样的:在数据从内核复制到调用者的缓冲区期间,进程阻塞于recvfrom调用。相反,异步I/O模型在这两个阶段都要处理,从而不同于其他4中模型。

 

6-6 5I/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相匹配。

4
5
分享到:
评论
2 楼 yuanliangding 2016-08-20  
学习了。不太接触底层的东西
1 楼 leaow567 2012-09-13  
写的好,再深入一点

相关推荐

    IO模型1

    IO模型1

    特征:1、跨平台(Linux, Windows, MacOS, Solaris)2、高性能事件循环.rar

        在类unix系统中有五大I/O模型,依次为阻塞IO(BIO)、非阻塞IO(NIO)、IO多路复用(linux下有select、poll、epoll三种方案)、信号驱动IO、异步IO(前面四种都是同步IO),本文主要介绍常用的C的IO库,几乎都是...

    nginx v1.5.9 for windows

    3 增加Windows和Linux平台下的多线程支持(Unix下尚未实现) 多线程可支持select epoll wsa和iocp网络IO模型 并支持SSL连接 通过上述改进 Nginx在Windows平台下的性能得到大幅提高 其并发连接数一般情况下可达到...

    nginx v1.5.9 for windows 源程序

    3 增加Windows和Linux平台下的多线程支持(Unix下尚未实现) 多线程可支持select epoll wsa和iocp网络IO模型 并支持SSL连接 通过上述改进 Nginx在Windows平台下的性能得到大幅提高 其并发连接数一般情况下可达到...

    io:java io学习项目

    Unix Domain Socket熟悉Linux下命令行工具深入理解进程,线程了解Java内存模型了解Java的并发包,如锁,读写锁,Barrier,Executer和Future了解Java 8的Lambda表达式和Streaming API理解TCP/IP协议族理解HTTP协议和...

    linux网络编程-宋敬彬-part1

    9.3.4 信号驱动IO模型 258 9.3.5 异步IO模型 258 9.4 select()函数和pselect()函数 259 9.4.1 select()函数 259 9.4.2 pselect()函数 261 9.5 poll()函数和ppoll()函数 262 9.5.1 poll()函数 263 ...

    netty-4.1.33.Final

    Netty 是一款用于快速开发高性能的网络应用程序的 Java 框架。它封装了网络编程的复杂性, 使网络编程和 Web 技术的最新...它还定义了一种架构模型以及一套丰富的设计模式。 该资源就是开发Netty程序必须要依赖的jar包

    java多线程tcpsocketserver源码-Java-Book:Java学习资料整理

    --(这三本书主要还是看看Linux下的IO模型,select 和epoll的区别,后面有的框架会涉及到这些内容,比如netty) Unix网络编程 Linux 系统编程手册 Java 基础和进阶 疯狂Java讲义 Java 核心基础卷1/2 Java编程思想 Java...

    socketjava源码-demo-sockets-io-nio-nio2:“Java套接字I/O:阻塞,非阻塞和异步”文章和源代码

    符合POSIX的操作系统(Unix,Linux,Mac OS X,BSD,Solaris,AIX等)中的套接字通信由Berkeley套接字执行。 Windows中的套接字通信由Winsock执行, Winsock也是基于Berkeley套接字的,具有符合Windows编程模型的...

    KMV的MATLAB的代码-libDori:概率数据结构

    ++项目中使用,也可以与提供的Shell脚本和良好的旧Unix IO重定向一起使用。 CLI : 命令行程序的代码可以在cli文件夹中找到。 它们基于C ++库构建,并以便捷的方式公开了libDori的三个基本功能:基数,频繁项和采样...

    C-plus-plus-Series:学习C ++的旅程

    计算机网络与操作系统基础知识积累与背诵 刷题100道 三。四月学习计划 更有效的C ++学习 TCP / IP编程 刷题100道 五月学习计划 STL学习 刷题100道 Linux服务器编程 六月学习计划 深入探索C ++对象模型 准备实习 刷题...

    gccbosc18-training:GCCBOSC 2018的Nextflow培训文档

    类似于Unix的操作系统(Linux,macOS等) Java 8或更高版本 Docker引擎1.10.x(或更高版本) 奇点2.3.x(或更高版本,可选) 正确配置了AWS Batch计算环境(可选) (可选) 安装 使用以下命令安装Nextflow: ...

    一个进程池的服务器程序

    一个进程池的服务器程序 ... 流程大概如下: 1,父进程listen,创建pipe(下面所有父子进程之间的通信都用该pipe) 2,父进程预fork n个子进程 3,各个子进程accept(listenfd),即所有子进程竞争accept请求。...

    网管教程 从入门到精通软件篇.txt

    Windows XP(包括 Windows 2000)的控制台命令是在系统出现一些意外情况下的一种非常有效的诊断和测试以及恢复系统功能的工具。小编的确一直都想把这方面的命令做个总结,这次辛苦老范给我们整理了这份实用的秘笈。 ...

    apache-commons源码及jar文件

    一种 unix-daemon-like java 代码的替代机制 DBCP Commons-DBCP 提供数据库连接池服务 DbUtils DbUtils 是一个 JDBC helper 类库,完成数据库任务的简单的资源清除代码. Digester Commons-Digester 是一个 XML-...

    Toad 使用快速入门

    Toad 使用快速入门 目录 一.Toad功能综述 二.系统需求 三....四....1. Schema browser的用法简介 2. SQL Editor的使用介绍 ...  要用Toad对存储过程进行debug,必须安装Oracle的系统包:dbms_debug...

    python cookbook(第3版)

    12.14 在Unix系统上面启动守护进程 第十三章:脚本编程与系统管理 13.1 通过重定向/管道/文件接受输入 13.2 终止程序并给出错误信息 13.3 解析命令行选项 13.4 运行时弹出密码输入提示 13.5 获取终端的大小 ...

    linux网路编程 中文 23M 版

    第1 章Linux操作系统概述................... .......................................................................... 2 1.1 Linux发展历史........................................................ 2 ...

Global site tag (gtag.js) - Google Analytics