首页 > 系统相关 >深入理解 Linux 的 I/O 系统

深入理解 Linux 的 I/O 系统

时间:2023-05-04 16:35:36浏览次数:33  
标签:space Buffer read 理解 深入 Linux 拷贝 数据 CPU

点击上方“C语言与CPP编程”,选择“关注/置顶/星标公众号

干货福利,第一时间送达!

图片

传统的 System Call I/O在 Linux 系统中,传统的访问方式是通过 write() 和 read() 两个系统调用实现的,通过 read() 函数读取文件到到缓存区中,然后通过 write() 方法把缓存中的数据输出到网络端口。
read(file_fd, tmp_buf, len);
write(socket_fd, tmp_buf, len);
下图分别对应传统 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),read 调用执行返回。

写操作

当应用程序准备好数据,执行 write 系统调用发送网络数据时,先将数据从用户空间的页缓存拷贝到内核空间的网络缓冲区(Socket Buffer)中,然后再将写缓存中的数据拷贝到网卡设备完成数据发送。

write(socket_fd, tmp_buf, len);

基于传统的 I/O 写入方式,write() 系统调用会触发 2 次上下文切换,1 次 CPU 拷贝和 1 次 DMA 拷贝。

用户程序发送网络数据的流程如下:

  1. 用户进程通过 write() 函数向 kernel 发起 System Call,上下文从 user space 切换为 kernel space。
  2. CPU 将用户缓冲区(User Buffer)中的数据拷贝到 kernel space 的网络缓冲区(Socket Buffer)。
  3. CPU 利用 DMA 控制器将数据从网络缓冲区(Socket Buffer)拷贝到 NIC 进行数据传输。
  4. 上下文从 kernel space 切换回 user space,write 系统调用执行返回。

网络 I/O

图片

磁盘 

标签:space,Buffer,read,理解,深入,Linux,拷贝,数据,CPU
From: https://www.cnblogs.com/cheyunhua/p/17371646.html

相关文章

  • ARM Linux安装node.js和node-red
    SA515安装node.js和node-red1.先安装node.js直接官网下载ARMv7版可执行文件:https://nodejs.org/en/download当前使用的最新版本:https://nodejs.org/dist/v18.16.0/node-v18.16.0-linux-armv7l.tar.xz2.导入开发板,这里以/usrdata为例adbpushnode-v18.16.0-linux-armv7l......
  • linux find命令只输出结果 不输出报错信息
     find/-name"*filename*"2>/dev/null *filename*改成你想要查找的文件即可,模糊查找请加上相应的通配符 转自:https://blog.csdn.net/qq_35544379/article/details/111401707  ......
  • Linux终端多彩显示
    PS1="\[\e[1;35m\]\u@\[\e[32m\]\h\e[36m\]\w\$\[\e[m\]"在/etc/profile尾行添加以上内容,保存退出后source/etc/profile生效......
  • Linux环境变量与Set-UID设置
    管理环境变量(1) env命令输出环境变量。 (2) 输出特定的环境变量  printenvPWD方法 env|grepPWD方法(3)使用export命令设置环境变量  2.将环境变量从父进程传递给子进程(1)使用vim编辑器编写程序   (2)编译运行程序,并将结果保存在child.txt文件中,......
  • linux删除命令
    当前文件夹里的删除文件夹以aa开头的rm-r-faa*当前文件夹里的删除文件夹aa,bb,ccrm-r-faabbcc删除当前目录文件夹所在的所有文件Linuxrm-r-f./*其中,.表示当前目录,/*表示匹配当前目录下的所有文件和子文件夹。-r参数表示递归地删除文件夹及其子文件夹和文件;-......
  • 从七个方面聊聊linux到底强在哪
     从事计算机相关行业的同学不难发现,身边总有一些朋友在学习linux,有的开发同学甚至自己的电脑就是它。经常听他们说linux如何好用等等。那么linux到底好在那里,能让大家如此喜欢。这也是我经常问自己的一个问题。下面我将通过以下七点来为大家阐述linux的巨大优势。下面我将通过......
  • Linux安装部署Redis(超级详细)
    原文链接:https://www.cnblogs.com/AllWjw/p/15771097.html网上搜索了一筐如何在Linux下安装部署Redis的文章,各种文章混搭在一起勉强安装成功了。自己也记录下,方便后续安装时候有个借鉴之处。Redis版本5.0.4服务器版本LinuxCentOS7.664位下载Redis进入官网找到下载地......
  • 从七个方面聊聊Linux到底强在哪
    从事计算机相关行业的同学不难发现,身边总有一些朋友在学习linux,有的开发同学甚至自己的电脑就是它。经常听他们说linux如何好用等等。那么linux到底好在那里,能让大家如此喜欢。这也是我经常问自己的一个问题。下面我将通过以下七点来为大家阐述linux的巨大优势。 下面我将通过......
  • Linux系统之NFS共享配置教程
    (Linux系统之NFS共享配置教程)一、nfs介绍1.nfs简介NFS是NetworkFileSystem的缩写及网络文件系统。NFS主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录。2.nfs特点NFS(NetworkFileSystem)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的......
  • Linux系统简单文件操作命令
      (1)查看当前目录问:提示符$与#的区别?【#】代表root权限【$】代表普通用户如果更改了/etc/profile,或~/.bashrc等文档,可以用任何符号来代替它们。(2)在用户主目录(家目录)下面创建一个以自己学号命名的目录并查看是否创建成功 问:如何列出当前目录下面的所有文件?(......