WinApi学习笔记-内存管理

简介: 一:进程虚拟地址空间的实现 每个进程都有一个私有的虚拟地址空间 系统将每个进程的虚拟地址空间映射到物理内存上 为了实现每个进程都有一个私有的虚拟地址空间系统为每个进程都创建了一个页目录和一组页表 每个进程的页表是独立的 而内核空间的页表是所有进程共享的 X86平台上有一个CR3寄存器,该...

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

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

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

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

每个进程的页表是独立的

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

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

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

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

二:数据共享与保护

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

四:总结

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

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

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

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

目录
相关文章
【深入理解计算机系统】int 不是整数 | float 不是实数 | 内存引用错误的例子 | 学习笔记
【深入理解计算机系统】int 不是整数 | float 不是实数 | 内存引用错误的例子 | 学习笔记
265 0
|
存储 编译器 C语言
【C++】学习笔记——内存管理
【C++】学习笔记——内存管理
133 15
|
存储 缓存 Linux
计算机操作系统学习笔记(5)——内存管理
计算机操作系统学习笔记(5)——内存管理
190 0
|
存储 程序员 编译器
c++学习笔记08 内存分区、new和delete的用法
C++内存管理的学习笔记08,介绍了内存分区的概念,包括代码区、全局区、堆区和栈区,以及如何在堆区使用`new`和`delete`进行内存分配和释放。
172 0
|
存储 C++
C primer plus 学习笔记 第12章 存储类别、链接和内存管理
C primer plus 学习笔记 第12章 存储类别、链接和内存管理
128 2
|
存储 缓存 算法
十五、Linux性能优化实战学习笔记 - Linux内存是怎么工作的
内存管理也是操作系统最核心的功能之一。内存主要用来存储系统和应用程序的指令、数据、缓存等
495 1
|
NoSQL Redis
Redis学习笔记-内存碎片对性能的影响
Redis学习笔记-内存碎片对性能的影响
217 0
|
存储 缓存 NoSQL
二十一、Linux性能优化实战学习笔记- 如何“快准狠”找到系统内存的问题?
已用内存、剩余内存、共享内存、可用内存、缓存和缓冲区的用量。
241 0
|
存储 缓存 Linux
十八、Linux性能优化实战学习笔记- 内存泄漏了,我该如何定位和处理?
当进程通过 malloc() 申请虚拟内存后,系统并不会立即为其分配物理内存,而是在首次访问时,才通过缺页异常陷入内核中分配内存.对应用程序来说,动态内存的分配和回收,是既核心又复杂的一个逻辑功能模块。管理内存的过程中,也很容易发生各种各样的“事故”.
256 0
|
存储 缓存 BI

热门文章

最新文章

下一篇
oss云网关配置