资讯专栏INFORMATION COLUMN

关于文件的INode与Java中的文件操作接口

W_BinaryTree / 1766人阅读

摘要:文件名是可以随时被改变的,只要其中的没有发生改变,则指向的就是同一个文件。关于和,还有关于缓存的重要注意事项。由于操作系统在接收到文件写请求时可能将写入内容放到缓存中,所以提供了和等操作来将缓存中的内容强制刷入磁盘。文章来源网易云社区

本文由作者周梁伟授权网易云社区发布。

近日做的项目中涉及到多进程共同读写多个文件的问题,文件名和最后修改时间都是可能会被频繁修改的,因而识别文件的唯一性会产生相当的麻烦,于是专门再学习了一下文件系统对文件的组织管理方式。

一、 文件在文件系统中的组织方式
一块物理磁盘可以被分为若干个分区,分区的初始化操作就是在上面建立文件系统,如ext3,ext4,ntfs或fat32等都是文件系统的概念,还有网络文件系统如NFS等。同块磁盘上的不同分区也可以被指定不同的文件系统,文件系统对文件在磁盘上的数据读写方式做了抽象。一个文件系统中又被分为多个卷(Cylinder Group),每个卷中最主要的部分是inode基路段和数据块段。i-node结构唯一指定了一个文件实例,这个数据结构中包括了inode编号,所有包含的数据块的信息和该inode被引用的计数等。可以这么认为,要唯一识别的一个磁盘上的文件,只需要获得inode-number就可以了。文件或者目录则是存放在数据块中directory block,其中包含了文件名和实体文件的inode-number等信息。文件名是可以随时被改变的,只要其中的inode-number没有发生改变,则指向的就是同一个文件。所以在应用程序中要判断文件是否相同如果依靠filename是不可靠的,只有获取到文件的inode-number才是可靠的。如在log4j这种日志应用中,日志文件的归档方式会使文件名不断发生变化,当前你less到的app.log在下一分钟可能就变成了app.log.1。在这种场景下,程序只能通过获取文件inode-number来识别文件。

二、 文件操作
前面说了文件在磁盘上的存放是以inode-number为唯一id来区分的,在进程打开一个文件读写时,操作系统又会为文件分配一个"指针"来访问文件,而不是直接使用inode-number。这个指针就是FileDescriptor(下面简称FD),FD是一个动态的概念,是进程中调用create后open文件操作是返回的一个Long值,当文件关闭时这个FD也就失效了,所以同一个文件如果被打开两次获取到的FD会是不同的。进程打开文件的情况如下图所示,在进程中维护了一张表记录所有打开的文件,每一条记录表示一个FileDescriptor,每个进程在开始时都默认打开了三个文件,FileDescriptor分别是0,1,2,既stdin, stdout和stderr。FD记录中包含了一张FileTable,记录了文件的状态信息,offset和V-node指针,V-Node指针才真正指向了磁盘上的文件实体。(这里的V-Node是在inode之上抽象出来的概念,因为i-node在不同的文件系统中会有实现上的差异,V-Node是为了统一不同文件系统的接口抽象出来的一层,在Linux中V-Node被称为 FileSystem independent INode ,而INode 称为FileSystem dependent Inode,我们可以简单的理解为 V-Node就是INode)。

当一个文件被多个进程共享读写时,可以看如下图:

这里进程A的fd3和进程B的fd4其实指向的是同一个实体文件,但是这两个进程维护了两张不同的文件表,维护了不同的offset位置。所以如果进程不是采用append方式写文件,两个进程写入的内容可能出现相互覆盖。这里也可能看到虽然FD不同,但是可以指向同一个实体文件,也说明了用FD来判断文件唯一性是不靠谱的。
关于FD和INode,还有关于缓存的重要注意事项。
由于操作系统在接收到文件写请求时可能将写入内容放到缓存中,所以提供了flush和sync等操作来将缓存中的内容强制刷入磁盘。但是这两个操作作用是不同的。
flush会将数据刷入到FileDescriptor中,但是不会刷入Inode
sync/fsync/fdatasync则会强制将FD中的数据刷入Inode中。

三、 Java操作文件的接口

最后需要注意的一点是,虽然在文件的存续期间,inode可以认为是识别该文件的唯一标识,但是文件系统对inode有回收重用的机制,在文件被删除之后,原来的inode可以被分配给新创建的文件,这种情况下,如果一味以inode相同来判定新旧文件是不是同一个文件可能会出现错误;应对这种情况确实也没有更好的办法,一种解决方法是,提取文件中部分内容的MD5或SHA-1这种指纹信息作为标识,以inode+md5是否相同来决定是否是同个文件。

免费领取验证码、内容安全、短信发送、直播点播体验包及云服务器等套餐

更多网易技术、产品、运营经验分享请访问网易云社区。

文章来源: 网易云社区

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25350.html

相关文章

  • 读书笔记-linux私房菜

    摘要:私房菜阅读笔记整理计算机的五大单元输入输出内部的控制单元和算数逻辑单元内存主要作用,管理和运算算数逻辑单元,控制单元前者负责程序运算和逻辑判断后者负责协调各个组件与各个单元之间的工作的重点在与运算和判断,这些数据来自于内存内存则从输 showImg(https://user-gold-cdn.xitu.io/2018/8/30/16589ca3f1ed8032?w=1334&h=738...

    robin 评论0 收藏0
  • hadoop源码分析系列(六)——org.apache.hadoop.hdfs包之nameNode篇

    摘要:还记录了块的冗余过程中的个状态,提供了检测心跳的线程,冗余过程中的监视器线程安全模式的监视器线程。这个抽象类维护了的权限信息,访问时间,修改时间,使用的的个数和使用的的个数,还有个,用来记录上一级的。类就是监督锁保证及时释放的。 概述: nameNode主要负责管理hdfs中的namespace和inode信息,namenode维护了一个两个关键的列表 1、文件与块的映射(namespace...

    elisa.yang 评论0 收藏0
  • Linux虚拟文件系统简介

    摘要:每个磁盘分区上都有一份,里面包含了当前磁盘分区的信息,如文件系统类型剩余空间等。首先得有一个创建文件系统的工具如文件系统的,用来将磁盘分区格式化成想要的格式,主要是初始化和。 本文将对Linux下的VFS做一个简单介绍,主要包括VFS里面的一些概念,以及文件系统是如何与VFS交互的。 本文所涉及的代码摘自Linux-4.4.0-59 什么是VFS VFS的全称为virtual File...

    paulquei 评论0 收藏0
  • 初探Linux---Linux文件系统概览

    摘要:六文件类型与目录结构支持很多文件类型,其中非常重要的文件类型有普通文件,目录文件,链接文件,设备文件,管道文件,套接字文件等。套接字文件套接字文件被用于网络进程之间的通信,既可以使台不同的机器进行通信,也可以用于本机的网络程序。一、Linux简介类Unix系统: Linux是一种自由、开放源码的类似Unix的操作系统Linux内核: 严格来说,Linux这个词本身只表示Linux内核Linu...

    Tecode 评论0 收藏0
  • linux基础命令介绍二:输入输出

    摘要:支持标准输入,标准输出,标准错误三个数据流。于是,我们用键盘键入字符标准输入,执行命令后的输出标准输出,命令执行出错标准错误,都显示在终端窗口之上。这秒内当前不能接受输入。如第一个命令将文件内容输出到屏幕上,第二个命令使用符号将标准输 在第一篇介绍命令行接口时,我们是这样描述CLI的:是一种通过在终端窗口中键入文本命令来实现与计算机交互的接口。这里简要说明一下终端的概念,历史上,控制台...

    winterdawn 评论0 收藏0

发表评论

0条评论

W_BinaryTree

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<