专栏首页程序员Linux内核中文件的数据结构和原子操作

Linux内核中文件的数据结构和原子操作

版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.net/zy010101/article/details/84202404

Linux系统支持在不同进程间共享打开文件。内核为所有的I/O创建了3种数据结构表示打开文件,它们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响。

  1. 每个进程在进程表中都有一个记录项,记录项中包含一张打开文件描述符表。
  2. 内核为所有打开文件维持一张文件表。包含了文件状态(读,写等),文件偏移量,指向i节点的指针。
  3. 每打开一个文件,都有一个i节点,它包含了文件类型和对该文件进行各种操作函数的指针。

同一进程打开不同文件的内核数据结构

这个图本来描述的是UNIX操作系统的,在Linux中没有这个V节点,而是采用了一个与文件系统相关的i节点和一个与文件系统无关的i节点。图中描述的是分别从标准输入,标准输出,标准出错各自打开一个文件。

文件系统:文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。常见的文件系统有FAT,NTFS,ext2,ext3,ext4等。Linux的VFS处理了不同文件系统之间的统一管理。

多个进程打开同一文件

每个进程都会获得自己的文件表,因为这可以使每个进程都有自己的对该文件的当前偏移量。但是这些文件表对于指定这个文件指向的是同一个v节点表。在fork后会发生的情形是多个文件描述符指向同一文件表。此时,父子进程各自的每一个文件描述符共享同一个文件表。这样的数据结构在多个进程读取同一文件的时候,是没有问题的。但是在多个进程写文件的时候,则可能产生难以预料的结果。这涉及到原子操作。

原子操作:由多步组成的操作,如果该操作是原子操作,那么它一定是连续执行知道执行完毕,期间不能被打断,要么就一步也不执行。

考虑有A,B两个进程同时打开同一个文件并写人内容。此时的数据结构和上图一样。每个进程都有自己的文件表,但是共享一个V节点。假设A进程现在写入100字节的内容。这时候,内核切换进程到B,B执行写入操作,写入了200字节的内容。这个时候,A进程写入的内容就被B进程写入的内容给覆盖掉了。并且文件长度变为200。(假设A,B进程初始化的文件偏移量为0,那么,B写入的时候,当前文件偏移量就是0,这就导致覆盖了A进程写入的内容。)Unix操作系统提供了一个原子操作的方法,那就是打开文件的时候设置O_APPEND标志。这样做可以使得内核在每次写操作之前将进程的当前偏移量设置到该文件的末尾。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux文件I/O函数

    版权声明:本文为博主原创文章,转载请注明博客地址: ...

    zy010101
  • Linux文件及文件I/O

    版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.ne...

    zy010101
  • Qt添加资源文件

    为了方便跨平台使用,Qt提供了一个资源系统。资源系统用于将程序运行时所需要的资源以二进制的形式存储于可执行文件内部。也就是把资源文件编译成为可执行文件的一部分。...

    zy010101
  • Python 文件操作

    一份执着✘
  • Python 文件I/O

    Python提供了必要的函数和方法进行默认情况下的文件基本操作。你可以用file对象做大部分的文件操作。

    Python知识大全
  • 每天 3 分钟,小闫带你学 Python(二十四)

    Life isn’t about finding yourself. Life is about creating yourself.

    小闫同学啊
  • 小朋友学Python(17):文件

    Python 提供了必要的函数和方法进行默认情况下的文件基本操作。你可以用 file 对象做大部分的文件操作。 一、打开和关闭文件 例1 (1)创建名为test...

    海天一树
  • Python基础(14)——文件

    使用with来管理上下文 with会打开文件将文件对象赋值给file_obj,然后在执行完子代码块的文件操作后自动调用file_obj.close()方法。

    羊羽shine
  • 你绝对想不到R文件找不到(cannot resolve symbol R)的原因

    最近在项目开发中 Android Studio 的 R 文件突然找不到了。IDE 中出现了以下提示

    阳仔
  • 在 P2P 文件分享应用以文件或文件段为单位的优缺

    在我用了好几个 P2P 文件分享应用之后,我对比了多个应用对资源的处理,可以看到基本上可以分为文件夹级的、文件级的和文件里面的一段段级的。本文将会告诉大家使用不...

    林德熙

扫码关注云+社区

领取腾讯云代金券