现代SSD的原子写入单元是什么?

问题描述 投票:0回答:2

我的理解是,最现代的基于主轴的驱动器都有一个“扇区”作为原子写入单元。现代SSD的单位是什么?

storage atomic disk solid-state-drive
2个回答
1
投票

我不完全确定原子写入单元是什么意思。我假设你的意思是最小的写入单位。

在NAND闪存SSD中,读写的最小单位称为页。通常,页面大小为 2kB 或 4kB,加上元数据。

另外,擦除的最小单位是几页(32-128页)。

来源:

http://codecapsule.com/2014/02/12/coding-for-ssds-part-3-pages-blocks-and-the-flash-translation-layer/

https://en.wikipedia.org/wiki/Flash_memory#NAND_memories


1
投票

SSD内部有页和块。我推荐SSD 编码。还有传输协议的扇区大小。传输协议用于CPU和SSD之间的通信。它可以是 ATA、SCSI、NVMe、USB MS...

所以这里有一些示例值:

  • 页面大小4kb
  • 块大小512kb(始终是页面大小的倍数)
  • 协议扇区大小512字节

现在,当您直接写入 SSD(无需文件系统)时,没有人能保证任何内容都是原子的。即使您在程序阶段写入一个字节,如果发生电源故障,它也不是原子的。

传输协议(如 NVMe)可以提供原子性,但不幸的是实际上它不支持

作为普通程序员,您可以使用 SQLite 或 MySQL 等数据库,它们作为 ACID 的一部分提供原子性。你不必担心任何事情。但请确保事务已启用且自动提交已关闭。

如果您自己编写数据库,则必须依赖诸如 fsync文件系统日志记录之类的功能。

如果您直接写入 SSD 并且您知道块大小,这里是如何获得原子性的示例(我实际上是在 Arduino 上这样做的):

  • 一个块仅存储一个布尔值(0 或 1),它在数据区域 0 和 1 之间切换
  • N个块保存了所有要存储的数据(数据区0)
  • N个块也保存了所有你想要存储的数据(数据区1)

现在假设你已经向数据区0写入了数据,且bool为0。但是你想更新数据。您所做的是将所有数据写入数据区域 1,最后将布尔值切换为 1。当您想再次写入时,将所有数据写入数据区域 0 并再次切换布尔值。这样你就可以进行原子写入。在写入数据区域或布尔值后,不要忘记调用sync、commit或flush(如果可用)。

当然可以通过向数据区域添加校验和或实施日志来改进该算法。

© www.soinside.com 2019 - 2024. All rights reserved.