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

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

我刚刚安装了一个发行版,并想设置一个交换分区,以便它与休眠兼容。

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

$ grep MemTotal /proc/meminfo
MemTotal:    38740876 kB

据我所知:

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

但是,RHEL 文档此处说单位/proc/meminfo是千字节。

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

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

答案1

“千字节”和“kB”有时也用于表示二进制(1024 字节)单位。这种用法早于专用二进制“kibi-”前缀的发明,尤其是在真正的十进制单位意义不大或毫无意义的情况下。

例如,RAM 使用量始终以二进制为单位进行测量(例如,“4kB 页”是总是由于二进制数通常为 4096 字节,而非 4000 字节,因此即使实际大小是二进制,通常也会使用更熟悉的“千”或“兆”前缀。

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

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

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


util-linux 的“lsblk”和“fdisk”磁盘分区工具默认也支持二进制单位。例如,+2Gfdisk 中的 相当于。(但是,如果您出于某种原因想要十进制大小的分区,+2GiBfdisk 也会接受。)+2GB

答案2

从评论中似乎可以看出,您的印象是该单位kB表示 1000 字节,而如果您指的是 1024 字节,那么您必须写KiB

但这并不是它在计算中的用法。

kB一直意味着 1024 字节,现在仍然如此。

“kibibyte” 一词和单位符号KiB 由 IEC 于 1998 年推出善意地试图澄清k/ Kin kB/KB不是一个国际单位前缀

但实际上它们很少使用,除了硬盘容量(出于营销原因)外,您可以放心地假设kB它们意味着 1024 字节(“1 千字节”),尤其在 1998 年之前推出的软件中。

相关内容