linux 64位内存划分,linux 64位内存空间大小?(linux 64 bits memory space size? [closed])

linux 64位内存空间大小?(linux 64 bits memory space size? [closed])

在Linux 32bit中,内核占用1GB的内存,而用户空间将占用剩余的gigs(~3) - 这与64位内核有何不同?

In Linux 32bit, the kernel occupies 1gb of memory while the userspace will occupy the remaining gigs (~3) - how does this differ to the 64bit kernels?

原文:https://stackoverflow.com/questions/21150868

更新时间:2019-10-04 14:29

最满意答案

在64位x86-64上,分割是一半到一半 - 即如果地址的第一位为0,则它​​是用户空间,如果它是1的内核空间。

从理论上讲,每个都有8个Exbibytes(1024 * 1024 TiB)。 但是现在处理器中只实现了48位 - 前16位必须全部为1或全部为0(这使得实现更便宜,因为TLB和其他组件可以节省空间)。 这为用户空间提供了'merly'128 TiB,为内核空间提供了256 TiB。 然而,将来以向后兼容的方式完全可以扩展到具有分离8/8 EiB的完整64位内核空间。

On 64-bit x86-64 the split is half to half - i.e. if first bit of address is 0 it's userspace if it is 1 it's kernel space.

In theory it's 8 Exbibytes each (1024*1024 TiB). However only 48-bits are implemented in processors now - the first 16 bits must either be all 1 or all 0 (this makes implementation cheaper as TLB and other components can save space). This gives 'merly' 128 TiB for userspace and 256 TiB for kernelspace. However the extension to full 64-bit kernel space with split 8/8 EiB is perfectly possible in future in backward compatible way.

2014-01-16

相关问答

CLR中的部分垃圾收集器没有不好的设计。 问题是为了对LOH进行碎片整理,您需要腾出空间,然后重新排序并压缩这些对象。 对于大对象,重排序可能会移动几个大对象,以获得很少的内存增益(例如,如果您有100个对象,每个对象的大小都为0.5MB,则可能需要复制并重新排序200MB内存以便压缩此内存内存空间在这个环节有一个很好的解释 64位CLR与LOH具有相同的大小阈值(因为这是基于真实世界的应用程序选择的),它不会比32位CLR更成为问题。 如果你转向.Net 4.0+,它会对LOH算法进行改进,以防

...

根据ISA(英特尔,ARM等),各种指令需要字对齐(这可能会导致它们占用更多空间),并且数字常量需要与处理器的字大小相匹配。 二进制代码充满了int常量:你的循环从零开始等等。简而言之,额外空间的可能原因是int填充和常量数据的字对齐。 根据它的编译方式,64位代码可能会使用更多内存。 数据结构也希望字对齐以便快速访问,编译器可以选择填充结构。 此外,根据编译器,一些int常量可能会更改大小。 (这就是为什么你总是看到像uint32那样的typdefs:保证大小。) 最后但同样重要的是,指针占用了

...

那么MIPS64 32位计算还是64位计算? MIPS64是64位计算 。 寄存器大小为64位宽。 本机CPU字计算是64位。 Mips64和Mips32都使用32位指令编码。 这仅适用于指令列表。 MIPS64内存架构的地址长度是多少? MIPS64地址长度为64位 。 我不知道寄存器长度和可寻址存储空间之间是否存在关系。 是的,存在关系,因为存储器访问通过寄存器中的字指针值被索引/偏移。 如在0($ 2),8($ 2)等IN Mips32中,寄存器为32位,因此存储空间为32位。 在MIPS6

...

听起来你错过了正确的shmat()声明,所以编译器假设它返回int 。 确保你有 #include

在你的包括。 It sounds like you're missing the correct declaration of shmat(), so the compiler is assuming it returns int. Make sure you have #include

in your includes.

首先,您使用MIPS标记了问题,但询问一般性问题。 MIPS中64位应用程序的布局与其他64位体系结构不同。 但布局是事物在内存中的排列方式,而不是像你说的那样。 这些段只是内存“区域”,几乎所有架构都在其可执行文件中包含这些段 64位架构不仅仅是可寻址存储器的“扩展范围”,而且还提供了新的指令集。 由于某些旧指令不适用于64位数据,因此必须创建新指令才能处理。 关于指令,MIPS 64位仍然使用32位指令。 如果它扩展到64位那么它在添加的32位中包含什么,而另一个32位已经足够(如果不是多余的

...

大多数64位编程环境使用“LP64”模型,这意味着只有指针和long int变量(如果您是C / C ++程序员)是64位。 整数( int s)保持32位,除非您处于“ILP64”模式,这种情况非常少见。 我只提出它,因为大多数int变量没有用于size_t类似的目的 - 也就是说,它们保持在32位的舒适范围内。 对于这种性质的变量,你将永远无法分辨出差异。 如果您使用> 4GB的数据进行数字或数据繁重的工作,则无论如何您都需要64位。 如果你不是,那么你就不会注意到它们之间的区别,除非你习惯使

...

问题是17*1024*1024*1024是int类型的文字,在Windows上int是4字节宽。 您认为int在64位Windows中的宽度为8个字节是错误的。 不是。 它是4个字节宽。 显然,一个4字节的整数不能保存你想要放入的值。 您需要使用64位整数文字: 17*1024*1024*1024ull

The problem is that 17*1024*1024*1024 is a literal of type int and int is four bytes wide on Wind

...

在64位x86-64上,分割是一半到一半 - 即如果地址的第一位为0,则它是用户空间,如果它是1的内核空间。 从理论上讲,每个都有8个Exbibytes(1024 * 1024 TiB)。 但是现在处理器中只实现了48位 - 前16位必须全部为1或全部为0(这使得实现更便宜,因为TLB和其他组件可以节省空间)。 这为用户空间提供了'merly'128 TiB,为内核空间提供了256 TiB。 然而,将来以向后兼容的方式完全可以扩展到具有分离8/8 EiB的完整64位内核空间。 On 64-bit

...

你可以利用getrusage 。 但请记住,它并未在所有系统上实施。 或者通过阅读/proc/[pid]/statm 否则,请尝试其中一个(命令行选项)。 You can make use of getrusage. But keep in mind that it is not implemented on all systems. Or by reading the /proc/[pid]/statm Otherwise, try one of these (command line opti

...

这是一个复杂的问题。 首先,64位系统的理论虚拟内存空间为2 ^ 64。 但实际上,操作系统和CPU都不支持如此大的虚拟内存空间或物理RAM。 目前的x86-64 CPU(又名AMD64和Intel当前的64位芯片)实际上使用48位地址线(AMD64)和42位地址线(Intel),理论上允许256TB的物理RAM。 Linux在x86-64上允许每个进程128TB的虚拟内存空间,理论上可以支持64TB的物理RAM。 对于您的问题,在理想情况下,Linux进程可以使用的最大虚拟内存空间就是上面虚拟内

...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值