深入理解Linux I/O系统

本文深入探讨Linux I/O系统,包括传统的System Call I/O、读写操作、网络I/O、磁盘I/O及高性能优化。讲解了页缓存(PageCache)技术如何减少磁盘I/O,以及零拷贝技术如何提升效率。同时介绍了多路复用技术和DMA在I/O中的作用。
摘要由CSDN通过智能技术生成

​目录

  • 传统的 System Call I/O

  • 读操作

  • 写操作

  • 网络 I/O

  • 磁盘 I/O

  • 高性能优化的 I/O

  • 存储设备的 I/O 栈

  • I/O Buffering

传统的 System Call I/O

在 Linux 系统中,传统的访问方式是通过 write() 和 read() 两个系统调用实现的,通过 read() 函数读取文件到到缓存区中,然后通过 write() 方法把缓存中的数据输出到网络端口。

下图分别对应传统 I/O 操作的数据读写流程,整个过程涉及 2 次 CPU 拷贝、2 次 DMA 拷贝,总共 4 次拷贝,以及 4 次上下文切换。

  • CPU 拷贝: 由 CPU 直接处理数据的传送,数据拷贝时会一直占用 CPU 的资源。

  • DMA 拷贝: 由 CPU 向DMA磁盘控制器下达指令,让 DMA 控制器来处理数据的传送,数据传送完毕再把信息反馈给 CPU,从而减轻了 CPU 资源的占有率。

  • 上下文切换: 当用户程序向内核发起系统调用时,CPU 将用户进程从用户态切换到内核态; 当系统调用返回时,CPU 将用户进程从内核态切换回用户态。

读操作

当应用程序执行 read 系统调用读取一块数据的时候,如果这块数据已经存在于用户进程的页内存中,就直接从内存中读取数据。

如果数据不存在,则先将数据从磁盘加载数据到内核空间的读缓存(Read Buffer)中,再从读缓存拷贝到用户进程的页内存中。

read(file_fd, tmp_buf, len);

基于传统的 I/O 读取方式,read 系统调用会触发 2 次上下文切换,1 次 DMA 拷贝和 1 次 CPU 拷贝。

发起数据读取的流程如下:

  1. 用户进程通过 read() 函数向 Kernel 发起 System Call,上下文从 user space 切换为 kernel space。

  2. CPU 利用 DMA 控制器将数据从主存或硬盘拷贝到 kernel space 的读缓冲区(Read Buffer)。

  3. CPU 将读缓冲区(Read Buffer)中的数据拷贝到 user space 的用户缓冲区(User Buffer)。

  4. 上下文从 kernel space 切换回用户态(User Space&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值