`

内存管理2

阅读更多

 

 

转自:http://www.cnblogs.com/del/archive/2008/05/06/1185170.html

 

 

系统给程序的地址数是 4G, 为什么不是 3G 或 5G? 因为 32 位的指针的最大值就是 $FFFFFFFF, 它不能表示更多了, 究其根源这要回到 CPU 的寻址能力、地址总线等等.

在 Win64 下, 系统给程序的地址数达到了 16EB(0 - $FFFFFFFFFFFFFFFF), 也就是 18446744073709551616 个. 不过 Win64 还没有普及, 我们还得回到实际的 Win32.

就这 4G 的地址, 系统还要留下一半($80000000 - $FFFFFFFF, 这 2G 是各进程共享的)用作宏观管理; 只给程序 2G(0 - $7FFFFFFF).
就这 2G 的地址, 也不是全给用户的, 低端的 0 - $FFFF 是用于空指针分配, 禁止访问; 高端的 $7FFF0000 - $7FFFFFFF 也留出来作为进程的临界区, 也禁止访问. 其实进程的私有空间地址只有 $10000 - $FFEFFFF.

上面这个结果, 我们可以通过 GetSystemInfo 函数得到证实, 通过 GetSystemInfo 函数能获取一个 TSystemInfo 结构, 结构中的 lpMinimumApplicationAddress 和 lpMaximumApplicationAddress 分别表示程序(或动态链接库)可以访问的最低与最高的内存地址.


var
  si: TSystemInfo;
begin
  GetSystemInfo(si);
  ShowMessageFmt('%p-%p', [si.lpMinimumApplicationAddress, si.lpMaximumApplicationAddress]);
  {结果是: 00010000-7FFEFFFF}
end;

通过 GetSystemInfo 还能得到一个内存相关的重要参数: 页大小(PageSize)


var
  si: TSystemInfo;
begin
  GetSystemInfo(si);
  ShowMessage(IntToStr(si.dwPageSize)); {4096; 4096 字节也就是 4K}
end;

PageSize 是系统管理内存的基本单位, 之所以需要用 GetSystemInfo 获取不同系统的 PageSize 也会有区别.

我们需要知道的是, 用 VirtualAlloc 函数分配的内存就是以 PageSize(4K) 为最小单位的; 假如我们用 VirtualAlloc 给一个整数(4个字节)分配内存, 将会浪费 4092 个字节, 也就是说 VirtualAlloc 不适合分配小内存, 因而也有了多种分配内存的函数.



暂时放下这个话题, 先了解一下 "栈".

说到 "栈", 就想到 "堆", 还有 "堆栈" 指的也是 "栈"; "栈" 与 "堆" 都是程序可操作的内存区域($10000 - $FFEFFFF)中的某一小段.

系统函数中有 HeapReAlloc、GlobalAlloc 等分配 "堆" 的函数, 却没有分配 "栈" 的函数, 这是因为 "栈" 是程序自动管理的; 每个程序都从自己的可用地址范围内留出一块作为 "栈", 程序根据需要可以自动调节它的大小, 但咱们可以设置它的最大值与最小值. 在Delphi 中可以从这里设置:
Project -> Options -> Linker -> [Min stack size 和 Max stack size]

"栈" 用来暂存局部变量和函数参数, 由程序在需要时申请, 用完就释放.

因为 "栈" 的空间一般不是很大, 所以咱们一般不要把局部变量弄得太大(特别是在使用数组的时候);
因为访问 "栈" 比访问 "堆" 来的简洁, 速度快, 所以要尽量多用局部变量、少用全局变量.

分享到:
评论

相关推荐

    Object-C内存管理2-对象之间的内存管理

    在Objective-C中,内存管理是程序稳定性和性能的关键因素。Objective-C使用了一种称为自动引用计数(Automatic Reference Counting,简称ARC)的机制来帮助开发者有效地管理内存。本篇文章将深入探讨对象之间的内存...

    保护模式的内存管理

    本文将深入探讨保护模式的内存管理,结合提供的两个文档《保护模式的内存管理》和《内存管理2》,我们将从以下几个方面展开讨论: 1. **保护模式的引入**:在早期的实模式下,CPU只能访问1MB的物理内存,且所有程序...

    linux内存管理-物理内存管理.pdf

    整个内存管理系统可以分为2部分来看待: 第一部分是对物理内存的管理, 第二部分是对虚拟内存的管理. 物理内存管理的对象是板载的物理内存(DDRAM), 它把物理内存按页划分, 并把这些页放到一个池子里面. 物理内存管理...

    C语言实现内存管理

    在编程世界中,C语言因其低级特性而被广泛用于系统级编程,其中包括内存管理。内存管理是程序设计中的核心部分,它涉及到如何有效地分配、使用和释放内存资源。本主题将深入探讨如何使用C语言来实现内存管理的关键...

    C#内存管理机制C#内存管理机制

    C#内存管理机制 C#内存管理机制是C#编程语言中的一种机制,旨在帮助程序员更好地管理内存资源。在C#中,程序员不需要手动管理内存,因为垃圾收集器会处理所有的内存清理工作。但是,了解C#内存管理机制仍然非常重要...

    深入理解LINUX内核(中文第三版)第八章 内存管理2

    《深入理解Linux内核》是Linux开发者和爱好者的重要参考资料,其中第八章专注于内存管理这一核心主题。本章详细探讨了Linux内核如何高效地管理内存资源,以确保系统的稳定性和性能。以下是对这一章节主要内容的深入...

    DB2内存模型

    本文旨在深入解析DB2 V8、V9 及 V9.5 版本中的内存管理机制,并重点探讨自调优内存管理器(Self-Tuning Memory Manager)的引入及其对整体性能的影响。 #### 内存从操作系统视角出发 - **物理内存 vs 虚拟内存**:...

    内存管理源代码-内存管理源代码

    这份"内存管理源代码"提供了深入理解内存管理机制的宝贵资料,对于想要自己编写操作系统或者正在改进无内存管理系统的人来说,具有很高的参考价值。 在操作系统设计中,内存管理的目标主要有三个:防止内存碎片、...

    连续动态内存管理模拟实现

    在计算机科学领域,内存管理是程序设计中的一个关键部分,特别是在高级编程语言中。动态内存管理允许程序在运行时请求和释放内存,提高了程序的灵活性。本项目关注的是连续动态内存管理,具体实现了一个基于“首次...

    glibc内存管理ptmalloc源代码分析PDF

    在分析glibc内存管理的ptmalloc源代码之前,我们需要先了解一些基础知识,包括操作系统对内存的分配和管理方法,以及glibc内存分配机制。 内存管理是操作系统的一个核心功能,它负责维护和管理计算机系统中的物理和...

    zhengweikeng#blog#内存管理2

    1. 自身内存,800k左右 2. 缓冲内存 3. 对象内存 1. 普通客户端,即我们通常执行set、get操作的那些客户端 2. slave客户端,即从节点也

    linux内存管理实验报告

    Linux内存管理是操作系统的核心组成部分,它负责有效地分配和回收内存资源,确保系统高效稳定地运行。在本实验中,我们主要探讨了Linux虚拟内存管理的原理、动态内存操作函数的使用,以及如何检测主存使用情况。 ...

    操作系统内存管理实验报告

    操作系统内存管理是计算机科学中的核心领域,特别是在Linux这样的操作系统中,理解内存的分配、管理和优化至关重要。本实验报告聚焦于在Red Hat 9环境下进行的内存管理实践,旨在深入理解内存分片、分配策略以及其对...

    操作系统内存管理实验(C语言实现)

    操作系统内存管理是计算机科学中的核心概念,它涉及如何在多任务环境下有效地分配、使用和回收内存资源。在这个“操作系统内存管理实验(C语言实现)”中,我们将深入探讨这一主题,并通过C语言编写代码来模拟和理解...

    内存管理内幕 pdf

    ### 内存管理内幕知识点详解 #### 一、引言 《内存管理内幕》是一份针对Linux程序员的技术文档,尤其适合C语言开发者。本文档详细介绍了内存管理的基础知识和技术细节,包括不同内存管理方法的选择、折衷及其实现。...

    linux内存管理源代码导读

    Linux 内存管理源代码导读 Linux 内存管理是操作系统中最重要的组件之一,它负责管理计算机的内存资源,确保系统的正确运行。在 Linux 操作系统中,内存管理是通过页框管理、Slab 算法和动态存储器管理来实现的。 ...

Global site tag (gtag.js) - Google Analytics