文档章节

内存管理[1]

涂孟超
 涂孟超
发布于 2014/09/26 15:31
字数 977
阅读 11
收藏 0
Windows 是多任务的操作系统, 一个任务就是一个应用(应用程序)、一个应用占一个进程; 在一个进程里面, 又可以运行多个线程(所以就有了很多"多线程编程"的话题).

对 Win32 来讲, 系统给每个进程 4GB 的地址空间:
低端 2GB($00000000 - $7FFFFFFF) 给用户支配;
高端 2GB($80000000 - $FFFFFFFF) 留给系统使用.

文件或程序要调入内存才能工作, 先看看我们的内存到底有多大吧.

在系统盘根目录下有个 pagefile.sys 文件, 这就是我们的 "虚拟内存"(虚拟内存是以文件的形式存在的).

把 pagefile.sys 叫做 "虚拟内存" 似乎不妥, 所谓的 "虚拟" 只是相对真实的物理内存(RAM)来讲的; 很多书上的 "物理内存" 指的其实是: RAM + 虚拟内存, 也就是所有可用内存.

"虚拟内存" 在有些书上也被称作 "页文件" 、"页面文件" 或 "交换文件". "虚拟内存" 的大小可以从 "控制面板" 里设置, 默认是由系统自动管理的.

使用 "虚拟内存" 是系统的机制, 不管 RAM 有多大, 也应该使用 "虚拟内存".

RAM 大了, 系统就会少用 "虚拟内存", 从而提高速度; 但 RAM 也不是越大越好, 如果你真的放 4G 的内存条, 系统能够识别并使用的也就是 3G 左右, 因为 Win32 只有 4G 的管理能力(寻址能力), 当然这在 Win64 下要另当别论.

所谓系统给每个程序 4G, 是给 4G 的 "虚拟的地址表", 绝不是真实的内存, 不然一个记事本、一个计算器就得需要 8G.

这个 "虚拟的地址表" 在有些书上叫 "虚地址表"、"页映射表" 或 "虚内存地址", 也有叫 "虚拟内存地址", 很容易和 "虚拟内存" 的概念混淆.

这个 "虚拟的地址表" 上有 4G 个(4294967296 个)地址(0 - $FFFFFFFF), 虽然每个程序都有这样一个表, 但它们并不会冲突, 就因为这些地址是虚拟的, 系统在需要的时候会把它们映射成具体的真实内存的地址. 这样就阻断了一个进程对另一个进程的访问.

在 Win2000 以前的版本中, 用 GlobalAlloc 申请公用内存, 用 LocalAlloc 申请私有内存; 现在通过 "虚拟的地址表" 使用内存, 在进程中申请的内存都是私有的, 现在的 GlobalAlloc、LocalAlloc 没有区别, 都是执行同样的代码.

如果需要跨进程的公用内存空间, 需要用 "内存映射" 等手段, 这需要再专题学习.

总结概念: 物理内存、虚拟内存、虚地址表.
函数 GlobalMemoryStatus 可以获取它们的信息, 获取后放在 TMemoryStatus 结构中.
//TMemoryStatus 是 _MEMORYSTATUS 的重命名:
_MEMORYSTATUS = record
  dwLength: DWORD;        {结构长度}
  dwMemoryLoad: DWORD;    {表示已使用的内存比例的一个整数}
  dwTotalPhys: DWORD;     {物理内存总数}
  dwAvailPhys: DWORD;     {可用物理内存总数}
  dwTotalPageFile: DWORD; {虚拟内存总数}
  dwAvailPageFile: DWORD; {可用虚拟内存总数}
  dwTotalVirtual: DWORD;  {虚地址表中的地址总数}
  dwAvailVirtual: DWORD;  {虚地址表中可用的地址总数}
end;

 
 
 
 
 

 

 

  
做个小程序看看内存情况:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  m: TMemoryStatus;
const
  num = 1024 * 1024;
begin
  GlobalMemoryStatus(m);
  Memo1.Clear;
  with Memo1.Lines do begin
    Add(Format('dwLength:'        + #9 + '%d', [m.dwLength]));
    Add(Format('dwMemoryLoad:'    + #9 + '%d', [m.dwMemoryLoad]));
    Add(Format('dwTotalPhys:'     + #9 + '%d', [m.dwTotalPhys div num]));
    Add(Format('dwAvailPhys:'     + #9 + '%d', [m.dwAvailPhys div num]));
    Add(Format('dwTotalPageFile:' + #9 + '%d', [m.dwTotalPageFile div num]));
    Add(Format('dwAvailPageFile:' + #9 + '%d', [m.dwAvailPageFile div num]));
    Add(Format('dwTotalVirtual:'  + #9 + '%d', [m.dwTotalVirtual div num]));
    Add(Format('dwAvailVirtual:'  + #9 + '%d', [m.dwAvailVirtual div num]));
  end;
end;

end.

 
 
 
 
 

 

 

  
我这里的运行效果图:



我觉得内存这个话题太难了, 如有理解错误, 请一定告诉我呀!

本文转载自:http://www.cnblogs.com/del/archive/2008/05/06/1184847.html

涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
OC内存管理常见的面试题

#####面试:说一说对内存管理的理解?(原理) - 手动内存管理(MRC):1.在创建一个对象的时候系统会自动创建这个对象的引用计数并赋值为1;2.当引用计数为0的时候,对象会去调用dealloc方法来...

鹿微微鹿
2016/03/25
296
0
iOS中的内存管理(上)

下列行为都会增加一个app的内存占用: 1、创建一个OC对象; 2、定义一个变量; 3、调用一个函数或者方法。 如果app占用内存过大,系统可能会强制关闭app,造成闪退现象,影响用户体验。如何让...

傲风凌寒
2014/05/20
564
0
海思方案中地址空间的分配与使用

1、DDR内存管理说明 (1)所有DDR内存中,一部分由操作系统管理,称为OS内存;另一部分由MMZ模块管理,供媒体业务单独使用,称为MMZ内存。 (2)OS内存起始地址为0x80000000,内存大小可通过...

天糊土
2018/09/22
0
0
聊一聊内存管理(2)

在上一讲我们给大家重点介绍了什么是内存管理,让大家对内存管理有了整体的认识。简单来说就是,程序的运行需要内存,你如何管理并给这些程序分配内存。 本节我们来给大家介绍最简单的一种内...

算法与编程之美
2017/08/23
65
2
C++ 面试题~Windows内存管理的方法

//联系人:石虎 QQ:1224614774 昵称:嗡嘛呢叭咪哄 一、虚拟内存的概念 当程序运行时需要从内存中读出这段程序的代码。代码的位置必须在物理内存中才能被运行,由于现在的操作系统中有非常多的...

石虎132
2018/02/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
今天
5
0
学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
今天
8
0
VMware vSphere的两种RDM磁盘

在VMware vSphere vCenter中创建虚拟机时,可以添加一种叫RDM的磁盘。 RDM - Raw Device Mapping,原始设备映射,那么,RDM磁盘是不是就可以称作为“原始设备映射磁盘”呢?这也是一种可以热...

大别阿郎
今天
12
0
【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
16
0
Linux 内核的五大创新

在科技行业,创新这个词几乎和革命一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大...

阮鹏
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部