文件缓存的读写

news2024/11/13 10:55:58

文件系统的读写,其实就是调用系统函数 read 和 write。下面的代码就是 read 和 write 的系统调用,在内核里面的定义。

SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)
{
  struct fd f = fdget_pos(fd);
......
  loff_t pos = file_pos_read(f.file);
  ret = vfs_read(f.file, buf, count, &pos);
......
}


SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf,
    size_t, count)
{
  struct fd f = fdget_pos(fd);
......
  loff_t pos = file_pos_read(f.file);
    ret = vfs_write(f.file, buf, count, &pos);
......
}

对于 read 来讲,里面调用 vfs_read->__vfs_read。对于 write 来讲,里面调用 vfs_write->__vfs_write。下面是 __vfs_read 和 __vfs_write 的代码。

ssize_t __vfs_read(struct file *file, char __user *buf, size_t count,
       loff_t *pos)
{
  if (file->f_op->read)
    return file->f_op->read(file, buf, count, pos);
  else if (file->f_op->read_iter)
    return new_sync_read(file, buf, count, pos);
  else
    return -EINVAL;
}


ssize_t __vfs_write(struct file *file, const char __user *p, size_t count,
        loff_t *pos)
{
  if (file->f_op->write)
    return file->f_op->write(file, p, count, pos);
  else if (file->f_op->write_iter)
    return new_sync_write(file, p, count, pos);
  else
    return -EINVAL;
}

缓存其实就是内存中的一块空间。因为内存比硬盘快得多,Linux 为了改进性能,有时候会选择不直接操作硬盘,而是读写都在内存中,然后批量读取或者写入硬盘。一旦能够命中内存,读写效率就会大幅度提高。

根据是否使用内存做缓存,我们可以把文件的 I/O 操作分为两种类型。

第一种类型是缓存 I/O。大多数文件系统的默认 I/O 操作都是缓存 I/O。对于读操作来讲,操作系统会先检查,内核的缓冲区有没有需要的数据。如果已经缓存了,那就直接从缓存中返回;否则从磁盘中读取,然后缓存在操作系统的缓存中。对于写操作来讲,操作系统会先将数据从用户空间复制到内核空间的缓存中。

第二种类型是直接 IO,就是应用程序直接访问磁盘数据,而不经过内核缓冲区,从而减少了在内核缓存和用户程序之间数据复制。

ext4 是一种日志文件系统,是为了防止突然断电的时候的数据丢失,引入了日志**(Journal)**模式。日志文件系统比非日志文件系统多了一个 Journal 区域。文件在 ext4 中分两部分存储,一部分是文件的元数据,另一部分是数据。元数据和数据的操作日志 Journal 也是分开管理的。你可以在挂载 ext4 的时候,选择 Journal 模式。这种模式在将数据写入文件系统前,必须等待元数据和数据的日志已经落盘才能发挥作用。这样性能比较差,但是最安全。

另一种模式是 order 模式。这个模式不记录数据的日志,只记录元数据的日志,但是在写元数据的日志前,必须先确保数据已经落盘。这个折中,是默认模式。

还有一种模式是 writeback,不记录数据的日志,仅记录元数据的日志,并且不保证数据比元数据先落盘。这个性能最好,但是最不安全。

每一个打开的文件都有一个 struct file 结构,每个 struct file 结构都有一个 struct address_space 用于关联文件和内存,就是在这个结构里面,有一棵树,用于保存所有与这个文件相关的的缓存页。

直接 I/O 读写的流程是一样的,调用 ext4_direct_IO,再往下就调用块设备层了。缓存 I/O 读写的流程不一样。对于读,从块设备读取到缓存中,然后从缓存中拷贝到用户态。对于写,从用户态拷贝到缓存,设置缓存页为脏,然后启动一个线程写入块设备。

此文章为11月Day10学习笔记,内容来源于极客时间《趣谈Linux操作系统》,推荐该课程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1193905.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

有什么可以自动保存微信文件的方法么?

8-3 本文要介绍的方法,可以自动帮你保存微信上收到的文件型数据,比如文件、图片、视频,如果你的工作需要每天或者经常保存大量的从微信收到的文件型数据,也许本文适合你,本文介绍的工具,对微信多开也有效果…

【论文阅读】多模态NeRF:Cross-Spectral Neural Radiance Fields

https://cvlab-unibo.github.io/xnerf-web intro 从不同的light spectrum sensitivity获取信息,同时需要obtain a unified Cross-Spectral scene representation – allowing for querying, for any single point, any of the information sensed across spectra。…

数据分析是什么?

第一章- 数据分析是什么 数据分析是指 根据分析目的,用适当的分析方法及工具,对数据进行分析,提取有价值的信息,形成有效结论的过程。 数据分析的作用 通过观察数据,知道当前发生什么?通过具体的数据拆解…

基于JavaWeb+SSM+Vue微信小程序校园兼职任务平台系统的设计和实现

基于JavaWebSSMVue微信小程序校园兼职任务平台系统的设计和实现 源码传送入口前言主要技术系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码传送入口 前言 随着社会的发展和全球疫情的冲击,大学生的就业形势越来越严峻。越…

接收表单数据

如果您尝试按下提交按钮,浏览器将显示“Method Not Allowed”错误。这是因为到目前为止,前一节中的登录视图函数完成了一半的工作。它可以在网页上显示表单,但是还没有逻辑来处理用户提交的数据。这是Flask-WTF使工作变得非常简单的另一个领域…

游戏缺失d3dx9_39.dll的5个修复方法,深度解析d3dx9_39.dll文件的作用

在当今的数字化时代,电子游戏已经成为了人们休闲娱乐的重要方式之一。然而,对于许多玩家来说,他们在享受游戏带来的乐趣的同时,也可能会遇到各种各样的问题,其中最常见的就是游戏无法正常运行。而这些问题中&#xff0…

【Java 进阶篇】保护你的应用:Java 过滤器实现敏感词汇过滤

在开发 Web 应用程序时,安全性是至关重要的一环。保护用户免受恶意内容的侵害是开发者义不容辞的责任之一。在这篇博客中,我们将深入研究如何使用 Java 过滤器来过滤敏感词汇,确保用户输入的内容不包含不良信息。我们将采用简单而实用的方法&…

Shell速成:快速提升你的Linux命令行技能

1 diff 对比文件不同 diff file1 file2 # 区分两个文件不同的地方[num1,num2][a|c|d][num3,num4] num1,num2 ##第一个文件中的行 a ##添加 c ##更改 d ##删除 < ##第一个文件中的内容 > ##第二个文件中的内容 num3,num4 ##第二个文件中的行-b忽略空格 -B忽略空行 -i…

【ARFoundation学习笔记】点云与参考点

写在前面的话 本系列笔记旨在记录作者在学习Unity中的AR开发过程中需要记录的问题和知识点。主要目的是为了加深记忆。其中难免出现纰漏&#xff0c;更多详细内容请阅读原文以及官方文档。 汪老师博客 文章目录 点云新建点云 参考点参考点的工作原理何时使用参考点使用参考点…

骨传导耳机哪个好?盘点五款好用的骨传导耳机分享

随着手机成为日常生活不可分割的一部分&#xff0c;耳机也逐渐成为了许多人的日常。相较于有线耳机&#xff0c;有越来越多的人愿意去选择无线耳机&#xff0c;而无线耳机也分不同的款式&#xff0c;有入耳式、头戴式、耳夹式、还有耳挂式&#xff0c;入耳式和头戴式由于佩戴时…

地理数据常用处理

自助式绘图工具kepler UTM坐标转WGS84 首先根据UTM对应表找到目标地区的编号&#xff0c;中国东部地区属于UTM Zone 50N 再查找UTM 50N 的EPSG标准 https://epsg.io/?qUTMzone50N 得到 EPSG:32650 Transform coordinates geohash编码与解码 import transbigdata as tbd …

AIP171 AIP591 控制进入运行设备或机器的大门

AIP171 AIP591 控制进入运行设备或机器的大门 AutomationDirect在其安全产品系列中增加了Dold trapped key系统。被困钥匙系统使用一系列机械锁和钥匙来控制进入运行设备或机器的大门&#xff0c;确保安全进入这些机器。Dold被困钥匙系统门集提供了一个完整的被困钥匙安全系统…

mac的可清除空间(时间机器)

看到这个可用82GB&#xff08;458.3MB可清除&#xff09; 顿时感觉清爽&#xff0c;之前的还是可用82GB&#xff08;65GB可清除&#xff09;&#xff0c;安装个xcode都安装不上&#xff0c;费解半天&#xff0c;怎么都解决不了这个问题&#xff0c;就是买磁盘情理软件也解决不了…

如何快速落地LLM应用?通过Langchain接入千帆SDK

百度智能云千帆大模型平台再次史诗级升级&#xff01;在原有API基础上&#xff0c;百度智能云正式上线Python SDK&#xff08;下文均简称千帆 SDK&#xff09;版本并全面开源&#xff0c;企业和开发者可免费下载使用&#xff01;千帆SDK全面覆盖从数据集管理&#xff0c;模型训…

家纺服装行业出口管理ERP解决方案

我国是世界上最大的纺织品生产出口国&#xff0c;有着悠久的家纺服装贸易历史。今年前8个月&#xff0c;我国家纺出口市场经历了震荡波动&#xff0c;8月单月家纺出口增速&#xff0c;结束连续3个月的下降趋势&#xff0c;由负转正。后续家纺出口市场预计将缓慢修复&#xff0c…

LINUX入门篇【5】----程序的翻译过程解析

前言&#xff1a; 在C语言阶段我们已经讲过程序的翻译过程&#xff0c;我们知道程序是由预处理&#xff0c;编译&#xff0c;汇编&#xff0c;链接四部分组成的&#xff0c;但是&#xff0c;当时受到C语言编译器的限制&#xff0c;我们没法去深刻体会这个过程&#xff0c;所以…

使用Navicat导出ER图详细教程

文章目录 打开Navicat&#xff0c;点击模型点击新建模型选择物理模型点击文件&#xff0c;选择从数据库导入选择要导入的数据库点击文件&#xff0c;选择导出的格式成品 打开Navicat&#xff0c;点击模型 点击新建模型 选择物理模型 点击文件&#xff0c;选择从数据库导入 选择…

springcloud图书借阅管理系统源码

开发说明&#xff1a; jdk1.8&#xff0c;mysql5.7&#xff0c;nodejs&#xff0c;idea&#xff0c;nodejs&#xff0c;vscode springcloud springboot mybatis vue elementui 功能介绍&#xff1a; 用户端&#xff1a; 登录注册 首页显示搜索图书&#xff0c;轮播图&…

windows安装linux双系统启动盘的制作与恢复

下载镜像 Index of /ubuntu-releases/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 制作启动盘 准备一个U盘&#xff0c;注意备份&#xff0c;启动盘的制作过程中是将ISO烧录到U盘中&#xff0c;会将U盘中的原内容覆盖掉在网上下载Win32DiskImager软件包烧录ISO…

Linux服务器配置信息查询命令

Linux服务器配置信息查询命令 一、查看CPU信息 查询系统的CPU的详细信息&#xff0c;包括每个处理器的型号、频率、缓存等级以及每个核心的数量。cat /proc/cpuinfo二、查看内存信息 查询系统的内存信息&#xff0c;包括可用内存、已用内存和缓存等。cat /proc/meminfo三、查…