Windows 任务管理器中的几个内存概念

摘要:
我们使用的大部分PC是基于Intel微处理器的x86和x64架构计算机.因此,我们面对的windows避免不了和Intel架构有些设计上的契合.比如接下来要说到的内存管理.为简单起见,我们只讨论x86体系架构的内存管理.不考虑换页文件影响.进程的内存图1(本图摘自ref2)对于系统中的每一个进程而言,都有4GB的"内存空间".也就是每个进程都认为自己有4GB的内存可以使用.系统将每个进程的4GB地

我们使用的大部分 PC 是基于 Intel微处理器的 x86 和 x64 架构计算机.

因此, 我们面对的 windows 避免不了和 Intel 架构有些设计上的契合. 比如接下来要说到的内存管理.为简单起见, 我们只讨论 x86 体系架构的内存管理. 不考虑换页文件影响.

进程的内存


Windows 任务管理器中的几个内存概念第1张

图 1(本图摘自 ref 2)

对于系统中的每一个进程而言, 都有 4GB 的 "内存空间". 也就是每个进程都认为自己有 4GB 的内存可以使用.

系统将每个进程的 4GB 地址空间, 从逻辑上划分为两大部分:

a)蓝色的是用户空间, 此空间是被用户程序所使用的. 比如我在代码中写 "分配 100MB 内存", 其实占用的就是这一部分.

b) 红色的是内核空间, 此空间是被用作操作系统执行必要的线程切换以及从用户态函数进入内核态执行功能所保留的内存地址. 应用程序无法操作此区域.

Intel x86 体系内存管理


Intel 规定, 一个在计算机内部, 可以使用 "分页机制" 对硬件内存进行 "虚拟化". 其核心技术如下图:

Windows 任务管理器中的几个内存概念第2张

图 2(本图修改自 ref 1)

首先, 在程序中的一个地址 0x1234, 5678 被计算机的页部件(硬件)经过 1,2,3 步, 从线性地址(程序中的地址) 转变为真正机器上的物理地址(即实际内存的硬件地址). 每个线性地址都被分成 "页目录索引(PDE, 10-bit)", "页表索引(PTE, 10-bit)", "页内偏移(offset, 12-bit)" 三部分.

1) 在页目录中根据 PDE 找到页表的位置, 即通过 0x48 找到 0xa000, 0000.

2) 根据页表中的 PTE 找到页地址, 即通过 0x345 找到 0x4000, 0000.

3) 根据偏移, 在页中找到我们要的具体地址, 即已知页位于 0x4000, 0000, 我们需要存取其 0x678 偏移处的数据, 则我们所需要操作的真是物理地址就是 0x4000, 0678.

基于 x86 的 Windows 内存管理


Windows 任务管理器中的几个内存概念第3张

图 3

首先澄清两个概念:

1.一个进程中的内存有三种分类,空闲, 保留, 提交. 具体的含义可以在图 3中找到说明. 这三种类型的内存在某一时刻可能位于内存中, 也可能位于交换文件中.

2.工作集定义:The working set of a process is the set of pages in the virtual address space of the process thatare currently resident in physical memory. 即: 实际在物理内存中的大小.

结合实际系统, 以我家安装的win8.1 为例, 打开任务管理器, 可见如下:

Windows 任务管理器中的几个内存概念第4张

图 4

工作集(内存): 可以这么理解, 此值就是该进程所占用的总物理内存. 但是这个值是由两部分组成, 即'专用工作集'+'共享工作集'.

内存(专用工作集): 这对于一个进程是最重要的, 它代表了一个进程独占用了多少内存.

内存(共享工作集): 这是该进程和别的进程共享的内存量. 通常, 这是加载一个 dll 所占用的内存.

提交大小: 属于 Committed 那一类. 但是不一定在物理内存中, 有些可能位于交换文件中. 如果有一个程序, 原本占 500MB 内存, 但是绝大多数内存都不使用, 则可以通过 `EmptyWorkingSet` 向操作系统发送请求, 将此进程的不常用的内容从物理内存中换出到换页文件中保存, 如下图:

Windows 任务管理器中的几个内存概念第5张

图 5

写在最后


0. 工作集, 即在物理内存中的数据的集合.

1. 工作集 = 专用 + 共享

2. 将所有的 "工作集" 相加后的值会大于任务管理器中内存占用的百分比, 因为百分比对共享内存进行排重了.

3. "提交大小" 和 "工作集" 是两个层面的概念, 大部分活跃进程的 "工作集" 会大于 "提交大小", 而大部分非活跃的进程 "工作集" 会小于 "提交大小", 但是两者没有绝对关系.

4. 虚拟内存: 就是换页文件.

references:

1.http://www.mouseos.com/arch/paging.html

2.Pushing the Limits of Windows: Virtual Memory

免责声明:文章转载自《Windows 任务管理器中的几个内存概念》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Matlab内存不足问题的解决 .RabbitMQ用户角色及权限控制 -2下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

你知不知道 Cookie正在泄露你的隐私!

关于电脑上的Cookie,我想很多朋友都还是有所了解的,遇到诸如论坛帐号无法登录此类问题的时候,大家都知道先清除一下IE的Cookie,然后再重新登录就很有可能可以解决问题。然而,即使是最熟悉的东西也有可能变得陌生,除了浏览器的http Cookie之外,还有几种Cookie潜伏在我们的电脑中,不知道不觉中,隐私已经被泄露。   你熟悉的只是Http Co...

telnet 查看端口是否可访问

  1. 首先为什么要写这篇文章   说到为什么还得从DNS服务器说起。我在我的电脑上安装了DNS服务器,但是用网络去访问还怎么都访问都不上去。于是我就打开dos窗口,用ping命令查看是否可以ping(如 ping 125.34.49.211)通。一查能够ping通。既然可以通,那么就说明这个地址是有效的,那问题出现在那边呢,只能出现在访问的端口po...

Tomcat中JVM内存溢出及合理配置

  Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚拟机。Tomcat的内存溢出本质就是JVM内存溢出,所以在本文开始时,应该先对Java JVM有关内存方面的知识进行详细介绍。 一、Java JVM内存介绍 JVM管理两种类型的内存,堆和非堆。按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有...

Raspberry PI 树莓派 远程登录 和 远程桌面

1. 设置 ① 用网线使树莓派与电脑连接; ② 给树莓派配置一个鼠标、键盘、显示器; ③ 将树莓派的SD卡写入操作系统; ④ 开机启动树莓派,在显示器上会显示树莓派的开机启动界面; ⑤ 在terminal终端中输入sudo nano /etc/dhcpcd.conf,出现编辑文件窗口,其中输入如下配置信息: 键盘敲入Ctrl+O,Enter保存,Ctrl...

lua内存管理

本文内容基于版本:Lua5.3.0 Lua内存管理器规则 Lua允许用户自定义内存管理器,并在创建Lua虚拟机(lua_State实例)时传入。当然自定义内存管理器必须遵循Lua已定义的一些行为规则。创建一个Lua虚拟机需要使用luaL_newstate函数: lua_State *L = luaL_newstate(); luaL_newstate函数的...

Android抓包方法(转)

Android抓包方法(转) 作者:Findyou 地址:http://www.cnblogs.com/findyou/p/3491014.html 前言: 做前端测试,基本要求会抓包,会分析请求数据包,查看接口是否调用正确,数据返回是否正确,问题产生是定位根本原因等。 不管是之前做HTML5手机项目测试,还是现在的企邮app测试,经常需要抓包,做前端开...