从系统级别的文件中删除已读取的数据

时间:2016-07-10 01:27:20

标签: architecture operating-system filesystems system

假设您有一个应用程序正在写入的数据文件。一旦读取数据,就没有用,因此可以删除它以节省空间。这是我处理这个的设计:

1)文件达到一定大小后,获取锁定 2)查看该文件的vnode表中的读取调用的索引(表示当前文件中的字节的指针) 3)删除索引之前的所有文件数据 4)将读取调用的索引更新为文件的新开头 5)解锁文件,以便恢复读/写

我自己没有太多系统经验,但我认为如果这是在系统级别完成的话那么它是独立于语言的(即如果应用程序使用java调用或python调用来读/写则没有问题)。

数据文件位于unix v6文件系统上。监视文件的大小和删除数据是没有问题的,但我找不到系统调用1)访问vnode表中的其他条目以查看它们在读取文件时的位置和2)更新读取指针这些系统调用。

1 个答案:

答案 0 :(得分:0)

Unix v6文件系统没有任何意义。我相信你并不是指贝尔实验室在1975年发布的用于PDP-11的v6 Unix系统;首先,我很确定它从不支持Java或Python!所以你可能需要更具体一点,你的意思是什么系统。它不能是OpenBSD(尚未发布版本6),或者FreeBSD(版本10和版本6的版本将非常过时)。也许是NetBSD?

在任何情况下,我都不建议尝试在内核中进行更改以支持这一点,因为它非常不可移植,并且比您认为做正确的事情要困难得多。特别是,重新编号逻辑块到物理块之间的映射是棘手的。有支持PUNCH HOLE操作的操作系统和文件系统(例如Linux的ext4和xfs),只要这些偏移是文件系统块大小的倍数,它就会在指定的起始和结束偏移之间解除分配块。您甚至可以使用COLLAPSE RANGE操作来“删除”文件开头或中间的字节---但同样,它们必须是文件系统块大小的倍数,并且它们不会影响文件偏移量任何打开的文件描述符。 COLLAPSE RANGE通常是一个非常糟糕的主意,因为它需要删除文件的所有缓存页面以保持页面缓存一致性。有用的时间非常罕见。主要用例似乎是操纵真正大型视频文件的人。但在架构上,这几乎肯定是 你想做什么。

我建议在用户空间中执行此操作。是的,这意味着您需要在Java和Python中实现支持,但请相信我,这比尝试执行内核和文件系统级别的黑客攻击更容易。如果你真的坚持,你可以创建一个C库然后创建可以从Java和Python调用的SWIG接口,但实际上可能更容易在惯用和本机Java和Python代码中重新实现两次逻辑。

我要做的是让编写器以大约1兆字节左右的块写入,一旦块达到一定大小,就在新文件中启动一个新块。用数字命名块 - 即data0001,data0002等。读者可以只是简单地读取块,当它完成后,删除块文件,然后继续。

非常简单,它不会让你迷失在试图进行内核级黑客攻击的杂草中。