全面介绍Windows内存管理机制
windows操作系统原理
windows操作系统原理
Windows操作系统原理是指Windows操作系统设计与实现的基本原理和机制。Windows操作系统是由微软公司开发的一种面向个人计算机的操作系统。
Windows操作系统的原理包括以下几个方面:
1. 多任务管理:Windows操作系统采用了抢占式的多任务处理机制,通过任务调度器来管理多个任务的执行。每个任务独立运行在自己的进程中,操作系统根据进程的优先级和时间片来进行任务调度。
2. 内存管理:Windows操作系统使用虚拟内存管理机制,将物理内存划分为多个页框,每个进程有自己的虚拟地址空间。操作系统通过分页机制将虚拟内存映射到物理内存中,以便实现进程间的隔离和保护。
3. 文件系统:Windows操作系统使用NTFS文件系统作为默认的文件系统。NTFS文件系统支持文件和目录的权限控制、文件压缩和加密等功能。
4. 设备管理:Windows操作系统通过设备驱动程序来管理硬件设备。每个设备驱动程序负责与特定设备的通信,并提供统一的接口供应用程序调用。
5. 网络通信:Windows操作系统支持TCP/IP协议栈,并提供了各种网络通信服务,如网络协议栈、网络接口、套接字接口等,以实现应用程序之间的网络通信。
6. 用户界面:Windows操作系统提供了图形用户界面(GUI),包括窗口管理、菜单、对话框等,使得用户可以通过鼠标、键盘等输入设备与计算机进行交互。
7. 安全性:Windows操作系统通过用户账户和权限管理来保护系统和用户数据的安全性。每个用户都有自己的账户,并且可以通过权限控制来限制对文件和系统资源的访问。
windows heapalloc和heapfree 原理
windows heapalloc和heapfree 原理
Windows的HeapAlloc和HeapFree是用于在进程的堆中分配和释放内存块的函数。堆是进程用来存储动态分配的内存的一种数据结构,每个进程都有一个独立的堆。
HeapAlloc函数通过系统调用HeapCreate来创建进程的堆,调用者指定了所需内存块的大小和一些标志。系统会根据需要从进程空间中的堆中分配出一块足够大的内存,然后把这块内存标记为已分配。如果堆没有足够的连续内存来满足请求,系统会进行相应的内存管理操作,例如从操作系统申请更多内存。
HeapFree函数用于释放已分配的内存块,调用者需要指定要释放的内存块的地址。系统会将指定的内存块标记为未分配,然后根据需要进行合并操作,以便将相邻的未分配的内存块合并成一个更大的内存块。
HeapAlloc和HeapFree的实现涉及到底层的内存管理机制,包括虚拟内存管理和物理内存管理。Windows使用虚拟内存机制来为每个进程提供一种看似连续的地址空间,而实际上这些地址可能对应于不连续的物理内存页。当HeapAlloc调用时,系统会根据虚拟内存空间的情况来选择一个合适的物理内存页来分配内存。类似地,当HeapFree调用时,系统会将释放的内存标记为未分配,并可能触发相应的内存管理操作,例如将物理内存页返回给操作系统。
总而言之,Windows的HeapAlloc和HeapFree通过调用底层的内存管理机制来实现动态分配和释放内存的功能,涉及到虚
拟内存管理和物理内存管理等复杂的操作。这些函数的具体实现细节由操作系统负责,开发者只需要使用它们来申请和释放内存块。
第7章windows的进程与内存管理
图7.5调度数据库的不同优先级就绪线程队列
第7章 Windows的进程与内存管理
贵阳学院 欧萍
2. 时间配额
3. 调度算法 4. 上下文切换
第7章 Windows的进程与内存管理
贵阳学院 欧萍
7.4 Windows的内存管理
7.4.1内存管理器 7.4.2内存管理的机制 1. 页 2. 共享内存
第7章 Windows的进程与内存管理
进程管理程序
贵阳学院 欧萍
(1)客户进程用创建原语创建进程。
(2)客户进程通过发送消息给相应的服务器进程。 (3)服务器进程调用Windows NT执行体的进程管理 程序为之创建一个Windows NT本机进程。 (4)进程创建后,进程管理程序返回一个句柄给进程 对象。 (5)环境子系统取得该句柄,生成客户应用程序所期 望的适合本环境的返回值。 (6)环境子系统调用Windows NT的进程管理程序为 已创建的新进程创建一个线程。
(2)[alg.exe] 进程文件: alg or alg.exe 进程名称: 应用层网关服务
(3)[explorer.exe] 进程文件: explorer or explorer.exe 进程名称: 程序管理
第7章 Windows的进程与内存管理
贵阳学院 欧萍
(4)[internat.exe] 进程文件: internat or internat.exe 进程名称: Input Locales
windows内存管理资料整理分享修正补充
Windows内存管理机制方面地资料整理
以下关于windows地内存管理方面地资料整理,中间有些部分是根据我个人理解写上去地,有些知识点是资料中摘录地.对于windows内存管理机制方面比较感兴趣地朋友可以看看.当然自己写地那部分内容可能存在偏差,希望不要误导大家才好.一些自己写地东西,我基本上都用红色标示一下,大家看地时候注意,仅供参考,不对文字地准确性做保证.
还有需要说明地一点就是,个人觉得对于这些底层地东西地了解可能不一定说在你地日常开发中会有非常大地帮助和作用,但是明白底层地东西我觉得至少会让你开阔视野,明白问题地本质,有地时候在遇到棘手地问题上也许也会有帮助,会让你在思考问题地角度和层面上更加地深入.b5E2RGbCAP
Intel i386 CPU 系列提供地保护模式下地虚拟内存管理机制,请记住,这只是表示特定地 CPU 架构,而不是特定地处理器版本.保护模式按照我个人地理解就是操作系统之上运行在ring3权级地应用程序是无法真正控制真正地内存,这一切都是由操作系统进行代劳,应用程序所访问到地自认为是真实内存地地址不过是操作系统地一种映射关系.这样伪造了每个应用程序独立4GB地内存空间就成为一种可能,而且由操作系统进行管理和整理内存碎片,也在一定程度上保证了操作系统自身地稳定和安全,避免应用程序地误操作导致系统崩
溃.这个是我个人从内存角度进行感受保护模式和实模式地一种区别地自我感觉,当然对于是否正确就不知道了.p1EanqFDPw
当然32位操作系统,由于是2进制地编码方式,自然最多地组合就是2地32次方,也就是刚刚好4GB地内存空间大小地寻址范围.DXDiTa9E3d
windows的内存管理机制
windows的内存管理机制
Windows的内存管理机制
在计算机系统中,内存管理是一个非常重要的方面,它负责管理计算机系统中的内存资源,确保程序能够正常运行。Windows作为一种常见的操作系统,也有自己独特的内存管理机制。
一、虚拟内存管理
Windows采用了虚拟内存管理机制,将物理内存和虚拟地址空间进行映射,使得每个进程都拥有独立的地址空间。这样可以提高内存利用率,同时也增加了系统的稳定性和安全性。
Windows的虚拟内存管理机制通过将虚拟地址空间划分为固定大小的页面,将页面映射到物理内存或磁盘上的页面文件。当程序需要访问某个虚拟地址时,系统会根据页表的映射关系将对应的页面加载到物理内存中,如果物理内存不足,系统会将不常用的页面置换到磁盘上的页面文件中。
二、内存分页
Windows将内存分为固定大小的页,一般为4KB。这样的页大小既能够满足大部分程序的内存需求,又不会造成过多的内存浪费。
内存分页的好处是可以更灵活地管理内存资源。系统可以按需分配和回收页面,提高内存利用率。同时,内存分页也增加了内存的安
全性,不同的进程之间无法直接访问对方的内存空间,避免了数据的混乱和安全风险。
三、内存保护
Windows的内存管理机制还包括内存保护机制,可以确保不同进程之间的内存空间不会相互干扰。每个进程都有自己的地址空间,内存保护机制可以防止一个进程访问其他进程的内存空间,增强了系统的稳定性和安全性。
四、内存回收
Windows的内存管理机制还包括内存回收机制,当一个进程不再需要某个页面时,系统会将该页面回收,释放给其他进程使用。内存回收可以提高内存的利用率,避免内存的浪费。
Windows:内存管理机制
Windows:内存管理机制
内存对齐
为什么要对齐:
1)平台移植性:
某些平台读取内存是以2kb,4kb为单位的。有些平台不⽀持任意地址的访问。
2)⾼效性,数据结构,应该尽可能在⾃然边界上对齐,未对齐访问会多⼏次访问。
主要跟硬件设计有关。
内存对齐的规则:
struct node{
char a;
int b;
short c;
}
默认对齐系数:⼀般为4
对齐⼤⼩:为当前变量和默认对齐系数中最⼩的那个决定。⽐如char a的对齐⼤⼩为1,int b的对齐⼤⼩为4, short c的对齐⼤⼩为2.
1)结构体变量的起始地址能够被最宽的成员变量整除。(⼀般是满⾜的,不需要特别计算)
2)结构体中每个成员的对齐⼤⼩与起始地址的差要为对齐⼤⼩的整数倍,否则在前⼀个变量后补全。
对于int b来说,只有char a后⾯补上3,那么与起始地址的差为8,才能是4的整数倍。
3)结构体的总⼤⼩要是最宽变量的⼤⼩的整数倍,否则在最后补全,只有short c后补2个字节才能满⾜这个规则。windows分配内存机制
操作系统将物理内存映射成进程的虚拟内存,并提供API(VirtualAlloc、VirtualFree)对虚拟内存进⾏管理。在virtual memory API的基础上⼜提供了Heap Memory API(HeapAlloc),C语⾔的malloc和free就是建⽴在这个基础上的。
使⽤virtual alloc分配的内存都是4KB的整数倍。
进程的虚拟地址及页
每个进程的内存都是独⽴的,虚拟的,进程间互不⼲扰的。每个进程在⾃⼰的线性的虚拟地址下跑程序。
win11虚拟内存自动管理的规则
win11虚拟内存自动管理的规则
Windows 11的虚拟内存自动管理遵循一些规则,这些规则有助于系统优化内存使用和性能。首先,Windows 11会根据系统的实际内存情况自动设置虚拟内存的初始大小和最大大小。这意味着在大多数情况下,用户不需要手动调整虚拟内存的设置。系统会根据需要动态地调整虚拟内存的大小,以满足不同程序和任务对内存的需求。
另外,Windows 11会优先选择将虚拟内存分配在系统所在的系统盘上,通常是C盘。这是因为虚拟内存的作用是扩展系统的物理内存,而系统盘通常是最快的存储设备,因此将虚拟内存放在系统盘上有助于提高系统的整体性能。
此外,Windows 11还会根据需要自动清理虚拟内存中的数据,以释放空间给其他程序或任务使用。这有助于避免虚拟内存占用过多空间而影响系统性能。
总的来说,Windows 11的虚拟内存自动管理遵循动态调整、优先选择系统盘、自动清理等规则,以确保系统能够在不同的工作负载下高效地利用虚拟内存,从而提升整体性能和稳定性。这些规则
的存在使得用户无需过多关注虚拟内存的设置和管理,系统能够根据实际情况进行自动优化,提供更好的用户体验。
Windows CE内存管理(CE5.0&CE6.0)
0xBFF00000
0xBED00000 0xBCD00000
0xA2000000
RAM SDRAM RAMIMAGE
0xA0200000
0xA0000000
虚拟内存模型(9) - CE5.0
用户空间 solt0用于映射当前正执行的进 程 solt1由XIP方式执行的DLL代 码使用 solt2~32:存放进程,每个 solt运行一个进程。其中前几 个solt通常被系统进程占用。 后31个solt(地址为0x4200 0000~0x7FFF FFFF)由所有进 程共享当进程所需地址空间超 过32M时,可申请此段空间。 solt63用于存放纯资源DLL。 大多数是动态虚拟地址映射
WinCE 6的虚拟内存模型(5)
内核空间
低1G:静态虚拟地址 0xC0000000–0xC7FF FFFF: 内核加载的(XIP) DLL 0xC8000000–0xCFFFFFFF:文 件系统的对象存储区 0xD0000000–0xDFFFFFFF:内 核模式的程序执行区。如 GWES.DLL,系统DLL,内核驱 动等。 0xE0000000–0xEFFFFFFF:同 上。除了SH4架构的CPU。 0xF0000000–0xFFFFFFFF:捕 获系统调用,包含核心数据页。
FFFF FFFF
Kernel Space
overridephysicalmemorymb 原理 -回复
overridephysicalmemorymb 原理-回复"overridephysicalmemorymb原理":探索内存管理机制
引言:
在计算机科学领域,内存管理是操作系统中至关重要的一部分。它负责将计算机的物理内存资源分配给运行中的程序,并管理它们的访问和使用。一种常见的内存管理技术是"overridephysicalmemorymb",本文将深入探讨其原理及工作方式。
第一部分:内存管理基础知识
首先,我们需要了解一些内存管理的基础概念。计算机的物理内存是指硬件中实际存在的内存空间,而虚拟内存则是一个抽象概念,它通过操作系统提供的机制将程序的虚拟地址映射到物理地址上。虚拟内存允许程序使用比物理内存更大的地址空间,并提供了更多的灵活性。
内存管理的一个重要目标是确保每个程序都能获得所需的内存资源,而不与其他程序冲突。为了实现这一点,操作系统使用了各种技术,包括
内存分页、内存分段等。
第二部分:"overridephysicalmemorymb"的定义与作用
"overridephysicalmemorymb"是一个操作系统级别的功能,它允许程序修改系统中的物理内存大小限制。在某些情况下,程序需要更多的内存资源才能正常运行,但由于操作系统的限制,它无法获得所需的内存。这时,"overridephysicalmemorymb"可以被用于临时地扩大程序的内存限制。
第三部分:"overridephysicalmemorymb"的实现方式
具体实现方式根据操作系统的不同而有所差异。在这里,我们以Windows操作系统为例。
Windows的内存管理优化
Windows的内存管理优化
在计算机操作系统中,内存是一项至关重要的资源。对于Windows
操作系统来说,内存管理优化是确保系统性能和稳定性的关键因素之一。本文将探讨Windows系统中内存管理的优化策略和技术,以提高
系统的效率和响应速度。
一、内存管理概述
内存管理是操作系统的核心功能之一,负责分配和回收系统内存资源。Windows操作系统通过虚拟内存管理,将物理内存(RAM)扩展
为逻辑内存,以满足应用程序的需要。而内存管理优化则是通过合理
配置和利用内存资源,提高系统表现和性能。
二、内存优化的基本原则
1. 合理的物理内存配置:增加物理内存可以降低对虚拟内存的依赖,提高系统的响应速度。推荐配置足够的内存以满足系统和应用程序的
需求。
2. 调整虚拟内存设置:虚拟内存是一种在硬盘上模拟的扩展内存,
可以帮助系统管理内存资源。根据实际情况,调整虚拟内存的初始大
小和最大大小,以提高系统性能。
3. 使用物理内存优化技术:Windows系统提供了多种内存优化技术,例如超线程、大页内存等。合理应用这些技术可以提高系统的表现。
三、内存管理优化策略
1. 内存分页优化:Windows使用分页机制将虚拟内存划分为固定大小的页面,以便更好地管理内存资源。通过调整分页文件的位置和大小,可以提高虚拟内存的访问速度。
2. 内存回收机制:Windows系统会自动回收不再使用的内存资源,以便给其他应用程序使用。合理配置内存回收机制可以提高系统的资源利用率。
3. 内存压缩技术:Windows 10引入了内存压缩技术,可以将不常用的内存页面压缩,减少内存占用。这种技术可以帮助系统在物理内存不足时提供更好的性能。
Windows CE 内存管理
Windows CE 内存管理
内存分配的不同类型
一个Windows CE 应用程序有许多不同的内存分配方式。在内存食物链的底端是Virtualxxx 函数,它们直接保留,提交和释放(free)虚拟内存页。接下来的是堆(heap) API。堆是系统为应用程序保留的内存区域。堆有两种风味:当应用程序启动时自动默认分配的本地堆(local heap),以及能够由程序手动创建的分离堆(separate heap)。在堆API之后是静态数据,数据块是被编译器定义好的或者由程序手动创建的。最后,我们来看栈,这是程序为函数存储变量的区域。
一个Windows CE不支持的Win32 内存API是全局堆(global heap)。全局堆API包括GlobalAlloc,GlobalFree和GlobalRealloc,将不会出现在Windows CE中(译者注:很奇怪,我在Windows CE 中仍然可以使用这几个API,并且工作正常,好像Microsoft并没有把它们完全去掉)。全局堆只是从Windows 3.x的Win16 时期继承而来。在Win32中,全部和本地的堆很类似,全局内存一个独特用法是,为剪贴板的数据分配内存,在Windows CE 中已经被本地堆替代并加上了句柄。
在Windows CE中最小化内存使用的关键是选择与内存块使用模型相匹配的恰当的内存分配策略。我将回顾一下这些内存类型然后讲述Windows CE应用程序中的最小化内存使用策略。
虚拟内存
虚拟内存是内存类型中最基础的。系统调用虚拟内存API来为其他类型内存分配内存。包括堆和栈。虚拟内存API,包括VirtualAlloc,VirtualFree和VirtualReSize函数,这些可以直接操作应用程序虚拟内存空间的虚拟内存页面。页面可以保留,提交给物理内存,或使用这些函数释放。
操作系统简介
操作系统简介
操作系统是计算机系统中的核心软件,它是管理和控制计算机硬件
资源的关键组成部分。它提供了用户与计算机系统之间的接口,同时
负责处理和分配系统资源,调度任务和管理存储等功能。本文将简要
介绍操作系统的概念、功能和分类。
一、操作系统的概念
操作系统是计算机系统中最基本的软件之一,它是在硬件和应用软
件之间进行协调的桥梁。它可以被看作是计算机系统的“管理者”,负
责对计算机资源进行管理和分配。操作系统提供了一组接口和服务,
使用户和应用程序能够方便地使用计算机系统。
二、操作系统的功能
1. 资源管理:操作系统负责管理计算机的各种硬件资源,包括处理器、内存、硬盘、输入输出设备等。它将这些资源进行统一管理,通
过调度算法和分配机制,高效地利用系统资源,满足用户的需求。
2. 进程管理:操作系统负责管理系统中的各个进程。进程是指正在
运行的程序的实例,操作系统通过调度算法为进程分配处理器时间片,控制进程的创建、执行、挂起和销毁等操作。
3. 内存管理:操作系统负责管理计算机系统的内存资源。它将物理
内存划分为若干个逻辑上的地址空间,并通过虚拟内存技术将物理内
存和磁盘空间进行交换,提供了更大的内存空间供应用程序使用。
4. 文件系统管理:操作系统负责管理计算机系统中的文件和目录。
它提供了文件的创建、读写、删除等操作,并通过文件系统组织和管
理文件,使用户能够方便地进行文件操作。
5. 设备管理:操作系统负责管理计算机系统中的各种输入输出设备,包括键盘、鼠标、打印机等。它通过设备驱动程序提供了对设备的控
制和访问接口,使用户能够方便地使用这些设备。
windows内存分配管理(转载)
windows内存分配管理(转载)
堆和栈的区别
⼀、预备知识—程序的内存分配
⼀个由C/C++编译的程序占⽤的内存分为以下⼏个部分
1、栈区(stack)— 由编译器⾃动分配释放,存放函数的参数值,局部变量的值等。其操作⽅式类似于数据结构中的栈。
2、堆区(heap) — ⼀般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配⽅式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在⼀块的,初始化的全局变量和静态变量在⼀块区域,未初始化的全局变量和未初始化的静态变量在相邻的另⼀块区域。 - 程序结束后有系统释放
4、⽂字常量区—常量字符串就是放在这⾥的。程序结束后由系统释放
5、程序代码区—存放函数体的⼆进制代码。
⼆、例⼦程序
这是⼀个前辈写的,⾮常详细
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456/0在常量区,p3在栈上。
static int c =0;全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456/0放在常量区,编译器可能会将它与p3所指向的"123456"优化成⼀个地⽅。
windows操作系统原理
windows操作系统原理
Windows操作系统是一种广泛应用于个人电脑和企业服务器的操作
系统。它的原理涉及了许多方面,包括文件管理、内存管理、进程调
度等。本文将通过对这些原理的详细讲解,帮助读者深入了解Windows操作系统的工作原理。
一、文件管理
Windows操作系统通过文件管理功能来管理计算机中的各种文件。
它使用了分层的文件系统结构,最顶层是文件夹,文件夹可以包含多
个文件和子文件夹。每个文件都有一个唯一的文件名和扩展名。Windows操作系统通过文件系统提供的API(应用程序接口),实现
了对文件的创建、读取、写入和删除等操作。此外,Windows还支持
文件的属性设置,比如文件的只读属性、隐藏属性等。
二、内存管理
内存管理是操作系统的一个重要功能,Windows通过虚拟内存管理
来实现对内存的有效利用。虚拟内存是将计算机的硬盘空间作为辅助
存储器,当物理内存不足时,可以将部分内存中的数据转移到硬盘上。Windows通过分页机制将内存划分为等大小的页,并将物理内存和虚
拟内存之间进行映射。内存中的每个页都有一个页表,用来记录该页
在物理内存或硬盘中的位置。当程序需要访问某个页时,Windows会
根据页表将其加载到物理内存或从硬盘上取出。
三、进程调度
进程是计算机中正在运行的程序的实例,进程调度是操作系统对各
个进程进行分配CPU时间的过程。Windows操作系统使用了多任务调
度的方式,即同时运行多个进程并共享CPU资源。Windows通过任务
管理器来监控和管理进程,任务管理器可以显示当前运行的进程列表,并提供了结束进程和优先级调整等功能。Windows操作系统通过时间
计算机操作系统管理 内存管理
虚拟存储管理
Belady’s 异常 Thrashing 抖动
选择
在页式虚拟存储管理系统中,采用某些页面置换算法,会出现 Belady异常现象,即进程的缺页次数会随着分配给该进程的页框个 数的增加而增加。下列算法中,可能出现Belady异常现象的是
简单存储管理
定位和重定位 程序的装入 绝对装入方式(Absolute Loading Mode)
程序中所使用的绝对地址,既可在编译或汇编时给出, 也可由程序员 直接赋予
例如:ORG 1000H
可重定位装入方式(Relocation Loading Mode)
静态 动态
简单存储管理
页目录号
wk.baidu.comXX
页号
页内偏移量
XX
XX
简单存储管理
分页和分段的主要区别
页是信息的物理单位,分页是为实现离散分配方式,提高内存的利用率。是由于系统管理的需要而 不是用户的需要
段则是信息的逻辑单位,它含有一组其意义相对完整的信息。 分段的目的是为了能更好地满足用户 的需要
页的大小固定且由系统决定,而段的长度却不固定 分页的作业地址空间是一维的,而分段的作业地址空间则是二维的
Windows CE 系统结构和功能(内存管理)
User Space
7FFF FFFF
E000 0000
Slots 33-63 Object Store and Memory-Mapped Files
C400 0000
Slot 97: NK.EXE
C200 0000
Unused
C000 0000
2 GB
User Space
4200 0000
A000 0000
虚拟内存模型
虚拟内存
一个 32-bit (4 Gigabyte) 平板式虚拟内存地址空间 提供了被保护物理内存的有效使用 内存管理单元 (MMU) “拥有” 物理内存 MMU将虚拟地址转换为物理地址 一个有效的虚拟地址必须被映射到一个物理地址 虚拟地址的静态和动态映射 在上电时,在MMU有效之前只被CPU使用
内存管理
Application
C Runtime (mallc, new…)
Logical Memory (Heap, stack) Virtual Memory Physical Memory * Storage Device
* 只在桌面Windows上存在
内存结构
物理内存
在内部或外部总线上可访问的实际的 RAM/ROM
虚拟地址
物理地址
虚拟内存模式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
全面介绍Windows内存管理机制及C++内存分配实例
文章整理: 文章来源: 网络-
-
本文背景:
在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用;根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制。
本文目的:
对Windows内存管理机制了解清楚,有效的利用C++内存函数管理和使用内存。本文内容:
本文一共有六节,由于篇幅较多,故按节发表。
1.进程地址空间
1.1地址空间
∙32|64位的系统|CPU
操作系统运行在硬件CPU上,32位操作系统运行于32位CPU 上,64位操作系统运行于64位CPU上;目前没有真正的64位CPU。
32位CPU一次只能操作32位二进制数;位数多CPU设计越复杂,软件设计越简单。
软件的进程运行于32位系统上,其寻址位也是32位,能表示的空间是232=4G,范围从0x0000 0000~0xFFFF FFFF。
∙NULL指针分区
范围:0x0000 0000~0x0000 FFFF
作用:保护内存非法访问
例子:分配内存时,如果由于某种原因分配不成功,则返回空指针0x0000 0000;当用户继续使用比如改写数据时,系统将因为发生访问违规而退出。
那么,为什么需要那么大的区域呢,一个地址值不就行了吗?我在想,是不是因为不让8或16位的程序运行于32位的系统上呢?!因为NULL分区刚好范围是16的进程空间。
∙独享用户分区
范围:0x0001 0000~0x7FFE FFFF
作用:进程只能读取或访问这个范围的虚拟地址;超越这个范围的行为都
会产生违规退出。
例子:
程序的二进制代码中所用的地址大部分将在这个范围,所有exe 和dll文件都加载到这个。每个进程将近2G的空间是独享的。
注意:如果在boot.ini上设置了/3G,这个区域的范围从2G扩大为3G:
0x0001 0000~0xBFFE FFFF。
∙共享内核分区
范围:0x8000 0000~0xFFFF FFFF
作用:这个空间是供操作系统内核代码、设备驱动程序、设备I/O高速缓存、非页面内存池的分配、进程目表和页表等。
例子:
这段地址各进程是可以共享的。
注意:如果在boot.ini上设置了/3G,这个区域的范围从2G缩小为1G:0xC000 0000~0xFFFF FFFF。
通过以上分析,可以知道,如果系统有n个进程,它所需的虚拟空间是:2G*n+2G (内核只需2G的共享空间)。
1.2地址映射
∙区域
区域指的是上述地址空间中的一片连续地址。区域的大小必须是粒度(64k) 的整数倍,不是的话系统自动处理成整数倍。不同CPU粒度大小是不一样的,大部分都是64K。
区域的状态有:空闲、私有、映射、映像。
在你的应用程序中,申请空间的过程称作保留(预订),可以用VirtualAlloc;
删除空间的过程为释放,可以用VirtualFree。
在程序里预订了地址空间以后,你还不可以存取数据,因为你还没有付钱,没有真实的RAM和它关联。
这时候的区域状态是私有;
默认情况下,区域状态是空闲;
当exe或DLL文件被映射进了进程空间后,区域状态变成映像;
当一般数据文件被映射进了进程空间后,区域状态变成映射。
∙物理存储器
Windows各系列支持的内存上限是不一样的,从2G到64G不等。理论上32位CPU,硬件上只能支持4G内存的寻址;能支持超过4G的内存只能靠其他技术来弥补。顺便提一下,Windows个人版只能支持最大2G内存,Intel使用Address Windows Extension (AWE) 技术使得寻址范围为
236=64G。当然,也得操作系统配合。
内存分配的最小单位是4K或8K,一般来说,根据CPU不同而不同,后面你可以看到可以通过系统函数得到区域粒度和页面粒度。
∙页文件
页文件是存在硬盘上的系统文件,它的大小可以在系统属性里面设置,它相当于物理内存,所以称为虚拟内存。事实上,它的大小是影响系统快慢的关键所在,如果物理内存不多的情况下。
每页的大小和上述所说内存分配的最小单位是一样的,通常是4K 或8K。
∙访问属性
物理页面的访问属性指的是对页面进行的具体操作:可读、可写、可执行。
CPU一般不支持可执行,它认为可读就是可执行。但是,操作系统提供这个可执行的权限。
PAGE_NOACCESS
PAGE_READONLY
PAGE_READWRITE
PAGE_EXECUTE
PAGE_EXECUTE_READ
PAGE_EXECUTE_READWRITE
这6个属性很好理解,第一个是拒绝所有操作,最后一个是接受收有操作;
PAGE_WRITECOPY
PAGE_EXECUTE_WRITECOPY
这两个属性在运行同一个程序的多个实例时非常有用;它使得程序可以共享代码段和数据段。一般情况下,多个进程只读或执行页面,如果要写的话,将会Copy页面到新的页面。通过映射exe文件时设置这两个属性可以达到这个目的。
PAGE_NOCACHE
PAGE_WRITECOMBINE
这两个是开发设备驱动的时候需要的。
PAGE_GUARD
当往页面写入一个字节时,应用程序会收到堆栈溢出通知,在线程堆栈时有用。
映射过程
进程地址空间的地址是虚拟地址,也就是说,当取到指令时,需要把虚拟地址转化为物理地址才能够存取数据。这个工作通过页目和页表进行。
从图中可以看出,页目大小为4K,其中每一项(32位)保存一个页表的物理地址;每个页表大小为4K,其中每一项(32位)保存一个物理页的物理地址,一共有1024个页表。利用这4K+4K*1K=4.4M的空间可以表示进程的1024*1024* (一页4K) =4G的地址空间。
进程空间中的32位地址如下:
高10位用来找到1024个页目项中的一项,取出页表的物理地址后,利用中10位来得到页表项的值,根据这个值得到物理页的地址,由于一页有4K大小,利用低12位得到单元地址,这样就可以访问这个内存单元了。
每个进程都有自己的一个页目和页表,那么,刚开始进程是怎么找到页目所在的物理页呢?答案是CPU的CR3寄存器会保存当前进程的页目物理地址。
当进程被创建时,同时需要创建页目和页表,一共需要4.4M。在进程的空间中,0xC030 0000~0xC030 0FFF是用来保存页目的4k空间。0xC000 0000~0xC03F FFFF是用来保存页表的4M空间。也就是说程序里面访问这些地址你是可以读取页目和页表的具体值的(要工作在内核方式下)。有一点我不明白的是,页表的空间包含了页目的空间!
至于说,页目和页表是保存在物理内存还是页文件中,我觉得,页目比较常用,应该在物理内存的概率大点,页表需要时再从页文件导入物理内存中。
页目项和页表项是一个32位的值,当页目项第0位为1时,表明页表已经在物理内存中;当页表项第0位为1时,表明访问的数据已经在内存中。还有很多数据是否已经被改变,是否可读写等标志。另外,当页目项第7位为1时,表明这是一个4M的页面,这值已经是物理页地址,