转发: windows如何管理内存
(1)有三种方法:虚拟内存,内存映射文件,内存堆栈。
虚拟内存是将页文件加载到内存,适用于比较大的对象或结构;
内存映射文件是将磁盘上文件加载到内存,适用于大文件和单机的进程间内存共享;
堆栈就是动态的分配内存,适用于小对象的创建。
这些在windows核心编程中都描述得很详细的。
(2)当进程要读自己的虚拟地址空间中的数据时:
if(数据在物理内存中)
{
虚拟地址转换成物理地址
读数据
}
else
{
if(数据在磁盘中)
{
if(物理内存还有空闲)
{
把数据从磁盘中读到物理内存
虚拟地址转换成物理地址
读数据
}
else
{
把物理内存中某页的数据存入磁盘
把要读的数据从磁盘读到该页的物理内存中
虚拟地址转换成物理地址
读数据
}
}
else
{
报错
}
}
(3)当程序运行时需要从内存中读出这段程序的代码。
代码的位置必须在物理内存中才能被运行,由于现在的操作系统中有非常多的程序运行着,内存中不能够完全放下,所以引出了虚拟内存的概念。把哪些不常用的程序片断就放入虚拟内存,当需要用到它的时候在load入主存(物理内存)中。这个就是内存管理所要做的事。内存管理还有另外一件事需要做:计算程序片段在主存中的物理位置,以便CPU调度。
内存管理有块式管理,页式管理,锻式和锻页式管理。现在常用事锻页式管理 块式管理:把主存分为一大块、一大块的,当所需的程序片断不在主存时就分配一块主存空间,把程 序片断load入主存,就算所需的程序片度只有几个字节也只能把这一块分配给它。这样会造成很大的浪费,平均浪费了50%的内存空间,但时易于管理。
页式管理:把主存分为一页一页的,每一页的空间要比一块一块的空间小很多,显然这种方法的空间利用率要比块式管理高很多。
段式管理:把主存分为一段一段的,每一段的空间又要比一页一页的空间小很多,这种方法在空间利用率上又比页式管理高很多,但是也有另外一个缺点。一个程序片断可能会被分为几十段,这样很多时间就会被浪费在计算每一段的物理地址上(计算机最耗时间的大家都知道是I/O吧)。
锻页式管理:结合了段式管理和页式管理的优点。把主存分为若干页,每一页又分为若干段。好处就很明显,不用我多说了吧。
各种内存管理都有它自己的方法来计算出程序片断在主存中的物理地址,其实都很相似。
虚拟内存:
1)对计算机而言,物理内存的大小即主板上插着的内存条的大小;对CPU而言,的物理内存的大小即CPU上地址线可寻址的大小。
2)虚拟内存即某个程序运行时所创建的数据区,它的大小可能大于物理内存,它是一种内存管理上的抽象。
3)由于虚拟内存很可能大于物理内存,所以操作系统使用一种内存分页机制,将虚拟内存分成多个页(page),将物理内存分成多个页帧(page frame),页和页帧的大小相同。现使用的虚拟内存页将会通过页表(page table)映射到物理内存页帧上,显然实时映射的范围最大只能是物理内存的大小范围。如果现需使用的某个虚拟内存页没有处于这个映射当中,则操作系统使某个使用较少的页帧失效,并将该页帧的内容存入其他媒介当中(比如磁盘),然后在该页帧的物理内存和需要空间的虚拟内存页映射起来。
4)虚拟内存地址由页号(与页表中的页号关联)和偏移量组成。
转发: windows如何管理内存的更多相关文章
- windows内核驱动内存管理之Lookaside使用
Windows内存管理中使用了类似于容器的东西,叫做Lookaside对象,每次程序员申请内存都会从Lookaside里面申请,只有不足的时候,Lookaside才会向内存又一次申请内存空间,这样减少 ...
- 关于32位windows与4GB内存的那些事儿
参考:1 Physical Address Extensionzh.wikipedia.org/wiki/PAEen.wikipedia.org/wiki/Physical_Address_Exten ...
- ParentWindow属性及其一系列函数的作用——适合于那些不需要父控件管理内存释放的子控件
TWinControl = class(TControl) property ParentWindow: HWnd read FParentWindow write SetParentWindow; ...
- Windows任务管理器中内存使用、虚拟内存区别及与页面文件的关系
原文地址:Windows任务管理器中内存使用.虚拟内存区别及与页面文件的关系 虚拟内存(VirtualMemory)是Windows管理所有可用内存的方式.对于32位Windows系统,每个进程所用到 ...
- windows 堆管理
windows堆管理是建立在虚拟内存管理的基础之上的,每个进程都有独立的4GB的虚拟地址空间,其中有2GB的属于用户区,保存的是用户程序的数据和代码,而系统在装载程序时会将这部分内存划分为4个段从低地 ...
- windows虚拟内存管理
内存管理是操作系统非常重要的部分,处理器每一次的升级都会给内存管理方式带来巨大的变化,向早期的8086cpu的分段式管理,到后来的80x86 系列的32位cpu推出的保护模式和段页式管理.在应用程序中 ...
- Oracle DB管理内存
• 描述SGA 中的内存组件• 实施自动内存管理• 手动配置SGA 参数• 配置自动PGA 内存管理 内存管理:概览DBA 必须将内存管理视为其工作中至关重要的部分,因为:• 可用内存空间量有限• ...
- xcode 手动管理内存 的相关知识点总结
一.XCode4.2以后支持自动释放内存ARC xcode自4.2以后就支持自动释放内存了,但有时我们还是想手动管理内存,这如何处理呢. 很简单,想要取消自动释放,只要在 Build Setting ...
- 通俗易懂,android是如何管理内存的
封面来源:https://medium.com/android-news/android-performance-patterns-rescue-tips-8c1e4c7cb1f0 前言 很高兴遇见你 ...
随机推荐
- 基于Eureka的服务治理
代码地址如下:http://www.demodashi.com/demo/11927.html 一.服务的注册与发现 关系调用说明: 服务生产者启动时,向服务注册中心注册自己提供的服务 服务消费者启动 ...
- R语言读取XML数据
- php 微信自定义分享接口
<?php class JSSDK { private $appId; private $appSecret; public function __construct($appId, $appS ...
- 关于js中操作数组的一些方法
网上找的通篇看了一遍讲的很透收藏了! 转自(https://www.cnblogs.com/blogs-8888/p/6518683.html) 1.锁定数组的长度(让数组的长度变成只读). 1 2 ...
- java socket编程(一)简介
#Java TCP Ip编程 其实下面几张图片就可以解释简单解释tcp-ip协议的大体流程了. ###计算机网络,分组报文和协议 网络是一组通过通信信道相互连接的机器组成. 组与组之间通过路由器连接 ...
- Docker 容器连接
前面我们实现了通过网络端口类访问运行在 diocker 容器内的服务.下面我们来实现通过端口连接到了一个 dokcer 容器. 网络端口映射 我们创建一个python应用的容器. runoob@run ...
- Linux 安装源码软件
linux下,源码的安装一般由3个步骤组成:配置(configure).编译(make).安装(make install) 过程中用到configure --prefix --with:其中--pr ...
- 感觉还是要学点c才牛逼
2019-04-06 $gcc -o hello hello.c //-o选项用来指定输出文件的文件名. gcc *.c -o hello //使用通配符编译当前目录下的所有c文件 $ gcc - ...
- 文件扩展关联命令(assoc)
assoc 命令: // 描述: (association) --> 联想.关联 显示或修改文件扩展名关联. 如果在没有参数的情况下使用,assoc将显示所有当前文件扩展名关联的列表. // 语 ...
- 【转】async & await 的前世今生(Updated)
async 和 await 出现在C# 5.0之后,给并行编程带来了不少的方便,特别是当在MVC中的Action也变成async之后,有点开始什么都是async的味道了.但是这也给我们编程埋下了一些隐 ...