1.Atomicity Parameters
如下图所示,只需要关注红框中的若干参数,和后面的限制value即可
AWUN
Atomic Write Unit Normal
NAWUN
Namespace Atomic Write Unit Normal
AWUPF
Atomic Write Unit Power Fail
NAWUPF
Namespace Atomic Write Unit Power Fail
NABSN
Namespace Atomic Boundary Size Normal
NABSPF
Namespace Atomic Boundary Size Power Fail
2.
NVM子系统在dentify Controller数据结构中报告了在各种条件下(包括正常操作、电源故障以及在比较和写入融合操作中)保证以原子方式写入的写操作在逻辑块中的大小。在dentify Controller数据结构中报告的值对所有具有任何受支持命名空间格式的命名空间都有效,形成了一个保证不会更改的基线值。
这意味着,无论是正常操作还是异常情况,NVM子系统都能确保数据以原子方式写入,即写入操作要么完全成功,要么完全失败,不会出现部分写入的情况。这种原子性保证了数据的一致性和完整性,特别是在电源故障或其他系统错误发生时。通过比较每命名空间值和基线值,可以了解不同命名空间在原子写入方面的性能差异,从而根据应用需求选择适当的命名空间。
这些值根据它们是基线值还是特定于命名空间的值,报告在dentify Controller数据结构或“识别命名空间”数据结构的相应字段中,包括(命名空间)原子写入单元正常、(命名空间)原子写入单元电源故障和(命名空间)原子比较和写入单元。
控制器可能支持原子边界,这些边界不应被原子操作跨越。命名空间原子边界参数(NABSN、NABO和NABSPF)定义了命名空间的这些边界。如果NABSN或NABSPF设置为非零值,则命名空间支持原子边界。
不支持原子边界的命名空间应将NABSN和NABSPF字段清除为0h。命名空间原子性参数和命名空间原子边界参数值可能是格式特定的,如果修改命名空间格式,这些值可能会发生变化。
在共享命名空间的情况下,由单个控制器执行的操作在共享命名空间中对于提交命令的控制器的相应“识别控制器”或“识别命名空间”数据结构中报告的写入原子性级别是原子的。这意味着,尽管多个控制器可能同时访问共享命名空间,但每个控制器执行的操作都会保持其原子性,确保数据的一致性和完整性。这种机制有助于在并发环境中管理数据访问和修改,防止数据损坏或不一致。
3.AWUN/NAWUN
AWUN/NAWUN 机制用于控制命令执行时与其他命令之间的原子性。它们确保在将数据块写入非易失性存储器(NVM)时,各个命令之间的序列化,从而防止数据块中混合了新命令的部分数据和 其他命令的部分数据。
如果一个write cmd的size <= AWUN/NAWUN 的值,并且该写命令没有跨越原子边界(此时暂时可以认为就是一个普通的边界,后面在对原子边界详细讲解),那么主机就可以保证此 write cmd对于 NVM 来说是原子的,即:与其他读取或写入命令相比是独立的。但如果一个写命令的大小大于 AWUN/NAWUN 的值或跨越了原子边界,那么就不能保证命令的原子性。
4.AWUN/NAWUN Example
在这个例子中,AWUN/NAWUN 的值是 2K(即:4个 512Byte logical block),并且命名空间的原子边界大小(NABSN 和 NABSPF)是 0h。主机发出了两个写命令,每个命令的长度都是 2K(4个logical block)。命令 A 写入 LBA0-3,命令 B 写入 LBA 1-4。
由于命令 A 和命令 B 的大小都小于或等于 AWUN/NAWUN 的值,控制器会对这两个写命令进行序列化,以确保 LBA 0-4 中的最终数据反映的是先执行命令 A 再执行命令 B,或者先执行命令 B 再执行命令 A 的结果,而不是一个中间状态。图 351 展示了 LBA 0-4 中数据的有效结果以及无效结果的示例(实际上可能存在更多的组合)。
上图展示两种可能的有效结果:
- 所有 LBA(0-4)都包含命令 B 的数据,因为命令 B 覆盖了命令 A 在 LBA 1-3 上的写入,并在 LBA 4 上进行了新的写入。
- 所有 LBA(0-4)都包含命令 A 的数据,如果控制器选择先执行命令 A,并且命令 B 由于某种原因(如被取消或失败)没有执行。
无效结果可能包括:
- LBA 0 和 1 包含命令 A 的数据,而 LBA 2、3 和 4 包含命令 B 的数据,这表示一个混合状态,其中命令 A 和命令 B 的数据在逻辑块中交错。
- 其他任何不符合命令 A 和命令 B 顺序执行的逻辑块数据组合。
通过确保写命令的原子性,控制器能够防止数据损坏和不一致,这对于保持存储设备的完整性和可靠性至关重要。
如果写命令A和B的大小大于AWUN/NAWUN值,则不能保证排序。在执行命令A和命令B之后,在指定的LBA范围内,可能存在来自命令A和命令B的数据的任意混合。
5.AWUPF/NAWUPF
AWUPF 和 NAWUPF 用于指示 “ 在电源故障或其他错误条件导致写操作中断并造成撕裂写入时” 控制器的行为。
撕裂写入是指一个写操作,其中本应连续写入的一些逻辑块中只有部分实际上被存储在 NVM 中,导致目标逻辑块处于不确定状态,其中一些逻辑块包含原始数据,而一些逻辑块包含来自写操作的新数据。
如果提交的write cmd size <= AWUPF/NAWUPF 的值,并且该写命令没有跨越原子边界,那么控制器保证,如果由于电源故障或其他错误条件导致命令失败,则随后对与写命令相关的逻辑块进行的读取命令将返回以下之一:
• 所有旧数据(即 NVM 中被中断写操作所寻址的 LBA 范围内的原始数据);
• 所有新数据(即中断写操作要写入 NVM 的所有数据)。
如果提交的写命令的大小大于 AWUPF/NAWUPF 的值或跨越了原子边界,那么对于后续读取相关逻辑块时返回的数据就没有保证。
通过 AWUPF 和 NAWUPF 的机制,控制器提供了在写操作中断时数据完整性的保证。这有助于防止由于撕裂写入导致的数据不一致和损坏,从而提高了存储系统的可靠性和数据完整性。
6.AWUPF/NAWUPF Example
在这个例子中,AWUPF/NAWUPF 的值是 1K(2个 512 Byte logical block),AWUN/NAWUN 的值是 2K(4个 512 Byte logical block),并且命名空间的原子边界大小(NABSN 和 NABSPF)是 0h。命令 A 写入 LBA 0 到 1。
下图显示了 NVM 的初始状态:
命令A开始执行,但在LBA 1处写入逻辑块时因断电而中断。
下图描述了有效的结果和无效的结果:
如果写命令 A 的大小大于 AWUPF/NAWUPF 的值,那么在电源故障或错误条件之后,就无法保证指定 LBA 范围内的数据状态。
在写命令完成后,随后提交的针对该位置的读取命令应返回该写命令的数据,而不是之前写命令的较旧版本的数据,但以下情况除外:
如果同时满足以下所有条件:
a) 控制器支持易失性写入缓存;
b) 易失性写入缓存已启用;
c) 写命令的 FUA 位未设置;
d) 在关机之前没有与写命令相同的命名空间相关联的刷新命令成功完成;
e) 控制器发生关机,没有完成第 7.6.2 节中概述的正常或突然关机程序;
那么,对于写入易失性写入缓存但尚未写入非易失性存储的位置,后续读取可能会返回较旧的数据。
在这种情况下,由于写命令的大小超过了 AWUPF/NAWUPF 的限制,并且可能由于缓存的使用和关机过程中的异常情况,数据的一致性无法得到保证。因此,在设计和使用存储系统时,需要仔细考虑这些因素,并可能需要采取额外的措施来确保数据的完整性和可靠性,例如在关键操作中使用 FUA(强制写入单元)标志来确保数据直接写入非易失性存储,或在系统关闭前使用刷新命令来确保缓存中的数据被写入非易失性存储。
7.Atomic Boundaries
上图显示了原子边界行为的示例。写入单个蓝色或黄色部分不会跨越原子边界。
原子边界控制器如何强制执行原子性保证,同时增加了对命令中指定的 LBA 范围对齐的约束。原子边界仅在每个命名空间的基础上定义。如果 NABSN 或 NABSPF 设置为非零值,则命名空间支持原子边界。
为确保向后兼容性,AWUN、AWUPF 和 ACWU 报告的值应设置为即使写入跨越原子边界也受支持的值。如果控制器不能保证跨原子边界的原子性,则控制器应将 AWUN、AWUPF 和 ACWU 设置为 0h(1 LBA)。
边界大小应大于或等于相应的原子写入大小(即,NABSN/NABSPF 应分别大于或等于 NAWUN/NAWUPF)。NABO 应小于或等于 NABSN 和 NABSPF。
对于边界偏移量(NABO)和边界大小(NABSN 或 NABSPF),如果命令中的 LBA 范围内的任何逻辑块地址都没有跨越以下值:边界偏移量 + (y * 边界大小),其中 y 为任何非负整数,则该范围位于命名空间的原子边界内。
如果写命令跨越由 NABSN 值指定的原子边界,则基于 NAWUN 参数的原子性无法保证。如果写命令跨越由 NABSPF 值指定的原子边界,则基于 NAWUPF 参数的原子性无法保证