虚拟内存详解

 

内存分配

在涉及到内存分配时,我们一般都要考虑到两种内存分配方式,一种是动态内存分配,另一种是静态内存分配

静态内存分配:长度是预先定义好的,内存空间在程序编译和连接的时候就分配好了,在整个程序中也是固定不变的,如数组。
动态内存分配:动态分配则发生在程序调入和执行的时候,按所需分配内存,如链表。

静态内存分配比动态内存分配的速率要高不少,
但是静态内存分配的方式有可能会有内存剩余也就是有可能会有我们不使用的内存空间,这样就造成了内存的浪费。


变量

全局变量,  其生命周期是到整个程序结束(程序结束后自动释放内存)

                    其作用域是程序中的所有函数

局部变量 ,其生命周期是到当前函数结束(由系统自动回收内存)

                    其作用域是当前函数内部

全局静态变量, 其生命周期是到整个程序结束(程序结束后自动释放)

                          其作用域是程序中的所有函数

局部静态变量, 其生命周期是到整个程序结束(程序结束后自动释放)

                          其作用域是当前函数内部


堆栈

栈   里面一般存储的是局部变量,其生命周期是到当前函数结束(由系统自动回收内存)

                                                      其作用域是当前函数内部

堆   里面都是动态分配的内存,如果不动态释放,其生命周期是到整个程序结束(由程序员动态申请与动态释放,否则程序结束后系统自动释放)

                                                  其作用域是程序中的所有函数


32位CPU虚拟内存划分图

在此,先讲讲32位CPU虚拟内存划分图这句话吧。

什么是32位的CPU呢?就是CPU的最大寻址是32位

就是32位的地址总线,可以寻找到的最大地址为2^32(4G)

所以如果你一台CPU为32位的电脑配一个8G的内存,显然,是极大的浪费,因为CPU根本无法寻到更高位的地址。

至于32位系统意味着处理器一次能处理的最大位数

 

为什么是2的N次方,而不是其他数的N次方?

        因为计算机是采用二进制计算的。 假设一台计算机,它只有1根地址线,请问它最多能对几个存储单元寻址?答案是:2个.因为在任何2进制计算机中,所有物理元件只有 0,1两种状态。对应这个例子,我们假设已经把这唯一的一根地址线与两个存储单元a和b连上了,那么究竟怎么确定何时读a何时读b?有一个办法,当地址线上的电压是高电压时我们读a,相反是低电压时,我们读b.如此一来,一根地址线的情况下,只能对2个存储单元进行寻址 。

       依次类推,2根地址线时可以对4个存储单元进行寻址,对应的电压情况可以是:00,01,10,11;

       继续想下去,3根地址线就可以对8个存储单元进行寻址(3个1和3个0不同组合情况:111、110、100、000、101、100、001、011),4根就是16个,也就是说,当有n根地址线时,可以对2的n次方个存储单元进行寻址。

 

操作系统只是硬件和应用软件中间的一个平台。
32位操作系统针对的32位的CPU设计。
64位操作系统针对的64位的CPU设计。


那上面那图2^32(4G)是关于32位CPU的虚拟内存对吧?那按此推理,64位的虚拟空间又是多大呢?2^64 = 16T*4M 。

细思极恐,那么大的吗?

64位系统的地址空间并不是不是2^64,而一般是2^48。

因为并不需要2^64那么大的寻址空间,过大的空间只会导致资源的浪费。

64位linux一般使用48位来表示虚拟地址空间,使用40/45位来表示物理地址空间,可以通过cat /proc/cpuinfo来查看

要实现真正意义上的64位计算,光有64位的处理器是不行的,还必须得有64位的操作系统以及64位的应用软件才行,三者缺一不可,缺少其中任何一种要素都是无法实现64位计算的。

在64位处理器方面,Intel和AMD两大处理器厂商都发布了多个系列多种规格的64位处理器,其寻址能力都会有所差异。


 

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页