首页 > 其他分享 >文件缓存的读写

文件缓存的读写

时间:2023-11-10 23:00:59浏览次数:41  
标签:__ 文件 缓存 read 读写 pos write file

 文件系统的读写,其实就是调用系统函数 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 读写的流程不一样。对于读,从块设备读取到缓存中,然后从缓存中拷贝到用户态。对于写,从用户态拷贝到缓存,设置缓存页为脏,然后启动一个线程写入块设备。

文件缓存的读写_缓存



标签:__,文件,缓存,read,读写,pos,write,file
From: https://blog.51cto.com/key3feng/8310026

相关文章

  • 文件阅读器的使用——利用文件阅读器将选中的文件图片展示到前端页面
    代码示例:#HTML部分<formaction=""><divclass="form-group"><labelfor="id_file">用户头像{%loadstatic%}<imgsrc="{%static'img/default.png'......
  • 如何从文件路径中提取目录路径?
    内容来自DOChttps://q.houxu6.top/?s=如何从文件路径中提取目录路径?在Bash中,如果VAR="/home/me/mydir/file.c",我该如何获得"/home/me/mydir"?dirname和basename是您要用于提取路径组件的工具:$VAR='/home/pax/file.c'$DIR="$(dirname"${VAR}")";FIL......
  • openGauss学习笔记-119 openGauss 数据库管理-设置数据库审计-设置文件权限安全策略
    openGauss学习笔记-119openGauss数据库管理-设置数据库审计-设置文件权限安全策略119.1背景信息数据库在安装过程中,会自动对其文件权限(包括运行过程中生成的文件,如日志文件等)进行设置。其权限规则如下:数据库程序目录的权限为0750。数据库数据文件目录的权限为0700。ope......
  • Linux搭建文件服务器
    @目录基于centos7.9搭建http文件服务器基于centos7.9搭建nginx文件服务器基于ubuntu2204搭建http文件服务器IP环境192.168.200.100VMware17基于centos7.9搭建http文件服务器安装httpd[root@localhost~]#yuminstall-yhttpd关闭防火墙以及selinux[root@loc......
  • exe可执行文件如何逆向?有那些逆向工具
    逆向工程是对已编译的可执行文件进行分析的过程,以理解其内部结构、功能和逻辑。逆向工程可执行文件通常用于安全研究、漏洞分析、软件破解等领域。下面是一些常用的逆向工具和技术,以及一般的逆向流程。逆向工具:IDAPro: IDAPro是一款强大的反汇编工具,用于分析和逆向各种可执......
  • [EFI]戴尔Latitude 5310电脑 Hackintosh 黑苹果efi引导文件
    硬件型号驱动情况主板戴尔Latitude5310处理器IntelCorei5-10210U(1.6GHz/L36M)已驱动内存8GB已驱动硬盘三星MZVLW1T0HMLH-000L2(1024GB/固态硬盘)已驱动显卡IntelUHD620已驱动声卡瑞昱AudioALC299@英特尔HighDefinitionAudio控制器已驱动网卡RTL8168HGigabitEt......
  • Windows 运行.sh文件
    背景今天运行opencv的一段代码,其中有一个模型需要下载,原作者写了一个.sh脚本,运行脚本自动下载模型,尝试使用pycharm终端运行报错解决办法下载Git,使用Gitbash运行.sh脚本文件。Gitbash可以认为是一个简化版的终端,在Git中,可以将windows系统当做Linux系统使用。除了可以运......
  • 高效技巧:Node.js文件写入
    文件写入是 Node.js 中的一项重要任务,它允许你将数据保存到本地文件系统中,供后续使用。这个功能在许多应用中都有广泛的应用,包括数据备份、日志记录、配置文件更新等。在本文,我们将介绍如何在Node.js中执行文件写入操作,提供基本概念、常用方法、使用场景和实践案例。基本概念在......
  • Alluxio读写流程
    1.背景在https://blog.51cto.com/u_15327484文章中,介绍了Alluxio的架构。本文基于此,介绍Alluxio文件读写流程。Alluxio读写流程几乎和HDFS一致,只是Worker多了一个从UFS读写的选项,本文会省略部分流程,只介绍重点。2.Alluxio写流程客户端向Alluxio写数据时,可以指定是否就Alluxio......
  • PHP大文件分片上传的实现方法
    一、前言在网站开发中,经常会有上传文件的需求,有的文件size太大直接上传,经常会导致上传过程中耗时太久,大量占用带宽资源,因此有了分片上传。分片上传主要是前端将一个较大的文件分成等分的几片,标识当前分片是第几片和总共几片,待所有的分片均上传成功的时候,在后台进行合成文件即可......