学习Java时了解了它的内存分配情况,Java将内存分为堆区,栈区和静态区。
这引起我的思考,我在学习C++时学到C++分别将内存分为了堆、栈、自由存储区、全局/静态存储区和常量存储区。
那么不同的内存分区会根据语言和内存的不同而分吗?为什么要那么分?如果分了以后,为什么堆区 栈区 静态区的效率不同?
针对第一个问题,不是,内存在物理层面上是相同的,无所谓分区,
第二个问题,我的回答是,它就是那么分的,就像为什么男人和女人有两种性别一样,或许有答案。
第三个问题,从硬件的角度来看,内存都是一样的
但是从计算机系统角度来看,就有区别了。
1.CPU会用不同的方式访问内存例如,绝对寻址,基址寻址,寄存器寻址等,不同的寻址方式访问内存的速度不一样。
2.要读的数据是否提前加载到cache中吗,对内存速度非常大。
这么干对于操作系统设计的影响。
不同进程的内存相互独立,不能互相访问,操作系统层面对内存划分了页,每个进程都有自己专有的内存页,一个进程运行时没其他进程的内存页设计为不可访问。
程序代码在运行时不应该也不能被修改,数据则可以被修改,因此代码和数据会分开放到不同的内存页中,代码页会设置成只读,防止被无意或恶意修改,二数据也是可以读写。
多个线程(进程)可以同时运行,不同的线程可以被调度切换,一个线程被切换后再切换回来可以无缝执行,因此需要把这个线程的上下文信息保存下来,这个上下文信息就是栈,二不同线程公用的内存是堆,本质是栈和堆没区别,但是栈的数据通常cache中,可以使用基址寻址,所以访问速度更快。
在语言编译层面,要划分为代码和数据,数据又分为程序运行周期一致使用的全局变量,再一个函数中使用的局部变量和会分配释放的动态数据;从另一个维度,可以分为程序运行中不会被修改的常量和会被修改的变量,编译器会尽量使用计算机系统和操作系统提供的能力经可能提高性能和安全性,因此把不同的用法分成段。