`
yonlist
  • 浏览: 85221 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Unix下5种基本的I/O模型

阅读更多

Unix下5种基本的I/O模型:

1.阻塞I/O
2.非阻塞I/O
3.I/O复用(select和poll)
4.信号驱动I/O(SIGIO)
5.异步I/O(POSIX.1的aio_系列函数)

Unix中一个输入操作一般有两个不同的阶段:
1.等待数据准备好。
2.从内核到进程拷贝数据。
对于一个sockt上的输入操作,第一步一般是等待数据到达网络,当分组到达时,它被拷贝到内核中的某个缓冲区,第二步是将数据从内核缓冲区拷贝到应用程序缓冲区。

    下面分别介绍上面提到的5类I/O模型

本文中我们用UDP来进行举例,并且我们将函数recvfrom视为系统调用,这样让我们的注意力都集中在I/O模型上。

阻塞I/O模型
   
    最流行的I/O模型是阻塞I/O模型,缺省时,所有sockt都是阻塞的,这意味着当一个sockt调用不能立即完成时,进程进入睡眠状态,等待操作完成。如图:

 

图1 阻塞I/O模型

    在图1中,进程调用recvfrom,此调用直到数据报到达且拷贝到应用缓冲区或是出错才返回。最常见的错误是系统调用被信号中断,我们所说进程阻塞的整段时间是指从调用recvfrom开始到它返回的这段时间,当进程返回成功指示时,应用进程开始处理数据报。

    下面是一个采用阻塞I/O模型编写的简单服务器端代码(本代码来至于Unix网络编程),这段代码的功能是把客户端发来的数据再回射到客户端,本例子中进程阻塞于recvfrom.

#include     "unp.h" 

void   dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen);

int
main(int argc, char **argv)
 {
     int     sockfd;
     struct sockaddr_in servaddr, cliaddr;
     sockfd = Socket(AF_INET, SOCK_DGRAM, 0);
     bzero(&servaddr, sizeof(servaddr));
     servaddr.sin_family = AF_INET;
     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
     servaddr.sin_port = htons(SERV_PORT);
     Bind(sockfd, (SA *) &servaddr, sizeof(servaddr));
     dg_echo(sockfd, (SA *) &cliaddr, sizeof(cliaddr));
 }

void   dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)
  {
      int     n;
      socklen_t len;
      char    mesg[MAXLINE];
      for ( ; ; ) {
         len = clilen;
         n = Recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);
         Sendto(sockfd, mesg, n, 0, pcliaddr, len);
     }
 }

非阻塞I/O模型 
      
   当我们把一个sockt设置成非阻塞放式时,即通知内核:当请求的I/O操作非得让进程睡眠才能完成时,不要让进程睡眠,而应该返回一个错误。如图:

 

图2 非阻塞I/O模型

    如图2所示,前3次调用recvfrom时仍无数据返回,因此内核立即返回一个EWOULDBLOCK错误。第4次调用recvfrom时,数据报已经准备好了,被拷贝到应用缓冲区,recvfrom返回成功指示,接着就是我们处理数据报。
    当一个应用进程像这样对一个非阻塞sockt循环调用recvfrom时,我们称此过程为轮询(polling).应用进程连续不断的查询内核,看看某操作是否准备好,这对CPU是极大的浪费,但这种模型只是偶尔才遇到。

I/O复用模型

    I/O复用能让一个或多个I/O条件满足(例如,输入已经准备好被读,或者描述字可以承接更多的输出)时,我们就被通知到。I/O复用由select和poll支持,较新的Posix.1g也支持(pselect)。
I/O复用典型地用在下列网络应用场合:
    1.当客户处理多个描述字时,必须使用。
    2.一个客户同时处理多个sockt.
    3.如果一个服务器既要处理监听sockt,又要处理连接sockt,一般也用到。
   
 4.如果一个服务器既要处理TCP,又要处理UDP,一般也用到。
    5.如果一个服务器要处理多个服务或多个协议(例如inetd守护进程),一般也用到。

    I/O复用并非限于网络编程,许多正是应用程序也需要使用这项技术。

    有了I/O复用,我们就可以调用select或poll,在这两个系统调用中的某一个上阻塞,而不阻塞于真正的I/O系统调用。图3是I/O复用模型的一个小结。

 

图3 I/O复用模型

    我们阻塞于select调用,等待数据报socket可读,当select返回socket可读条件时,我们调用recvfrom将数据报拷贝到应用缓存区中。
    将图3与图1比较,似乎没有显示什么优越性,实际上因使用了select,要求2此系统调用而不是一次,好像变的还有点差,但是select的好处在于我们可以等待多个描述字准备好。

信号驱动 I/O模型

   

    信号驱动 I/O模型能在描述字准备好时用信号SIGIO通知我们,下图给出例子:



 


图4 信号驱动 I/O模型

    首先我们允许sockt进行信号驱动 I/O,并通过系统调用sigaction安装一个信号处理程序。此系统调用立即返回,进程继续工作,它是非阻塞的。当数据报准备好被读时,就为该进程生成个SIGIO信号。我们随即可以在信号处理程序中调用recvfrom来读取数据报,并通知主循环数据已准备好被处理,也可以通知主循环,让它来处理数据报。

    无论我们如何处理SIGIO信号,这种模型的好处是当等待数据报到达时,可以不阻塞。主循环可以继续执行,只是等待信号处理程序的通知:或者数据报已准备好被处理,或者数据报已准备好被读取。


异步I/O模型

    异步I/O模型是Posix.1的1993版本中的新内容。我们让内核启动操作,并在整个操作完成后(包括将数据报从内核拷贝到我们自己的缓冲区)通知我们。这种模型与信号驱动模型的主要区别在于:信号驱动I/O是有内核通知我们何时可以启动一个I/O操作,而异步I/O模型是由内核通知我们I/O操作何时完成。图5给出了一个例子。

 

 

 

 

图5 异步I/O模型

    我们调用aio_red(Posix异步I/O函数以aio_或lio_开头),给内核传递描述字、缓冲区指针、缓冲区大小(与red相同的3个参数)、文件偏移(与lseek类似),并高书内核当整个操作完成时如何通知我们。此系统调用立即返回,我们的进程不阻塞于等待I/O操作的完成。在此例子中,我们假设要求内核在操作完成时产生一个信号,此信号直到数据已拷贝到应用程序缓冲区才产生,这一点是于信号驱动I/O模型不同的。

各种I/O模型的比较

 

图6 各类I/O模型的比较


    图6给出了上述5中I/O模型的比较。它表明:前4种模型的区别都在第1阶段,因为前4种模型的第2阶段基本相同:在数据从内核拷贝到调用者的缓冲区时,进程阻塞于recvfrom调用。然而异步I/O处理的两个阶段都不同于前4个模型。
   
    同步I/O与异步I/O

    Posix.1定义这两个术语如下:

    1.同步I/O操作引起请求进程阻塞,直到I/O操作完成。

    2.异步 I/O操作不引起请求进程阻塞。

    根据上述定义,我们的前四个I/O模型都是同步I/O模型,因为真正的I/O操作(recvfrom)阻塞进程,只有异步I/O模型与异步I/O的定义相符合。

 

转载自:http://blog.sina.com.cn/s/blog_5f4344bf0100cklt.html

 

分享到:
评论

相关推荐

    Unix I/O 小结

    本文主要总结了Unix下的I/O模型及其相关系统调用。 在Unix中,每个进程都有一个打开文件描述符表,用于存储指向文件inode的指针和元数据。文件描述符是非负整数,通常一个进程最多可以打开1024个文件,-1表示非法值...

    select I/O模型 客户端

    `select` I/O模型是一种在多路复用I/O中广泛使用的机制,它允许一个进程监控多个文件描述符(如套接字)的状态,以确定何时进行读写操作。在本篇中,我们将深入探讨`select` I/O模型在客户端应用中的运用,以及与...

    unix平台下I/O聚集和分离的一种方案

    在"TransmissionOfMultipleFileDescriptors"这个压缩包中,可能包含了一个示例程序或者文档,演示如何在Unix环境下利用上述I/O模型实现文件描述符的传输和管理。具体实现可能涉及创建套接字,绑定地址,监听连接,...

    探索Java I/O 模型的演进

    Unix提供了五种常见的I/O模型: 1. **阻塞I/O**:在数据准备好之前,进程被挂起,直到数据准备好并被拷贝到用户空间。 2. **非阻塞I/O**:请求不会阻塞,但用户线程需要不断轮询检查数据是否准备好。 3. **I/O多路...

    浅谈Linux 网络 I/O 模型简介(图文)

    根据UNIX网络编程的分类,Linux提供了五种I/O模型,分别是阻塞I/O、非阻塞I/O、I/O复用模型、信号驱动I/O以及异步I/O。 1. **阻塞I/O模型**: 在这个模型中,进程调用如`recvfrom`这样的系统调用时,会一直等待...

    ws Socket五种IO模型代码

    Windows操作系统提供了五种I/O模型:选择模型(Select)、异步选择模型(WSAAsyncSelect)、事件选择模型(WSAEventSelect)、重叠I/O模型(Overlapped I/O)和完成端口模型(Completion Port)。每一种模型都适用于...

    网络编程模型综述.doc

    1. **UNIX网络I/O模型** - **阻塞I/O**:在阻塞模式下,当socket执行I/O操作时,如果数据未准备好,进程或线程会暂停执行,直到数据可用。这种模型简单易用,但不适用于处理大量并发连接,因为一个线程必须等待...

    UNIX-IO.rar_unix IO

    首先,UNIX的I/O模型基于文件的概念,一切皆文件,包括硬件设备。这种抽象使得对I/O操作的处理变得统一且高效。文件描述符是UNIX系统中进行I/O操作的核心,它是一个非负整数,代表了一个打开的文件或者设备。每个...

    78程序员练级攻略(2018):异步IO模型和lock-Free编程1

    史蒂文斯在《UNIX网络编程》中介绍了五种基本的I/O模型:阻塞I/O、非阻塞I/O、I/O多路复用(如select和poll)、信号驱动的I/O(SIGIO)以及异步I/O(POSIX的aio_functions)。阻塞I/O是最基础的模型,当调用I/O操作...

    WinSOCKET五种模型_VS2015

    5. **多路复用I/O模型(Select/Poll/Epoll Model)** 多路复用I/O模型是通过select、poll或epoll(Linux特有)等函数监控多个socket的状态。这些函数可以同时等待多个socket的就绪状态,当某个socket准备好读写时,...

    IO模型与性能分析

    - **Unix/Linux I/O模型**: - **阻塞I/O**:传统模型。 - **非阻塞I/O**:提高响应能力。 - **I/O复用**:如`select`和`poll`。 - **信号驱动I/O**:基于信号通知。 - **异步I/O**:如使用`aio_`系列函数。 #...

    5.1_1_I_O设备的基本概念和分类1

    在I/O模型中,有几种常见的处理方式: - 阻塞I/O:当一个进程尝试读取或写入I/O设备时,如果设备没有准备好,进程会被挂起,直到I/O操作完成。 - 非阻塞I/O:在这种模式下,进程不会被挂起,而是立即返回一个状态...

    第四讲 I-O复用与套接口选项.ppt

    在UNIX系统中,存在五种基本的I/O模型: 1. **阻塞I/O模型**:这是最常见的I/O模型,默认情况下所有的套接字都是阻塞的。当进程调用`recvfrom`等系统函数时,如果数据未准备好,进程会阻塞等待,直到数据就绪并被...

    HP服务器资料:I2O技术.doc

    4. **减少外围设备所需的驱动程序数量**:由于I2O技术提供了一种统一的I/O处理模型,对于支持I2O的设备,只需要较少的驱动程序即可,降低了维护和管理的复杂性。 I2O技术不仅适用于服务器,还可以应用于工作站和...

    Unix环境高级编程11-20章

    在Unix中,I/O模型主要分为同步和异步两种。同步I/O意味着调用I/O函数后,进程会阻塞直到操作完成;而异步I/O则允许进程在等待I/O操作完成期间继续执行其他任务。Unix提供了标准的I/O库,如stdio.h中的printf和scanf...

    第5章 输入输出1

    I/O模型通常分为几种类型,包括同步I/O、异步I/O、阻塞I/O和非阻塞I/O。在Unix中,这些模型可以通过不同的I/O函数来实现。例如,阻塞I/O会暂停执行直到数据准备好;非阻塞I/O则不会等待,而是立即返回一个状态,让...

    unix网络编程和源代码

    5. **系统I/O模型**:UNIX系统提供了多种I/O模型,如阻塞I/O、非阻塞I/O、I/O复用(select、poll、epoll)、信号驱动I/O和异步I/O。理解并灵活运用这些模型,可以优化网络程序的性能和响应速度。 6. **源代码分析**...

    netty实战指南

    为了克服这些问题,UNIX系统提供了五种I/O模型: 1. 阻塞I/O模型:系统调用如recvfrom会在数据准备好或出现错误时返回,期间进程会被阻塞。 2. 非阻塞I/O模型:当没有数据时,recvfrom会立即返回错误,需要轮询检查...

Global site tag (gtag.js) - Google Analytics