WinApi学习笔记-内存管理

一:进程虚拟地址空间的实现

每个进程都有一个私有的虚拟地址空间

系统将每个进程的虚拟地址空间映射到物理内存上

为了实现每个进程都有一个私有的虚拟地址空间系统为每个进程都创建了一个页目录和一组页表

每个进程的页表是独立的

而内核空间的页表是所有进程共享的

X86平台上有一个CR3寄存器,该寄存器保存当前运行的进程的页目录地址

系统进行进程切换时,会将CR3内的地址置为将要执行的进程的页目录地址

每个进程都有一个KPROCESS结构的属性,其中包括了进程页目录地址

二:数据共享与保护

有一些进程间共享的数据,系统的可执行代码(系统DLL)等,在各个进程间都是一致的

由此可得:不同进程的虚拟内存分页可以映射为相同的物理内存分页

如果多个进程同时向一个DLL文件写入数据怎么办?

系统是通过Copy-On-Write实现数据保护的

1.进程将某个系统DLL加载入进程内存空间

2.开始对该DLL进行写操作

3.操作系统监视到写操作将要进行

4.系统将进程虚拟内存分页映射到另一个新的物理内存分页(此分页是不共享的)

5.系统将DLL的内容也映射到这个新的物理内存分页

6.在新的物理内存分页上完成写操作

这样就不会影响到其他进程访问该DLL了

三:虚拟内存布局、分工、堆和栈

虚拟内存空间分两部分,低2G由应用程序使用,高2G由系统内核使用

应用程序使用的虚拟内存空间分为 代码,数据(全局变量),系统和用户DLL的代码,各线程的栈,堆等

进程的每个线程都有自己的栈

栈与函数的调用,执行和返回  局部变量的保存相关

堆是一种可以动态分配和释放的内存

内存分配函数都是通过堆进行分配内存的

四:总结

虚拟地址空间中的数据是分页管理的

应用程序不用考虑系统中其他应用程序使用内存的情况

虚拟地址并不是物理地址空间中的地址

如果系统中没有足够的物理内存供使用,那么操作系统会将当前没有使用的内存分页调度到硬盘上保存起来,应用程序不用关心系统怎么实现调度的

时间: 2024-10-25 11:33:25

WinApi学习笔记-内存管理的相关文章

kernel学习之内存管理简介

内存是linux内核所管理的最重要的资源之一,内存管理子系统是操作系统中最重要的部分之一.对于立志从事内核开发的工程师来说,熟悉linux的内存管理系统是非常重要的.早些年的DOS是直接访问内存的,这样不同的应用程序很容易让系统死机.在现在的linux系统,应用程序会产生一个trap,进入内核,这时内核是安全的.虚拟内存可以使应用程序使用连续.比实际内存更大的内存空间,这些内存空间在物理上可能是离散的,甚至可能是交换到磁盘上的.可以 这么说现代操作系统的内存管理就是虚拟内存的管理. 一.存储器地

Python深入学习之内存管理_python

语言的内存管理是语言设计的一个重要方面.它是决定语言性能的重要因素.无论是C语言的手工管理,还是Java的垃圾回收,都成为语言最重要的特征.这里以Python语言为例子,说明一门动态类型的.面向对象的语言的内存管理方式.  对象的内存使用 赋值语句是语言最常见的功能了.但即使是最简单的赋值语句,也可以很有内涵.Python的赋值语句就很值得研究. a = 1 整数1为一个对象.而a是一个引用.利用赋值语句,引用a指向对象1.Python是动态类型的语言(参考动态类型),对象与引用分离.Pytho

WinApi学习笔记-第一次离内存这么近

  Code#include <windows.h>#include <stdio.h>#include <iostream>using namespace std; //参数1堆句柄,参数2内存地址指针DWORD PrintHeapSize(HANDLE hHeap,LPVOID lpMem){    SIZE_T dwHeapSize;    dwHeapSize = HeapSize(hHeap,HEAP_NO_SERIALIZE,lpMem);    if(dw

WinApi学习笔记-简单的数据类型

#include <windows.h> #include <stdio.h> int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { LPSTR szString = "Windows data type string"; CHAR lpString[120]; DWORD dwMax = 0xFFFFFFFF; DWORD dwOne

WinApi学习笔记-分配和释放虚拟内存

Code#include <windows.h>#include <stdio.h>#include <iostream> using namespace std; int main(void){    SIZE_T sizeVirtual = 4000;//大小    LPVOID lpRound = (LPVOID)0x100000FF;//地址    MEMORY_BASIC_INFORMATION mbi;//内存信息     //分配内存    //MEM_C

WinApi学习笔记-创建进程

#include <windows.h> #include <stdio.h> #include <iostream> DWORD CreateChildProcess(LPSTR szChildProcessCmd); int main() { CreateChildProcess("Child.exe"); } DWORD CreateChildProcess(LPSTR szChildProcessCmd) { //启动信息结构变量 START

WinApi学习笔记-HellowWorld

在vs2008中新建一个VC++的空项目在解决方案资源管理器,源文件文件夹中添加一个CPP文件在此文件中输入以下代码 #include <windows.h> int WinMain( HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nCmdShow ) { MessageBox(NULL,TEXT("HELLOW WORLD"),TEXT("XLAND"),MB_OK)

WinApi学习笔记-读写文件

读文件 #include <windows.h> #include <stdio.h> #include <iostream> DWORD MyReadFile(LPSTR filePath) { HANDLE hFileRead; LARGE_INTEGER liFileSize; DWORD dwReadSize; LONGLONG liTotalRead = 0; BYTE lpFileDataBuffer[32]; hFileRead = CreateFile(

c++内存管理学习纲要

本系列文章,主要是学习c++内存管理这一块的学习笔记. 时间:6.7-21 之下以技术内幕的开头语,带入到学习C++内存管理的技术中吧: 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,因此要想成为C++高手,内存管理一关是必须要过的! 笔记汇总: 1.C++内存管理学习笔记(1) 2.C++内存管理学习笔记(2) 3.C++内存管理学习笔记(3) 4.C++内存管理学习笔记(4) 5.C++内存管理学习笔记(5) 6.C++内存管理学习笔记(6) 7.C++内存管理学习笔记(7