我刚刚安装了一个发行版,并想设置一个交换分区,以便它与休眠兼容。
首先,我必须确定系统具有的物理内存量。
$ grep MemTotal /proc/meminfo
MemTotal: 38740876 kB
据我所知:
- 1 KiB = 1 千字节 = 1024 字节
- 1 kB = 1 千字节 = 1000 字节
但是,RHEL 文档此处说单位/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”磁盘分区工具默认也支持二进制单位。例如,+2G
fdisk 中的 相当于。(但是,如果您出于某种原因想要十进制大小的分区,+2GiB
fdisk 也会接受。)+2GB
答案2
从评论中似乎可以看出,您的印象是该单位kB
表示 1000 字节,而如果您指的是 1024 字节,那么您必须写KiB
。
但这并不是它在计算中的用法。
kB
一直意味着 1024 字节,现在仍然如此。
“kibibyte” 一词和单位符号KiB
由 IEC 于 1998 年推出善意地试图澄清k
/ K
in kB
/KB
不是一个国际单位前缀。
但实际上它们很少使用,除了硬盘容量(出于营销原因)外,您可以放心地假设kB
它们意味着 1024 字节(“1 千字节”),尤其在 1998 年之前推出的软件中。