论文学习:Ziggurat: A tiered File System for Non-Volatile Main Memories and Disks

Background

NVMM的出现相比于传统磁盘来说,具有更高的吞吐量和更低的延迟,极大地提高了存储性能,目前针对NVMM设计的文件系统利用持久内存的直接访问(DAX)功能绕过页面缓存层,并为用户应用程序提供对文件数据的直接访问。但NVMM成本比较高,因此需要SSD和HDD去提供更大的容量。基于此,本文提出了一种分层文件系统,管理异构的存储设备,并根据数据性能要求和应用程序未来的访问模式将数据放置到最合适的层。

Question

根据上述阐述,涉及到的问题包括:

  1. 数据的放置策略: 由于NVMM的容量有限且DRAM扔具有比NVMM更好的性能,异步写的数据是不影响程序性能的,所以提出了以下数据放置策略:(将小的;同步更新的数据写入到NVMM,将大的异步更新的数据写入到DRAM中,后台写回disk)
    在这里插入图片描述
    因此,需要识别那些将写入的数据类型是怎样的,文中提出了两个预测器:
  • write size predictor

    • 功能: 预测写入的数据是否是大的,且判断是否是稳定的(在同一地址范围内的未来写入可能也很大)
    • 实现: 在每个write entry中都保留一个计数器,以指示写入大小是否既大又稳定。当Ziggurat重写旧的写条目时,它首先检查写入大小足够大,至少可以覆盖原始日志条目占用的面积的一半。如果是,Ziggurat将旧写条目的计数器值传递给新条目,并将其增加1。否则,它会将计数器重置为零。如果数字大于4(可调参数),Ziggurat将写入分类为“大”。既大又异步的写入磁盘
  • synchronicity predictor

    • 功能: 预测应用程序未来是否可能调用fsync

    • 实现: 计算在两个对fsync的调用之间写入文件的数据块的数量。如果数字小于一个阈值(例如,在我们的实验中为1024),则将

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
产生均匀随机数的迭代方法: 假设我们已经有了一个随机数生成器,可以生成 $[0,1]$ 之间均匀分布的随机数,那么我们可以通过反复调用该随机数生成器来得到多个均匀随机数。 例如,我们想要生成 $[a,b]$ 之间的均匀分布的随机数,可以先生成 $[0,1]$ 之间的均匀分布随机数 $x$,然后通过线性变换的方法将 $x$ 转换为 $[a,b]$ 之间的随机数: $$ y = a + x \cdot (b - a) $$ 其中 $a$ 和 $b$ 分别是区间的左右端点,$x$ 是 $[0,1]$ 之间的均匀分布的随机数,$y$ 是 $[a,b]$ 之间的均匀分布的随机数。 代码实现: ```c++ #include <iostream> #include <random> int main() { std::random_device rand_dev; // 从硬件获得种子 std::mt19937 generator(rand_dev()); // 用 Mersenne Twister 算法生成随机数 double a = 0.0, b = 1.0; for (int i = 0; i < 10; ++i) { double x = std::generate_canonical<double, 10>(generator); // 生成 [0,1] 之间均匀分布的随机数 double y = a + x * (b - a); // 线性变换 std::cout << y << std::endl; // 输出 [a,b] 之间均匀分布的随机数 } return 0; } ``` 产生高斯分布随机数的迭代方法: 高斯分布又称正态分布,是一种在统计学中广泛使用的概率分布。高斯分布的概率密度函数为: $$ f(x) = \frac{1}{\sqrt{2\pi}\sigma} \cdot e^{-\frac{(x-\mu)^2}{2\sigma^2}} $$ 其中 $\mu$ 是均值,$\sigma$ 是标准差。 我们可以使用 Box-Muller 变换或 Ziggurat 算法来生成高斯分布的随机数。 Box-Muller 变换是一种基于极坐标系的变换方法,它可以将两个独立的均匀分布的随机数转换为两个独立的正态分布的随机数。具体实现方法如下: - 生成两个独立的均匀分布的随机数 $u_1$ 和 $u_2$,取值范围为 $[0,1]$; - 计算极径 $r$ 和极角 $\theta$:$r = \sqrt{-2\ln u_1}$,$\theta = 2\pi u_2$; - 计算正态分布的随机数 $x$ 和 $y$:$x = \mu + \sigma r \cos\theta$,$y = \mu + \sigma r \sin\theta$。 其中 $\mu$ 和 $\sigma$ 分别是高斯分布的均值和标准差。 代码实现: ```c++ #include <iostream> #include <random> #include <cmath> int main() { std::random_device rand_dev; // 从硬件获得种子 std::mt19937 generator(rand_dev()); // 用 Mersenne Twister 算法生成随机数 double mu = 0.0, sigma = 1.0; for (int i = 0; i < 10; ++i) { double u1 = std::generate_canonical<double, 10>(generator); // 生成 [0,1] 之间均匀分布的随机数 double u2 = std::generate_canonical<double, 10>(generator); // 生成 [0,1] 之间均匀分布的随机数 double r = std::sqrt(-2.0 * std::log(u1)); double theta = 2.0 * M_PI * u2; double x = mu + sigma * r * std::cos(theta); // 正态分布的随机数 std::cout << x << std::endl; // 输出正态分布的随机数 } return 0; } ``` Ziggurat 算法是一种更高效的生成高斯分布随机数的算法,它利用了高斯分布的对称性和截尾性,可以在常数时间内生成高斯分布的随机数。不过实现比较复杂,这里不作详细介绍。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值