操作系统之内存管理
1 基础知识
运行一个C++程序,要经历两个步骤:编辑代码 + run。
#include <iostream>
using namespace std;
int main()
{
cout << "hello world!\n";
return 0;
}
但这个run又可以分为如下几个步骤:
1)预编译:将头文件加载进来。
2)正式编译:生成汇编文件。
3)汇编:生成目标文件。
4)链接:将多个目标文件进行链接,生成可执行文件。
5)执行:在没执行程序前,程序还是存放在外存中;当执行后,程序被加载至内存中,形成一个运行中的程序,也就是进程。
2 程序在内存中的存储方式
一个程序在内存中是分区存放的,内存中主要有四个区:代码区、全局区、堆区、栈区。
全局区:放置全局变量。
栈区:存放局部变量,另外在发生函数调用或中断时,也会把一些现场信息压入栈中,执行完后,又会将栈中的现场信息弹出来,称为恢复现场。
堆区:当使用malloc或new动态分配内存时,就会在堆区动态开辟空间,该空间由程序员通过free或delete来释放。
代码区:用来放置代码指令。
我的疑问:
如下代码所示,'+'指令放在代码区,变量a、b放在栈区是这样的吗?
一条语句可能会被拆分放在不同的内存区域吗?
那将来执行代码时,光凭一个‘+’如何找到a与b呢?
而这就要引出不同的寻址方式吗?
int a = 2, b = 3;
int c = a + b;
3 段与页的概念
段存储:以程序为单位,往内存里存储。
段存储的话,不用考虑物理地址的变化,只用考虑虚拟地址即可;但缺点是效率低下,有时需要将整个程序进行内存与外存之间的搬移。
页存储:将内存划分为页,以页作为存储的最小单位,常见页的大小为4KB。
4疑问
1)Windows 7 操作系统有20多个G,为什么能在2G或4G内存里运行?
是因为操作系统内核并没有这么大?
还是用什么加载什么?
参考
Linux进程的五个段(数据段、代码段、bss、堆栈段)
https://blog.csdn.net/koozxcv/article/details/49533731
内存的分段和分页
https://blog.csdn.net/guanghui92luo/article/details/79044378