操作系统之内存管理

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

posted on 2020-07-23 17:04  辉哥54110  阅读(168)  评论(0编辑  收藏  举报