C 程序在内存中的布局 [李园7舍

笔记题目比较高级,相信还有很多地方没有笔记清楚,主要是理思路类型,为具体抽象出C程序的每个部分与内存之间的关系图,也没有找到相关书籍查看到内存每个区域(静态区(代码段,只读(代码,数据),读写段),常量区,堆,栈)的具体分布及大小。路漫漫,继续进步吧。要是有本相关的书籍看看实在是好极了。

1 硬件平台

软件的运行基于操作系统,操作系统基于特定的硬件结构。

一个硬件平台包含“处理器(CPU)”、“系统内存”、“输入、输出设备”,组成每个部分的硬件结构也都比较复杂。处理器与它们的联系依靠“控制总线”、“地址总线”及“数据总线”实现。如下图所示:

只是硬件平台的一部分。

2 程序的存储

(1) 内存与其它概念的区别

主要与寄存器,硬盘等外部存储器区别。

[1] 寄存器

寄存器是为了解决访问内存数据的复杂性和耗时性而被集成在处理器内的存储单元。处理器内(以IA-32为例)包含“通用寄存器”、“段寄存器”、“指令指针寄存器”、“浮点数据寄存器”、“控制寄存器”、“调试寄存器”、“标志寄存器”。

[2]硬盘

硬盘是计算机的外部存储器,是计算机上常见的C、D、E盘。用来保存各种类型的文件(如操作系统及操作系统的安装包)。硬盘不是内存。

[3]内存

)。所以跟用户打交道的多为RAM。

ROM

由于ROM不会因为掉电而丢失其中存储的内容,内存中的ROM部分主要用来存储计算机的固定程序和数据,如BIOS。在装操作系统之前就可以开机接入BIOS界面中。由厂家往内存中的ROM部分烧录BIOS固定程序。但随着ROM的发展,依据ROM的子系列的新功能,BIOS也不是完全的不可改写,可以通过特殊方法将BIOS升级即重新向ROM中载入新版本的BIOS。

RAM

对于应用程序如对于一个C语言程序来说,通常所说的内存就是指RAM[ ROM不可更改,由厂家设定,一般不与ROM交道 ],此段内存具有随机读写的特性。当然随着时间的流逝,科学的进步,现在的高档内存条都是采用RAM的子系列。

一个存在硬盘上的可执行文件经双击后其内数据就会被载入内存中,从而使可执行文件开始运行。此时计算机一但关机后,载入到内存中的可执行文件数据就会丢失。在计算机开机后,还需要重新双击可执行文件载入各种数据到内存中从头开始运行。

CACHE

RAM由于容量大、寻址系统繁多、读写电路复杂等原因,造成了内存的工作速度大大低于CPU的工作速度,直接影响了计算机的性能。为了解决内存与CPU工作速度上的矛盾,计算机专家在CPU和内存之间增设一级容量不大、但速度很高的高速缓冲存储器(Cache)。Cache通常由静态存储器(SRAM)构成。Cache中存放常用的程序和数据,当CPU访问这些程序和数据时,首先从高速缓存中查找,如果所需程序和数据不在Cache中,,则到内存中读取数据,同时将数据写到Cache中。采用Cache可以提高系统的运行速度。

(2)程序的存储

对于应用程序执行被载入内存中时,是被载入到内存中的RAM部分。RAM由静态区和动态区组成。静态区分为只读数据区,初始化数据区,未初始化数据区。动态区分为堆(heap)和栈(stack)。可执行程序运行被载入内存中时,会将对应的部分存储到相应的内存模块中去。

[1] 静态内存区

静态内存主要用来存储“程序代码”及“数据”。

最终的可执行文件的代码部分会被存储在RAM中的某区域,存储指令的内存区域可将其称为代码段。代码段的指令由CS值存储基址,由指令指针寄存器指向下一条要取的指令。

在静态区中存储的数据主要指自动全局变量和静态变量。在C语言中,经初始化的全局变量和静态变量存储在静态区的一块区域中(将其称为数据段),未经初始化的全局变量和静态变量存储在静态区的另一块内存中(可将其称之为BSS段,BSS是英文Block Started by Symbol的简称,表示此种变量不在可执行文件中占用内存,用变量名作占位符记录此类型变量需要多少内存空间,系统将其初始化为0)。

对于静态局部变量,对局部变量加了static关键字后就改变了局部变量的存储方式。静态局部变量就不会再存储在栈上而是被存储在RAM中的静态区。

[2] 动态内存区

动态内存主要是在程序运行时且运行完分配动态内存的指令后动态内存才被分配。

对于栈来说,栈专门用来存非静态的局部变量和调用子函数时传递给子函数的实参。当非静态局部变量的生存期完后,栈内存也随之被系统回收。

对于堆来说,程序代码中有动态分配堆内存的函数(malloc/new)出现才有可能分配堆空间。并使用完堆内存后要用释放动态内存函数(free/delete)释放。即堆空间的分配和回收都是通过特定的代码实现。不管是分配还是释放环节,稍有不慎就会有内存泄露的危险。

[3] 常量区

就算是没有这个区域也可以这么看。可以将程序中突如其来的常量的存储区域称作常量区。

才会看到属于自己的那一片晴朗的天空。

C 程序在内存中的布局 [李园7舍

相关文章:

你感兴趣的文章:

标签云: