Linux IO

目录

同步和异步:

阻塞和非阻塞:

Linux的IO模型有五种:


同步和异步:

同步和异步是针对应用程序和内核的交互而言的。同步过程中,进程出发IO操作并等待或者轮询去查看IO是否完成。异步过程中进程触发IO操作后直接返回,做自己的事情,IO交给内核处理,完成后内核通知进程IO操作已经完成。

阻塞和非阻塞:

不能立即返回结果就是阻塞。

Linux的IO模型有五种:

  • 阻塞IO
  • 非阻塞IO
  • 信号驱动式IO(不常用)
  • 多路复用IO
  • 异步IO

一次网络IO(Read)分为两个步骤:1、等待数据准备 2、将数据从内核拷贝到进程中。

阻塞IO:当用户调用IO读数据时,内核进入第一个阶段,准备数据,此时可能数据还没完全准备好,用户进程就需要一直等待直到内核给出数据。

非阻塞IO:用户发出IO读操作后,如果内核没准备好数据,就直接返回error,不会阻塞用户进程,从用户的角度而言,发出的操作立即得到了响应,不需要等待,但结果是error时它直到数据还没有准备好,于是它再次发起请求,直到某一次内核准备好数据返回结果,将数据拷贝到用户内存,这个过程,进程没有阻塞,但一直在主动的询问。

多路复用IO:也叫事件驱动IO,select/epoll即是此IO,好处是单个Process就可同时处理多个网络IO,他的原理就是select、epoll函数会不断的轮询所负责的所有socket,当某个socket有数据到达时,就通知用户。用户调用了select,进程会被阻塞,同时内核监视所有socket,当有一个准备好数据,则立即返回,然后用户在调用read。阻塞IO的话是用户直接调用read。使用select/epoll的web server不一定比使用multi-threading + blocking IO的web server性能更好,可能延迟还更大。select/epoll的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接。

异步IO:用户发起Read后,就去做其他事情,内核异步请求后,立刻返回,不会阻塞用户进程,然后等待数据准备完成,拷贝至用户内存,之后发送给用户进程一个singal,通知操作完成。

阻塞IO、非阻塞IO、多路复用IO都属于同步IO。之所以非阻塞IO也是同步IO,是因为在非阻塞IO中,真正的IO操作是内核准备好数据后拷贝到用户内存的过程,整个过程进程被阻塞。

select/epoll/poll

IO多路复用可以监听多个描述符,一旦某个描述符就绪,就通知程序进行相应的操作。

 

 

参考: https://www.cnblogs.com/Anker/p/3254269.html

http://www.cnblogs.com/Anker/p/3265058.html

 

### Linux IO 的全面信息与教程 Linux IO(输入/输出)系统是操作系统中非常重要的组成部分,它负责管理设备驱动程序、文件系统和用户空间之间的数据流动。以下是关于 Linux IO 的详细说明,包括其核心概念、工作原理以及相关的工具和教程。 #### 1. Linux IO 核心概念 Linux IO 系统的核心概念包括以下几部分: - **文件描述符**:在 Linux 中,所有 IO 操作都通过文件描述符进行[^1]。文件描述符是一个非负整数,用于标识打开的文件或设备。 - **缓冲区**:为了提高性能,Linux 使用内核缓冲区来临时存储数据,减少磁盘访问次数[^2]。 - **同步与异步 IO**:同步 IO 阻塞当前线程,直到操作完成;而异步 IO 则允许程序继续执行其他任务[^1]。 #### 2. Linux IO 工作流程 Linux IO 的工作流程可以分为以下几个阶段: - **用户空间请求**:应用程序发起读写请求,例如使用 `read()` 或 `write()` 系统调用。 - **系统调用处理**:内核接收到请求后,检查缓存是否命中。如果命中,则直接返回数据;否则,触发设备驱动程序进行实际的硬件操作。 - **硬件交互**:设备驱动程序将数据传递给底层硬件,并等待硬件完成操作。 #### 3. 常见的 Linux IO 模型 Linux 提供了多种 IO 模型,以满足不同的应用场景需求: - **阻塞 IO**:应用程序在等待 IO 完成时处于阻塞状态[^1]。 - **非阻塞 IO**:应用程序不会阻塞,但需要频繁轮询以检查 IO 是否完成[^2]。 - **IO 多路复用**:通过 `select()`、`poll()` 和 `epoll()` 等系统调用,同时监控多个文件描述符的状态变化。 - **信号驱动 IO**:当 IO 准备就绪时,内核会发送一个信号通知应用程序。 - **异步 IO**:完全由内核负责完成 IO 操作,并通过回调函数通知应用程序结果[^1]。 #### 4. 相关工具与调试方法 为了更好地理解和优化 Linux IO,可以使用以下工具: - **iostat**:显示系统的输入/输出统计信息。 - **vmstat**:报告虚拟内存、进程、CPU 等活动情况[^1]。 - **strace**:跟踪系统调用和信号,帮助分析 IO 行为[^2]。 - **perf**:性能分析工具,可用于诊断 IO 瓶颈[^1]。 #### 5. 学习资源推荐 对于希望深入了解 Linux IO 的开发者,以下资源可能有所帮助: - **《Linux 内核揭秘》**:提供对 Linux 内核内部机制的深入讲解,包括 IO 子系统。 - **《UNIX 网络编程》**:专注于网络 IO 和多路复用技术[^2]。 - **《深入理解计算机系统》**:从硬件到软件层面解析 IO 的实现细节[^1]。 ```python # 示例代码:使用 Python 进行简单的文件 IO 操作 with open('example.txt', 'r') as file: content = file.read() print(content) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值