内存管理

内存管理



内存提供了一种存储信息的方式。

根据怎样使处理器能快速访问存储的数据,计算机存储设备可分为如下几类:
1)处理器寄存器
2)处理器缓存
3)RAM
4)本地磁盘存储
5)经网络连接的数据存储

有三种级别的内存管理:
1)机器级
内存由一系列的读写单元所组成。每个内存单元都是一个基于晶体管的电子组件,它存在两种可能状态。以0和1分别表示这两种可能状态。

内存单元按字节进行分组。

处理器使用总线来操纵内存。总线是连接处理器和计算机子系统的一系列连接线。
有三类总线:控制总线、地址总线、数据总线。
MAS Memory Address Space 内存地址空间

内存不仅用于存储程序指令,它还用于存储数据。
有两种方法在内存中存储多字节数据:Big-endian和Little-endian。
例如0xABCDEF12数据:
——————————————————————
方法                        24     25     26     27
——————————————————————
Big-endian             AB     CD     EF     12
——————————————————————
Little-endian          12     EF     CD     AB
——————————————————————
其存储方法取决于你所采用的硬件平台。
如采用Intel的处理器,它是以Little-endian存储的,可编程证明:
#include<stdio.h>
int main(int argc, char *argv[]){
 unsigned long value = 0xABCDEF12;
 unsigned char *arr;
 arr = (unsigned char *)&value;
 printf("%X %X %X %X/n",arr[0],arr[1],arr[2],arr[3]);
 return;
}
——————————————
输出结果:12 EF CD AB

注意:字节顺序是从一个平台到另一个平台移植代码的主要问题。

使用Big-endian的数据表示方法被称为网络顺序(Network Order)。这是因为网络协议如TCP/IP需要以Big-endian格式发送一定的信息块。

2)操作系统级
从操作系统级来看,内存有一系列连续的字节所组成。每个字节都有唯一的以0开始的整数地址,0地址表示内存的底部。

为防止应用程序的失效和内存短缺,操作系统有两种内存管理手段:segmentation(分段)和paging(分页)。

磁盘空间也经常用于模拟内存空间,即虚拟内存。

当前32位Intel处理器的内存分页有三种尺寸:4096bytes、2MB、4MB。通过系统的控制寄存器CR4的第4、5位(标志PSE和PAE)进行设置。

分段是一种设置保护的方法。分段的目的是在内存中隔离程序,使其相互不发生干扰。早期的操作系统如DOS没有提供任何保护。恶意程序很容易控制计算机运行的DOS并重新格式化硬盘。

以分段方式分割内存的区域,这些区域称为segment。一个程序至少由一个及以上的segment组成。

3)应用程序级
操作系统为应用程序分配内存,它把内存分为一个或多个segment。应用程序使用了如下几种segments:
  (1) Text segment
  (2) Data segment
  (3) Stack segment
  (4) Heap

程序有两个基本元素:指令和数据。
Text segment通常用于存储程序指令。

Data segment用于存储编译时的全局数据。Data segment的存储空间是静态的。

Stack segment用于运行时作为临时存取点。处理器使用stack来为函数参数、本地变量、函数返回值等分配临时存储空间。当函数调用时,函数参数、本地变量、函数返回值存储到Stack segment,当函数返回时,所有的内存都被释放。

Heap取决于运行时的系统调用。Heap用于运行时动态分配内存。

下表简要的比较了几种语言的内存管理设施。
——————————————————————————————————————————
语言 Data segment Stack segment Heap
——————————————————————————————————————————
COBOL-85 yes no no
ANSI C yes yes 手动回收
Java no yes 垃圾收集器
——————————————————————————————————————————

C语言,使用stack分配临时存储,包括局部变量、函数参数和函数返回值。这些变量在函数调用时存在。
Heap是一个内存区域,主要用于获取数据。与Stack不同,Heap没有push/pop操作。这使得Heap管理更为灵活,但也更为复杂。

posted on 2009-02-18 11:16  YangJin  阅读(130)  评论(0编辑  收藏  举报