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

linux 文件I/O原理及模型

 
阅读更多

linux 文件I/O原理及模型

 
   

   我们知道Linux的内核将所有外部设备都可以看做一个文件来操作。那么我们对与外部设备的操作都可以看做对文件进行操作。我们对一个文件的读写,都通过调用内核提供的系统调用;内核给我们返回一个file descriptor(简称:fd,文件描述符);我们通过 ls -l  /proc/${pid}/fd/ 可以看到进程${pid}占用的所有描述符,或者lsof -p ${pid}; 而对一个socket的读写也会有相应的描述符,称为socketfd(socket描述符);描述符就是一个数字,指向内核中一个结构体(文件路径,数据区,等一些属性); 那么我们的应用程序对文件的读写就通过对描述符的读写完成。

 

 

     系统调用是如何完成一个I/O操作的呢? linux将内存分为内核区,用户区; linux内核给我们管理所有的硬件资源,应用程序通过调用系统调用和内核交互,达到使用硬件资源的目的;应用程序通过系统调用read发起一个读操作;这时候内核创建一个文件描述符,并通过驱动程序向硬件发送读指令,并将读的的数据放在这个描述符对应结构体的缓存区。但这个结构体是在内核内存区的。需要将这个数据读到用户区。这样完成了一次读操作;

 

 

     但是大家都知道I/O设备相比cpu的速度是极慢的。linux提供的read系统调用,也是一个阻塞函数。这样我们的应用进程在发起read系统调用时,就必须阻塞,就进程被挂起而等待文件描述符的读就绪;

 

 

      这里,我们先了解一下,什么是文件描述符读就绪,什么是写就绪?

 

 

       读就绪:就是这个文件描述符的接收缓冲区中的数据字节数大于等于套接字接收缓冲区低水位标记的当前大小;

       写就绪:该描述符发送缓冲区的可用空间字节数大于等于描述符发送缓冲区低水位标记的当前大小。(如果是socket fd,说明上一个数据已经发送完成)。

 

      接收低水位标记和发送低水位标记:由应用程序指定,比如应用程序指定接收低水位为64个字节。那么接收缓冲区有64个字节,才算fd读就绪;

 

 

 

    从上边的分析我们知道向内核发起一个I/O操作,要经过等待fd就绪+内核数据到用户数据区复制,完成一次I/O。

 

 

 

各种I/O模型比较

 

 

 

1、阻塞I/O:进程被阻塞I/O系统调用上(read、write、sendto、recvfrom等等)直到I/O条件就绪(可读/写或异常)处理完,处理后从I/O系统调用返回进程。

 linux <wbr>文件I/O原理及模型

初始化操作后,一直阻塞,直到操作完成。如:读数据,则其他线程无法要读数据是,被阻塞,等到该读线程完成后,其他的线程才能进行读操作。

2、非阻塞I/O :这种方式通过指定系统调用read/write的参数为非阻塞,告知内核fd没就绪时,不阻塞进程,而是返回一个错误码,这时应该使应用进程死循环轮询,直到fd就绪;。

 linux <wbr>文件I/O原理及模型
强调一种主动性,即程序主动去轮询可以操作了吗?系统就响应它。如:读数据,它会想询问内核,线程:可以读了吗?内核:不行。线程:可以读了吗?内核:不行。……


 

3、I/O复用( I/O 多路转接模型):在这种模型下,如果请求的 I/O 操作阻塞,且它不是真正阻塞 I/O,而是让其中的一个函数等待,在这期间,I/O 还能进行其他操作。如本节要介绍的 select 函数和 poll 函数,就是属于这种模型。

linux <wbr>文件I/O原理及模型

4、多线程阻塞I/O。把要处理的描数字分配到多个线程中,每个线程独立地调用I/O系统调用,独立处理。

 

5、信号驱动I/O。类似于I/O复用,当I/O条件就绪时使用信号通知进程去调用I/O系统调用处理。

 

6、异步I/O。通过aio_read告诉内核怎么处理,我们就不管了,内核处理完了后发个信号告诉我们,也可以用其他方式在处理完通知我们。

linux <wbr>文件I/O原理及模型

 

注:I/O系统调用是否阻塞,仅取决于他们操作的描数字是否是阻塞的。fcntl可设定。

对普通文件的读写不存在阻塞问题,对和终端、网络连接等对应的文件描述符才会阻塞

阻塞操作是指,在执行设备操作时,若不能获得资源,则进程挂起直到满足可操作的条件再进行操作。非阻塞操作的进程在不能进行设备操作时,并不挂起。被挂起的进程进入sleep状态,被从调度器的运行队列移走,直到等待的条件被满足。

 

 

 

这6种I/O模型分为2类:

 

同步I/O模型:第1~5 I/O模型。这5种I/O模型,说到底,I/O调用还是要用户进程自己调用,被阻塞。

 

异步I/O模型:第6种I/O模型。I/O调用由内核执行,进程不被阻塞。

 

 

 

注:鉴别是否是异步I/O操作,只要看I/O操作是谁执行。

分享到:
评论

相关推荐

    Linux I/O 原理和 Zero-copy 技术全面揭秘

    通过理解Linux I/O原理和零拷贝技术,开发者可以优化系统性能,特别是在高负载的网络服务中。Zero-copy技术的引入,不仅减少了CPU的使用,还提升了系统整体吞吐量,成为了现代高性能服务器设计的重要组成部分。

    linux 设备驱动中的阻塞与非阻塞 I/O

    在编写设备驱动时,理解这些I/O模型的工作原理和优缺点至关重要。开发者需要根据设备的特性、系统的资源约束以及应用程序的需求来选择合适的方式。例如,对于磁盘I/O,由于其天然的延迟,非阻塞可能更合适;而对于...

    Linux系统中网络I_O性能改进方法的研究.pdf

    【Linux 系统中网络I/O性能改进方法的研究】 ...通过深入研究各种I/O模型的原理和特点,结合实际情况采取适当的优化策略,能够显著提升服务器处理网络请求的能力,从而满足日益增长的网络服务需求。

    ARM9 I/O driver source

    总结,开发ARM9 I/O驱动需要理解Linux内核的驱动模型,掌握ARM9的I/O特性,熟悉设备通信协议,编写与硬件交互的代码,并了解Linux下的设备管理和调试方法。对于特定设备如18B20,还需要理解其工作原理和通信协议,...

    linux IO 基础简介及代码

    本文将深入探讨Linux I/O的基础知识,包括I/O模型、缓冲机制以及相关的编程实践。 一、I/O模型 1. 同步I/O与异步I/O: - **同步I/O**:在数据传输期间,进程被阻塞,直到操作完成。例如,read()函数调用会阻塞,...

    套接字I/O模式的服务端客户通信的程序源代码

    `select`函数是Linux系统提供的一种I/O多路复用机制,它允许我们监视多个文件描述符(如套接字)的状态,等待任意一个准备好读写操作。当`select`返回时,我们可以知道哪些套接字已经准备就绪,从而避免了轮询检查的...

    网络IO模型 Linux环境下的network IO 高清 目录 书签

    本资源主要探讨的是在Linux操作系统中的网络I/O模型,包括其工作原理、常见类型以及优化策略。下面将详细阐述相关知识点。 1. **I/O模型概述**: - I/O模型是操作系统处理硬件设备输入输出的一种机制,主要包括...

    linux direct io 技术应用

    总结来说,Linux Direct I/O技术是一种提高系统I/O性能的有效手段,但需要谨慎使用,因为它涉及到更复杂的编程模型,并且可能会对系统其他方面产生影响。正确理解和配置Direct I/O,可以为特定的应用场景带来显著的...

    《Linux高级系统编程》教学教案—02输入输出.pdf

    本章的学习目标是让学生深入理解并熟练运用Linux下的标准I/O和文件I/O。 首先,I/O的基本定义是程序与外部设备进行数据交换的过程。在Linux系统中,I/O操作的对象通常为文件,包括设备文件和普通文件。I/O的类型...

    采用I/O复用技术select实现socket通信,完成Linux下的多客户聊天室!

    `select`是多路复用I/O模型的一种,它允许程序同时监控多个文件描述符(如socket),等待它们准备好进行读写操作。这种方式极大地提高了服务器处理并发连接的能力,尤其适用于处理大量短连接的情况。 首先,我们...

    IO模型与性能分析

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

    《操作系统原理及应用(Linux)(第二版)》.zip

    7. **I/O操作**:Linux的异步I/O模型和同步I/O模型有其各自的特点,学习如何有效地进行读写操作,提升系统效率。 8. **Linux命令与Shell脚本**:熟练掌握各种Linux命令和编写Shell脚本,能有效提高在Linux环境下的...

    Linux设备驱动程序学习(12)-Linux设备模型(底层原理简介) - Linux设备驱动程序

    此外,Linux设备模型还包括中断处理和异步I/O。中断是硬件设备与处理器通信的主要方式,当设备完成某项任务或需要处理器关注时,会触发中断。异步I/O允许设备驱动程序在等待I/O操作完成的同时执行其他任务,提高了...

    linux下非阻塞IO程序源码.zip

    在Linux操作系统中,非阻塞I/O(Non-blocking I/O)是一种重要的编程模型,它用于处理高并发和低延迟的场景。与传统的阻塞I/O不同,非阻塞I/O在进行读写操作时,如果数据尚未准备好,不会挂起进程,而是立即返回一个...

    《操作系统原理及应用(Linux)》-王红-电子教案-

    4. 设备管理:讨论I/O设备的分类、I/O控制方式(如程序控制、中断驱动、DMA),设备驱动程序,以及Linux下的设备文件和设备管理命令。 5. 文件系统:介绍文件系统的基本概念、文件的组织结构、文件操作、磁盘调度,...

    Windows完成端口与Linux epoll技术简介.doc

    Windows 完成端口与 Linux epoll 技术是两种常见的高性能 I/O 模型,在 Windows 和 Linux 平台上广泛应用于开发高性能的网络服务程序。下面我们将详细介绍 Windows 完成端口和 Linux epoll 技术的基本概念、特点、...

    libaio-0.3.104.tar.gz

    1. **异步I/O原理**:传统的同步I/O操作会导致进程阻塞,直到I/O操作完成。而libaio则通过内核提供的 aio(Asynchronous I/O) 接口,允许程序将I/O请求提交给内核,然后立即返回,由内核在后台处理。当I/O操作完成后...

    linux下阻塞IO程序源码.zip

    阻塞I/O(Blocking I/O)是Linux中最基础的I/O模型之一,理解其工作原理对于系统编程和驱动开发至关重要。 阻塞I/O的基本概念: 在Linux中,当一个进程尝试执行读取或写入操作时,如果数据尚未准备就绪(例如,从...

    输入输出系统ppt.ZIP

    1. **I/O模型**:讲解不同的I/O处理模型,如同步I/O和异步I/O,阻塞I/O和非阻塞I/O,以及多路复用I/O(如select、poll、epoll)和信号驱动I/O。 2. **I/O层次结构**:介绍操作系统如何通过硬件、设备驱动、中断处理...

    C++中I/O模型之select模型实例

    如果需要处理更多套接字,可以考虑使用其他I/O模型,如`epoll`(在Linux系统中)或`IOCP`(在Windows系统中)。 总的来说,`select`模型在C++中的使用涉及到套接字的创建、监听、连接接受以及对文件描述符集合的...

Global site tag (gtag.js) - Google Analytics