复制文件(在操作系统或 Python 中复制粘贴)时,例如复制图像,所有原始数据是否从 SSD 读取并通过 CPU 传递,然后返回 SSD,还是只有一些元数据读取到 CPU,其余部分由本地 SSD 控制器处理?是否有能够本地复制粘贴,即文件原始数据没有离开SSD?
例如以下python代码:
from shutil import copyfile
src = "src.JPG"
dst = "dst.JPG"
copyfile(src, dst)
我想减少数据迁移的能耗,并利用内部 SSD 的高带宽……
答案1
SSD 无法做到这一点 —— 至少在当前固件下无法做到这一点,在当前操作系统下也无法做到这一点。
SSD 执行的命令集(除了一些附加功能,如 TRIM)与传统 SATA 硬盘相同。您根本无法向驱动器发送“将块 x 的内容复制到块 y”的命令。
有一些命令用于从驱动器读取数据,即将驱动器上指定块的内容复制到系统 RAM 中。还有一些命令用于写入数据,即将系统 RAM 复制到驱动器上的指定块中。还有很多其他命令不是读取或写入命令。但没有“驱动器内复制”命令。
所以 - 驱动器只是“不知道”如何做到这一点。
“复制”命令可以在驱动器固件中实现。但工作不会就此完成。操作系统开发人员必须修改各种操作系统的文件系统和磁盘驱动程序以支持它,并且必须为其提供 API。并且必须修改每个操作系统的文件管理实用程序才能使用它。但今天,由于没有 SSD(或硬盘驱动器)实现板载“复制”命令,因此操作系统也不支持这样的功能。
我知道你问的是文件,但驱动器对文件一无所知。或者目录(“文件夹”),甚至分区。操作系统的文件系统和其他驱动程序实现了所有这些东西。发送到驱动器的读写命令总是以块号的形式工作。操作系统文件系统驱动程序知道每个文件由哪些块组成。不过,对于这个问题,这并不重要。驱动器不实现任何一种“复制”功能,无论是按块还是按文件。
顺便说一句,如果你好奇是在 ATA 命令集中,您可以找到免费提供的相对较新的版本规范这里。
答案2
一句话,不是。文件名是一个相当高级的概念,它们抽象出许多复杂性,使得硬件复制粘贴变得不可能。
您的示例代码或使用文件管理器都需要文件系统来操作,这是操作系统提供的服务。磁盘控制器呈现的原始磁盘只是 1 和 0 的集合。操作系统文件系统确定操作系统如何将数据写入磁盘,并在磁盘上维护各种数据结构来描述它。当应用程序打开并读取给定文件名时,操作系统“决定”要返回什么数据。在写入数据时,操作系统/文件系统会物理记录磁盘上存储给定文件名的二进制数据的位置,原始数据通常会被拆分以最佳地利用可用的未使用磁盘块(又称碎片)。
在能耗方面,我认为除了选择高效硬件(高 PSU 效率和低功率 CPU/主板)之外,您不会有太多控制权。如果您可以操作原始磁盘(即在二进制级别克隆整个磁盘 - 即文件系统及其所有内容),则可以使用硬件磁盘复制器,它可能更快,功率更低(但可能不是您想要的)。