`

异步IO理解

 
阅读更多

缓存I/O又被称作标准I/O,大多数文件系统默认的I/O操作都是缓存I/O。在linux的缓存I/O机制中,操作系统会将I/O的数据缓存在文件系统的页缓存(page cache)中,也就是说,数据会被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。

缓存I/O有一下有点:

1.在一定程度上分离了应用程序空间和实际物理设备

2.可以减少读盘的次数,从而提高性能

当应用程序尝试读取某块数据时,如果这块数据已经存放在了页缓存中,那它就能立即返回给应用程序,而不用物理读盘操作。当然如果没有,那么就需先将数据从磁盘读到页缓存中。对于写机制,程序也会将数据先写到页缓存中,数据是否立即写到磁盘上取决于应用程序所采用的写操作机制:如果采用同步写机制(synchronous writes),那么数据会立即被写回到磁盘上,应用程序一直等到写完为止;如果采用延迟写机制(deferred writes),那应用程序只要把数据写到页缓存中就能做别的事了,延迟写机制下操作系统会定期将页缓存数据刷到磁盘上。与异步写机制(asynchronous writes)不同的是,延迟写在数据写到磁盘上后不会通知应用程序,而异步写会。所以延迟写本身是存在数据丢失的风险

在缓存I/O中,数据在传输过程中需要在应用程序地址空间和也缓存之间进行多次数据拷贝动作,他们带来的CPU和内存开销非常大

来自:https://www.ibm.com/developerworks/cn/linux/l-cn-directio/

 

 

缓冲与缓冲的处理方式是所有I/O操作的基础。术语“输入、输出” 只对数据移入和移出缓存有意义。通常,进程执行操作系统的I/O请求包括数据从缓冲区排出(写操作)和数据填充缓冲区(读操作)。这就是I/O的整体概念。在操作系统内部执行这些传输操作的机制可以非常复杂,但从概念上讲非常简单。

 

 

上图显示一个简化的逻辑图,表示块数据如何从外部源,例如一个磁盘,移动到进程的存储区域(例如RAM)。首先,进程要求缓冲通过read()系统调用填满。这个系统调用导致内核向磁盘控制硬件发出一条命令要从磁盘获取数据。磁盘控制器通过DMA直接将数据写入内核的内存缓冲区,不需要主CPU进一步帮助。当请求read()时,一旦磁盘控制器完成了缓存的填写,内核从内核空间的临时缓存拷贝数据到进程指定缓存中。

有一点需要注意,在内核试图缓存及预取数据时,内核空间中进程请求的数据可能已经就绪了。如果这样,进程请求的数据会被拷贝出来。如果数据不可用,则进程被挂起。内核将把数据读入内存。(这段没理解)

来自:http://www.importnew.com/14111.html

 

I/O中flush的作用

FileOutPutStream继承outputStream,并不提供flush()方法的重写,所以无论内容多少wirte都会将二进制流直接传递给底层操作系统的I/O,而像Buffered系列的I/O都是先放入自身实现缓存中,等缓存区有足够数据时,就整体写入设备。默认缓存区大小是8K

来自:http://blog.csdn.net/aa8568849/article/details/52974619

 

 

同步阻塞I/O

最常用的一个模型就是同步阻塞I/O。在这个模型中,用户空间的应用程序执行一个系统调用,这会导致应用程序阻塞,知道系统调用完成为止(数据传输完成或发生错误)。

比如下图,在调用read系统调用时,应用程序会阻塞并对内核惊醒上下文切换。然后触发读操作,当响应返回时(从我们正在从中读取的设备中返回),数据移动到用户空间的缓冲区中。然后应用程序就会接触阻塞。

 

 

同步非阻塞I/O

同步阻塞I/O的一种效率稍低的变种是同步非阻塞I/O。在这种模型中,设备是以非阻塞的形式打开的。这意味着I/O操作不会立即完成,read操作可能会返回一个错误代码
 

非阻塞的实现方式是I/O命令可能不会立即满足,需要应用程序调用许多次来等待操作完成。

 

 

异步阻塞I/O

另外一个阻塞解决方案是带有阻塞通知的非阻塞I/O。在这种模型中,配置的是非阻塞I/O,然后使用阻塞select系统调用来确定一个I/O描述符何时有操作。select可以为多个描述符提供通知。对于每个描述符来说,我们可以请求这个描述符 可以写数据、有读数据可用 以及 是否发生错误的通知。select调用的主要问题是它的效率不是非常高

 


 

 

异步非阻塞I/O(AIO)

最后,异步非阻塞I/O模型是一种处理与I/O重叠进行的模型。读请求会立即返回,说明read请求已经成功发起了。在后台完成度操作时,应用程序会执行其他处理操作。当read的响应到达时,就会产生一个信号或执行一个基于线程的回调函数来完成这次I/O处理过程

 

 来自:https://www.ibm.com/developerworks/cn/linux/l-async/

 

  • 大小: 3.1 KB
  • 大小: 7.2 KB
  • 大小: 9 KB
  • 大小: 10 KB
  • 大小: 7 KB
分享到:
评论

相关推荐

    网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

    这里我们将深入探讨同步IO、异步IO、阻塞IO和非阻塞IO的概念,理解它们的工作原理以及在实际应用中的差异。 1. 同步IO与异步IO: - **同步IO**:在同步模式下,应用程序执行I/O操作时会等待操作完成。这意味着程序...

    Python高级编程和异步IO并发编程

    本资源"Python高级编程和异步IO并发编程"旨在深入探讨这些主题,帮助开发者提升技能,以实现更高效、更强大的程序设计。 首先,让我们从面向对象编程(OOP)开始。在Python中,OOP是一种强大的设计模式,它允许我们...

    linux异步IO.pdf

    ### Linux异步IO详解 #### 引言 在Linux环境下,输入/输出(I/O)操作是系统资源管理和数据交互的核心部分。传统上,Linux采用的最常见I/O模型是同步I/O,其中应用程序在发出请求后会阻塞,直至请求完成。然而,...

    WinSock 异步IO模型

    WinSock异步IO模型是Windows Socket编程中一种高效的数据传输方式。它允许应用程序在等待数据传输完成时执行其他任务,从而提高系统资源利用率和程序响应性。与传统的同步IO模型不同,异步IO不会阻塞调用线程,而是...

    一个简单的异步IO库

    本项目是一个基于C语言在Linux环境下实现的简单异步IO库,旨在提供对socket、文件读取、定时器以及文件状态变更监控的支持。 首先,我们来看一下异步I/O的基本概念。传统的同步I/O模式在执行I/O操作时会阻塞,直到...

    MFC IOCP模型异步IO

    在这个场景中,"MFC IOCP模型异步IO"指的是使用MFC来实现基于IOCP的异步I/O操作。 IOCP的主要优点在于其高度的并发性和非阻塞特性。当一个I/O操作开始时,系统会将请求添加到完成端口,然后立即返回,让调用线程...

    基于异步IO的socket通信程序

    在标题所提及的“基于异步IO的socket通信程序”中,我们可以推测有以下三个主要部分: 1. **Socket通信的抽象**:这是对socket通信的基本封装,通常包含连接建立、数据传输和断开连接等基本操作。抽象类或接口可以...

    WSAEventSelect IO异步io

    在IT领域,网络编程是构建分布式系统和互联网应用程序的基础,而WSAEventSelect是Windows Socket API(Winsock)提供的一种实现异步IO的重要机制。本文将深入探讨WSAEventSelect的功能、工作原理以及如何在PDA(个人...

    NIO学习系列:连网和异步IO

    本篇文章将深入探讨NIO在连网和异步IO方面的应用,以及如何通过源码理解和实践相关技术。 首先,我们了解NIO的核心概念。NIO不同于传统的IO模型(即BIO,Blocking IO),它引入了通道(Channel)和缓冲区(Buffer)...

    同步、异步IO

    在源码层面,理解同步和异步IO的关键在于了解底层系统调用,如Linux中的read、write、epoll等。在Java中,可以查看NIO相关的类,如java.nio.channels.Selector、java.nio.channels.SocketChannel等,研究它们如何...

    多线程_异步IO_RS232串口通信例子源代码

    在学习这个例子时,开发者可以深入理解多线程如何协同工作,异步IO如何提高程序性能,以及如何通过RS232接口实现与其他硬件的通信。这对于需要开发嵌入式系统、物联网应用或者进行设备控制的工程师来说,是非常有...

    异步IO:Python中的并发编程革命

    ### 异步IO:Python中的并发编程革命 Python 自问世以来,就因其简洁优雅的语法、易学且功能强大等特点迅速赢得了程序员们的喜爱。随着计算机技术的发展与应用场景的不断拓展,传统的同步IO模型逐渐难以满足高并发...

    C语言开发的工具库,包括常用的字符串解析、数据结构、日志库、异步IO线程等.zip

    4. 异步IO和线程:在多任务环境中,异步IO和线程管理是提高性能的关键。异步IO允许程序在等待I/O操作完成时执行其他任务,避免了阻塞。线程库则提供创建、同步和销毁线程的接口,使得多任务并发执行成为可能。熟悉...

    异步IO框架 Cindy

    首先,我们需要理解什么是异步IO。传统的同步IO操作会阻塞程序执行,直到IO操作完成。而异步IO则允许程序在等待IO操作完成时继续执行其他任务,提高了系统资源的利用率和整体性能。Cindy框架就是基于这样的理念构建...

    使用异步IO应用程序接口API

    异步 I/O(AIO)是 Linux 系统中一种高效的数据处理机制,它允许应用程序在发起 I/O 操作后不被阻塞,而是继续执行其他任务,...然而,使用 AIO 需要对 I/O 模型有深入理解,并在实际应用中根据需求权衡性能和复杂性。

    nodejs异步IO的实现 转:http://cnodejs.org/topic/4f16442ccae1f4aa2700113b

    本文将深入探讨Node.js异步IO的实现,并结合给定的资源进行分析。 首先,异步I/O是Node.js的核心特性之一,它允许程序在等待I/O操作完成时继续执行其他任务,从而提高了整体的执行效率和系统资源利用率。在传统的...

    异步IO、APC、IO完成端口、线程池与高性能服务器.doc

    总的来说,这份文档全面介绍了构建高性能服务器所涉及的关键技术,并通过实例和概念解释,帮助读者理解如何利用异步IO、APC、IO完成端口和线程池来优化服务器性能。这些技术的掌握对于开发高效、可靠的网络服务至关...

    异步IO、APC、IO完成端口、线程池与高性能服务器

    ### 异步IO、APC、IO完成端口、线程池与高性能服务器 #### 异步IO(Asynchronous I/O) 异步IO是一种高效的数据处理机制,它允许应用程序在发起一个I/O操作后继续执行其他任务,而无需等待该I/O操作完成。这种模式...

    Python黑魔法-异步IO.pdf

    在了解Python黑魔法中的异步IO之前,我们需要先理解Python中的异步编程概念。异步编程是计算机编程中的一种方法,它允许程序执行其他任务而不需要等待当前任务的完成。这种编程方式特别适合于I/O密集型任务,如网络...

    基于java的异步IO框架 Cindy.zip

    Java中的异步IO框架是Java生态系统中的重要组成部分,它允许开发者在处理I/O操作时无需等待数据传输完成,而是可以立即返回并执行其他任务,提高了程序的并发性能和整体效率。Cindy是一个基于Java实现的异步IO框架,...

Global site tag (gtag.js) - Google Analytics