64KB对于磁盘IO的意义是什么?这与JavaScript相关吗?

64KB对于磁盘IO的意义是什么?这与JavaScript相关吗?,javascript,hardware,hard-drive,Javascript,Hardware,Hard Drive,我正在研究一种通过生成器读取大型平面文件的方法,即通过生成器一次读取65 536字节的“块” 由于没有CS背景,直到有人提到一个磁盘一次读取65536字节的数据,我才对此有过多的考虑 问题: 这是否适用于所有磁盘(金属磁盘和SSD) 8字节==64位。64位处理器与64位*1024字节读取大小的磁盘读取之间的关系是什么 i、 e.就光盘IO而言,64KB的意义是什么 考虑到JavaScript的高级程度,我真的可以指示生成器在仅读取一次光盘后产生字节吗?或者在我链接到的库中指定为缓冲区大小的数字

我正在研究一种通过生成器读取大型平面文件的方法,即通过生成器一次读取65 536字节的“块”

由于没有CS背景,直到有人提到一个磁盘一次读取65536字节的数据,我才对此有过多的考虑

问题:

  • 这是否适用于所有磁盘(金属磁盘和SSD)
  • 8字节==64位。64位处理器与64位*1024字节读取大小的磁盘读取之间的关系是什么
  • i、 e.就光盘IO而言,64KB的意义是什么
  • 考虑到JavaScript的高级程度,我真的可以指示生成器在仅读取一次光盘后
    产生
    字节吗?或者在我链接到的库中指定为缓冲区大小的数字是完全任意的吗

  • 虽然磁盘读取可能是对齐的,但操作系统在很大程度上使其透明;正如您提到的,您是按顺序读取的,使用的缓冲区大小无关紧要。64位和64KB对齐之间没有关系(我只听说过4K对齐)

    您可能需要创建一个2次方大小的缓冲区;只是为了更好地与内存分配器对齐。JavaScript抽象了大部分内存分配,因此当您有64K或4K缓冲区时,不必提高性能(在正常意义上,它应该足够大以减少系统调用开销)

    以您最喜欢的方式执行IO,只要它是缓冲的。如果是4K或64K,缓冲区大小并不重要(但缓冲区太小与未缓冲一样糟糕),但IO是否缓冲非常重要

    这是否适用于所有磁盘(金属磁盘和SSD)

    不,这取决于磁盘的格式化方式,大小IIRC。在当今世界,这是一个相当普遍的价值观,但较小的集群规模并不少见。它们通常是4k的倍数(在过去十年或更长时间内)。当我年轻的时候,世界还是新的,512字节是正常的。:-)64k可能足够大,即使是格式化为大集群大小的磁盘

    但是,除了磁盘分配的基本单元之外,它还有很多内容。首先,很可能存在多个级别的缓存—在磁盘驱动器的内置控制器中,在主板上的磁盘控制器中,在操作系统中。。。今天的磁盘(甚至是昨天或前天的磁盘)不是愚蠢的磁盘,我们必须尝试用代码进行微管理

    8字节==64位。64位处理器与64位*1024字节读取大小的磁盘读取之间的关系是什么

    除此之外,它们都是2的幂,我认为没有

    考虑到JavaScript的高级程度,我真的可以指示生成器在仅读取一次光盘后生成字节吗

    这不是真正的关键问题。关键问题是生成器函数(或任何函数)中的代码是否可以一次准确读取64k

    答案是肯定的,该代码确实:

    let bytesRead = fs.readSync(fd, readChunk, 0, bufferSize, position);
    
    …其中
    bufferSize
    为64k
    readSync
    是一个低级调用


    总之:64k可能足够大,甚至可以容纳磁盘中最大的最小分配单元;如果它太大了,没问题,它仍然不离谱,可以读入多个分配单元。但我希望在我认为这会产生重大影响之前,先看看精心设计的基准测试。我可以看到逻辑,但在Node的C++代码里面,在代码> RealSalc 之间的层和磁盘的实际物理读取…

    < P > 1,不,它取决于存储设备的固件、驱动控制器和操作系统上的固件。较新的硬盘使用4千字节扇区,因此这样的磁盘一次至少读取4千字节

    2-处理器的寄存器或总线大小与磁盘I/O块之间没有关系

    3-数据速率取决于数据大小和I/O延迟开销(由I/O处理引起的开销,例如系统调用处理)。较大的数据块意味着相同数据大小的I/O更少,意味着I/O开销更少


    4-从JavaScript高层的角度来看,您不需要担心这些低级行为。由于在多个级别上有许多缓存,所以一切都将正常工作。

    65536是2^16-磁盘块的大小通常为2的幂,而65536是一个适合抓取多个磁盘块的大小(每个磁盘块的大小可能为4096字节)。一般来说,像JavaScript这样的语言只是猜测有效的块大小,但这不是一个坏的猜测。谢谢@Pointy。您所说的“要调整大小的磁盘块”是什么意思?这有点离题,但我想了解更多。如何在磁盘中确定大小?这只是磁盘(以及SSD)的工作方式。驱动器和计算机之间的接口在块上运行,并且块的大小是固定的。以前,磁盘块通常为512字节(2^9),但现在4096字节(2^12)更为常见。我怀疑有人所说的磁盘每次读取64K的说法是否属实;这完全取决于操作系统和硬件。@Pointy:如今,64k很普遍。4k是“回到过去的日子”。512字节是我年轻时的时光,现在隐约记得了哇,我想我老了。我想,在2TB磁盘几乎等于一角钱一打的世界里,这是有道理的。谢谢你的回答。“低级通话”是什么意思?下面的另一个答案提到,光盘访问可能会对齐。。。这是同一条线吗?i、 e.readSync是按原样传递给操作系统的吗?@ZachSmith:基本上是这样,是的。节点尝试将I/O操作尽可能紧密地映射到等效的系统调用。