阻塞:用户进程访问数据时,如果未完成IO,等待IO操作完成或者进行系统调用来判断IO是否完成
非阻塞:用户进程访问数据时,会马上返回一个状态值,无论是否完成
同步:用户进程发起IO(就绪判断)后,轮询内核状态
异步:用户进程发起IO后,可以做其他事情,等待内核通知
由于进程无法直接操作I/O设备,因此必须通过系统调用请求kernel来协助完成I/O操作,内核会为每一个I/O设备维护一个buffer。其工作流程为:
对于输入而言,等待(wait)数据输入至buffer中需要时间,再从buffer复制(copy)到用户进程缓存区中也需要时间。
因此,根据等待模式不同,I/O动作可以分为5种模式:
网络IO模型和文件IO模型是一样的,包括阻塞IO、非阻塞IO、多路复用IO、信号驱动的IO、异步IO,5种模型。
一次IO包括两个过程,内核数据准备 、把数据从内核空间copy到用户空间。
1、阻塞IO(recvfrom系统调用)是在两个过程应用都处于阻塞状态。
当进程执行系统调用时,如果在用户进程空间的缓存区中没有找到相应的数据,则进程将处于阻塞状态。当内核从磁盘上读取数据到内核空间的buffer中,并且buffer中的数据复制到用户进程空间的缓存区中这段时间里,进程都将处于阻塞状态。当数据到达用户进程缓存区中,进程就会解除阻塞状态,再有进程将数据返回给客户端。
由于进程处于阻塞状态,因此很少占用cpu,只是等待cpu的响应。因此,这种模型可以提高cpu的使用效率。
2、非阻塞IO(recvfrom系统调用)是应用发出IO操作后可以立刻返回,通过轮询盘判断数据是否准备好,在copy数据阶段阻塞应用。
进程执行系统调用,如果在用户进程空间缓存区中没有找到数据,则进程不会处于阻塞状态。而是进程不断的询问用户进程空间缓存区中是否有数据。如果没有,立即返回EWOULDBLOCK,此时由于进程处于非阻塞状态,因此,该进程可以做其他的事情。
在这种模型下,进程需要不断的询问用户进程缓存区中是否有数据,因此,会造成cpu大量的进行上下文切换(进程切换),会大量的消耗cpu。
3、多路复用IO(select 、recvfrom系统调用)是阻塞调用select,查找可用的套接字,如果有套接字可用,那么就阻塞调用(recvfrom)完成数据的copy过程。linux select就是这种模型,缺点是一次select会扫描所有的socket。
4、信号驱动的IO(SIGIO、recvfrom)是应用发出SIG IO后立刻返回,内核中数据准备好后,通知应用,由应用进行阻塞recvfrom调用从内核copy数据。linux epoll就是基于事件的就绪通知方式,省去了所有socket的扫描开销。
epoll,kqueue比select高级,select是在内核里做轮询操作, epoll是使用回调机制, 消耗的资源更少. 套接字比较多的时候,每次select()都要通过遍历Socket来完成调度,不管哪个Socket是活跃的,都遍历一遍。这会浪费很多CPU时间。epoll给套接字注册某个回调函数,当他们活跃时,自动完成相关操作,那就避免了轮询。
5、异步IO(aio-read)是应用发出aio-read后马上返回,数据准备好后,由操作系统把数据copy到应用,并通知应用数据copy完成。
当然除了以上的IO模式,还有直接IO(应用绕过内核直接访问磁盘文件),内存映射MMap(建立内存和文件的映射关系),这两种模式在linux 2.6上本质上没有差异。
直接IO在数据库引擎中用的比较多,数据库的buffer绕过文件系统cache,直接访问硬盘。Mongodb中就是用到mmap,无需调用read、write系统调用。
同步、异步、阻塞、非阻塞一般有这么几种组合:
同步非阻塞,典型代表是java NIO
异步阻塞,典型代表是select,epoll
异步非阻塞,典型代表是aio
分享到:
相关推荐
linux io模型,区分阻塞非阻塞同步异步的概念,从底层理解io。
Linux IO模型 epoll 多进程模型 Socket
对于系统开发者和管理员,深入理解Linux的Socket编程、IO模型以及进程间通信(IPC)是至关重要的。本资料包提供了三个主要部分的学习资源:`process_comm`涉及进程间通信,`linux_socket`涵盖Socket编程,而`io_mode...
Linux IO 之 IO 与网络模型 Linux 内核提供了多种 IO 模型,以满足不同场景下的需求,包括阻塞、非阻塞、多路复用、信号 IO、异步 IO 等。这些 IO 模型的选择对应用程序的性能和响应速度有着重要的影响。 1. 阻塞 ...
详细描述了linux io模型(NIO、BIO、select、poll、epoll)的特点以及应用场景
本文将从 Unix/Linux 接口出发,介绍几种常用的 IO 模型,并分析它们的优缺点。 阻塞型 IO 模型 阻塞型 IO 模型是最基本的 IO 模型,使用 listen()、send()、recv() 等接口来实现网络通信。这些接口在调用时都可能...
对于系统开发者和管理员,深入理解Linux的Socket编程、IO模型以及进程间通信(IPC)是至关重要的。本资料包提供了三个主要部分的学习资源:`process_comm`涉及进程间通信,`linux_socket`涵盖Socket编程,而`io_mode...
在Linux操作系统中,有五种主要的IO模型,分别是阻塞IO、非阻塞IO、IO多路复用、信号驱动IO和异步IO。这些模型决定了应用程序如何与硬件进行交互,以获取和处理输入/输出数据。以下是对这五种模型的详细解释: 1. ...
在Linux操作系统中,I/O模型的设计对于服务器的性能和稳定性至关重要。随着互联网技术的发展,处理高并发成为服务器架构的关键挑战。Linux提供了多种I/O模型,包括阻塞I/O、非阻塞I/O、I/O复用(select、poll、epoll...
不同的IO模型决定了程序如何等待、处理和响应数据传输。本篇文章将深入探讨四种主要的IO模型:阻塞IO、无阻塞IO、多路复用IO(也称为选择器或I/O多路复用)以及异步IO,结合源码分析来帮助理解它们的工作原理和应用...
在Linux环境下,网络I/O(Input/Output)模型是系统处理网络数据传输的关键部分,它涉及到如何高效地读取和写入网络数据。本主题将深入探讨几种主要的网络I/O模型,包括阻塞I/O、非阻塞I/O、I/O复用、信号驱动I/O...
`lio.c`可能使用了Linux的异步I/O(Asynchronous I/O,AIO)模型。异步I/O允许程序在发起I/O操作后立即返回,而不是等待操作完成,提高了程序的并发性。在处理大文件逆序时,AIO可以避免阻塞主线程,提高效率。但AIO...
接下来我们将详细介绍Linux下的五种IO模型:阻塞IO、非阻塞IO、IO多路复用、信号驱动IO和异步IO。 **1. 阻塞IO (Blocking IO)** 阻塞IO是最简单的IO模型。当一个进程发起一个读或写的IO请求时,它会一直等待直到IO...
### IO模型与性能分析 #### 一、基本概念与背景 在探讨IO模型与性能分析之前,我们需要了解一些基础概念: - **时钟周期**:指的是一个时钟脉冲所持续的时间,它是衡量处理器速度的基本单位之一。 - **总线周期**...
### IO模型中的阻塞模型和非阻塞模型 在计算机科学领域中,输入/输出(Input/Output,简称IO)模型对于操作系统与应用程序之间的交互至关重要。根据数据读写操作是否可以立即返回,IO模型通常被划分为阻塞式...
**文件IO**是Linux系统中最常见的IO模型,它基于系统调用接口,如`open()`, `read()`, `write()`, `close()`等。文件IO允许程序直接与文件系统交互,执行打开、读取、写入和关闭等操作。这种方式灵活性高,适用于...
Java IO模型1主要涉及到的是Java在处理网络数据交互时的不同方式。这里有五种主要的IO模型,它们分别是阻塞IO(BIO)、非阻塞IO、IO多路复用、信号量和异步IO(AIO)。理解这些模型的关键在于区分同步与异步以及阻塞...