#flow-control #closures #flow #control #macro #filesystem

control-flow

控制闭包外控制流的技巧

2 个版本

使用旧的 Rust 2015

0.1.1 2017 年 8 月 19 日
0.1.0 2017 年 8 月 18 日

Rust 模式 中排名 #1411

MIT 许可证

6KB
83

TFS 已被 RedoxFS 替换,不再维护,TFS 的许多功能已集成到 RedoxFS 中

TFS

TFS:下一代文件系统

TFS 是一个模块化、快速且功能丰富的下一代文件系统,采用现代技术以实现高性能、高空间效率和高度可扩展性。

TFS 的创建是为了满足 Redox OS 对现代文件系统的需求,作为 ZFS 的替代品,由于其单体设计,ZFS 的实现速度较慢。

TFS 受 ZFS 灵感启发,但同时也旨在模块化和易于实现。

TFS 与 terminalcloud 的同名文件系统无关。

尽管许多组件已完善,但 TFS 本身尚未准备好使用。

MIT/X11 permissive license.

GitHub Stars

设计目标

TFS 的设计考虑以下目标

  • 并发

TFS 锁定很少,旨在尽可能适合多线程系统。它使用多个真正的并发结构来管理数据,并通过核心数量进行线性扩展。 这也许是 TFS 的最重要特性。

  • 异步

TFS 是异步的:操作可以独立发生;对磁盘的写入和读取不需要阻塞。

  • 全磁盘压缩

TFS 是第一个通过我们称为 RACC(随机访问集群压缩)的方案实现完整全磁盘压缩的文件系统。这意味着每个集群都只进行压缩,对性能的影响很小。估计您可以得到 60-120% 的更多可用空间。

  • 修订历史

TFS 存储每个文件的修订历史,而不会增加额外开销。这意味着您可以将任何文件恢复到早期版本,自动备份系统,而无需复制带来的额外开销。

  • 数据完整性

与 ZFS 一样,TFS 存储文件的完整校验和(不仅仅是元数据),并且是在父块上完成的。这意味着在读取时几乎可以检测到所有数据损坏。

  • 写时复制语义

类似于 Btrfs 和 ZFS,TFS 使用 CoW 语义,这意味着永远不会直接覆盖任何集群,而是将其复制并写入新的集群。

  • O(1) 递归复制

与其他文件系统一样,TFS 可以以恒定时间进行递归复制,但有一个独特的附加功能:TFS 在修改后不会进行复制。如何?它单独维护文件的段,因此只需要复制更新的段。

  • 保证原子性

系统永远不会进入不一致的状态(除非硬件故障),这意味着意外断电永远不会损坏系统。

  • 改进的缓存

TFS在缓存磁盘以加快磁盘访问方面投入了大量精力。它使用机器学习来学习模式并预测未来的使用,以减少缓存未命中次数。TFS还压缩内存缓存,减少所需内存量。

  • 更好的文件监控

CoW非常适合高性能、可扩展的文件监控,但遗憾的是,只有少数文件系统采用了这一功能。TFS就是其中之一。

  • 全部内存安全

TFS仅使用用Rust编写的组件。因此,内存不安全仅在标记为unsafe的代码中才可能发生,这些代码会进行额外仔细的检查。

  • 全面测试覆盖

TFS旨在在测试方面实现全面覆盖。这通过立即揭示大量错误类别,为正确性提供了相对较强的保证。

  • SSD友好

TFS试图通过重新定位已死亡的扇区来避免SSD的写入限制。

  • 改进的垃圾收集

TFS使用Bloom过滤器进行高效且快速的垃圾收集。TFS允许文件系统垃圾收集器在后台运行而不会阻塞文件系统的其余部分。

常见问题解答

为什么您将SPECK作为默认加密算法?

  • SPECK是一种相对较新的加密算法,但它已经经历了大量的(无效的)密码分析,因此它相对安全。它具有非常好的性能和简单的实现。可移植性是TFS设计的重要部分,而真正可移植且没有侧通道攻击的AES实现比许多人想象的要难(特别是,大多数可移植实现中存在SubBytes的问题)。SPECK没有这个问题,因此可以以最小的努力安全地实现可移植性。

TFS和ZFS有多相似?

  • 实际上并不相似。它们共享许多基本思想,但除此之外,它们基本上没有关联。但ZFS的设计在很大程度上影响了TFS。

TFS仅适用于Redox吗?

  • 不是,也从未计划仅适用于Redox。

整盘压缩是如何工作的?

  • 据我所知,整盘压缩是TFS独有的。它是通过将尽可能多的“页面”(虚拟数据块)收集到“簇”(分配单元)中实现的。通过这样做,可以通过简单地解压缩相应的簇来读取页面。

ZMicro为什么这么慢?会影响TFS的性能吗?

  • ZMicro之所以如此慢,是因为它在位级别上工作,以牺牲性能为代价获得了优秀的压缩比。这种令人难以置信的慢速性能通过减少写入次数得到了补偿。事实上,超过50%的带有ZMicro的分配仅写入一个扇区,而相比之下,3个扇区。其次,无论您的磁盘有多快,它的性能也无法接近ZMicro,因为磁盘操作本身就很慢,从更广的角度来看,压缩性能实际上并不重要。

可扩展哈希或B+树?

  • 都不是。TFS使用树和哈希表的组合:嵌套哈希表,这是一种哈希树的形式。其想法是在桶中创建新的子表而不是重新分配。

设计资源

我写过一些关于TFS设计的文章。

规范

完整的规范可以在 specification.tex 中找到,要渲染它,请安装 texlive 或另一个带有XeTeX的发行版,并运行

xelatex --shell-escape specification.tex

然后打开名为 specification.pdf 的文件


lib.rs:

控制闭包外部的控制流的技巧。

这个crate允许你在闭包外部执行诸如中断循环之类的操作。它通过宏技巧来实现。除非你真的真的需要这个,否则不要使用它。

示例

#[macro_use]
extern crate control_flow;

loop {
    let closure = || {
        defer!(break)
    };

    // Breaks the loop.
    run_loop!(closure());
}

无运行时依赖