“/proc/meminfo”中单位“kB”的真正含义是什么?

spi*_*paz 18 memory linux proc allocation-unit

我正在新安装一个发行版,并希望设置一个交换分区,以便它与休眠兼容。

首先,我必须确定系统拥有的物理内存量。

$ grep MemTotal /proc/meminfo
MemTotal:    38740876 kB
Run Code Online (Sandbox Code Playgroud)

现在据我所知:

  • 1 KiB = 1 KB = 1024 字节
  • 1 kB = 1 KB = 1000 字节

然而,RHEL 文档在这里说单位/proc/meminfo是千字节。

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/deployment_guide/s2-proc-meminfo

谁错了?该单元硬编码在 Linux 中,还是 RHEL 文档中?

use*_*686 40

“千字节”和“kB”有时也用于表示二进制(1024 字节)单位。这种用法远远早于专用二进制“kibi-”前缀的发明,特别是在真正的十进制单位几乎没有意义的情况下。

\n

例如,RAM 使用量始终以二进制单位测量(例如“4kB 页”始终为4096 字节,而不是 4000),因此通常使用更熟悉的“kilo-”或“mega-”前缀,即使实际大小为二进制。

\n

在您的情况下(我检查了创建该文件的内核代码/proc/meminfo),内核在内部根据空闲页面(通常为 4k 或 16k,但始终为 2 的幂)来计算内存,并且其函数show_val_kb()使用位移操作(其中相当于乘以 2 的幂,再次生成二进制单位)将页计数转换为千字节值:

\n
static void show_val_kb(struct seq_file *m, const char *s, unsigned long num)\n{\n        seq_put_decimal_ull_width(m, s, num << (PAGE_SHIFT - 10), 8);\n        seq_write(m, " kB\\n", 4);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

(在 x86 和 x86_64 系统上 PAGE_SHIFT 始终为 12,因此内存页的1 << 12字节数等于 1\xc3\x972 12即 4096,上述函数最终将页数乘以 2 (12\xe2\x88\x9210 )然后将其显示为“kB”。)

\n
\n

util-linux 中的“lsblk”和“fdisk”磁盘分区工具默认也可以使用二进制单元。例如,+2G在 fdisk 中相当于+2GiB. (但是,+2GB如果您出于某种原因想要十进制大小的分区,fdisk 也接受。)

\n

  • @FreeMan 自 1792 年以来,前缀 kilo(或 k)就表示 1000。它与 kB 表示 1000 字节的公制系统一致。在计算中使用 2 的幂单位更有用,但不称为千字节可能更明智。归根结底,这些问题早在硬盘制造商之前就已经出现了,而且与欺骗无关。 (8认同)
  • 基本上,Linux 内核(以及它所基于的 Unix 内核)_远远_早于硬盘驱动器制造商发明基于 1000 的测量系统,用于以比实际容量更高的_表观_容量销售硬盘驱动器。因此,内核以实际 kB 为单位进行报告。 (3认同)
  • 澄清一下,“- 10”相当于右移 10 位,相当于除以 2^10,即 1024。所以结果确实以千字节 (KiB) 为单位。 (2认同)

And*_*eKR 11

从评论中看来,您的印象是该单位kB表示 1000 字节,如果您的意思是 1024 字节,则必须编写KiB.

但这并不是它在计算中的使用方式。

kB一直意味着 1024 字节,而且几乎仍然如此。

“kibibyte”一词和单位符号KiB 是 IEC 于 1998 年引入的,目的是为了澄清 /kKkB/KB不是SI 前缀

然而在实践中,这些很少被使用,除了硬盘容量(出于营销原因)之外,您可以安全地假设kB为 1024 字节(“1 KB”),特别是在 1998 年之前推出的软件中。

  • @Nayuki 这不是计算机制造商——该领域的普通从业者早在存储制造商关心之前就使用千字节一词来表示 1024。此外,存储制造商通常更喜欢千字节 = 1000 的定义,因为他们可以交付更少,但要求更多。老实说,歧义不是问题,因为如果你处于歧义成为问题的位置,那么你也知道歧义的存在,并且你需要小心它。 (9认同)
  • 让 k-/kilo- 根据上下文改变其含义是非常糟糕的。一个多世纪前,国际单位制 (SI) 将公斤定义为 1000;计算机制造商滥用了这个定义来表示 1024,因为它“足够接近”。请停止延续 kB 意味着 1024 字节的神话,因为它是有害的。 (4认同)
  • 特别是,proc文件系统中的`kB`至少可以追溯到[Linux 2.0.1](https://github.com/kalamangga-net/linux-2.0/blob/9b96c06c0bc4fb57cee3935a7a812bc3fb025a70/fs/proc/array。 c#L289),大约 1996 年,远早于“KiB”标准化。现在,它实际上是 ABI 的一部分,并且在不破坏可能执行“scanf("MemTotal: %ld kB")”的旧程序的情况下无法对其进行更改。所以无论它是否“错误”,在这个特定的上下文中它肯定是 1024 并且永远都是。 (4认同)
  • @mulaz是的,但数据速率/速度几乎总是以每秒x位来衡量,用小b而不是大写B表示,以Mbps/Gbps/kbps表示。 (2认同)