文章包含虚构内容.
正文可能会对玩桌面(Win)的初学开发者产生深刻的误导,如技术水平不高且无法分辨虚实的人请立即关闭,信了可能救不回来
(相关资料图)
---------- 正文 -----------
首先我们得理解一个概念,操作系统是由两部分组成的,我们一般将操作系统的附加内容称为第三方软件,而把其他部分称为内核(Kernel).我们通常说的内存,指的是真实内存(Real Memory,简称RM),真实内存是与物理内存(Physical Memory)区分开的概念,物理内存一般指的是存储空间(Storage),简称内部存储,比如64+4就是说总共有68g内存,这些内存通过内核调用(System Kernel Callback)分配给其他内核辅助软件和第三方软件.在Windows中,内核分为两个部分,权限也不尽相同,高权限的部分拥有Ring3权限,低权限或者无权限的部分只有Ring0权限,两个权限其实在某些方面大同小异,都可以访问物理设备,而物理设备也包括了内存,那么内存是如何分配的呢,我们看一眼HeapAlloc的伪代码:HeapAlloc是分配内存的最简单的途径,其次是RealAlloc,RealAlloc允许用户在任意位置分配内存,其扩展函数称为RealAllocEzx,而RealAllocEx允许用户指定内存的存储位置,比如RealAllocEx(0,RA_COMMIT,2048 * 2048)将在真实内存交换文件上分配1MB大小的内存
这个时候有的人可能就要抱怨了,你说这么多内存外存的,和我内存占用有什么关系?这个时候我们就引入一个新概念,SSDT(System Structure Describing Table),SSDT是内核和软件的桥梁,同时也指定了内存是如何分配的,SSDT中的19号表指向桌面堆栈(Desktop Callstack Heap),如下:
桌面堆通过内存中断和直接读写(Memory Calls and Direct Memory Access)管理并分配剩余的内存,我们在任务管理器(Task Man)中会看到他所属的三个进程,分别叫做:"系统中断","System(或者NT内核)","系统空闲进程"都是它,它允许软件通过指令sysexit或者内存中断int 80h进入Ring3查询可用内存并分配,但是此处就产生了一个问题,内存分配了并不一定会使用,使用完也无法使其再次可用于是聪明的微软工程师为了解决这一难题,和英特尔制作出了史上较为完善的自动化内存管理系统,俗称GC,GC在大部分软件中已经成为了必备选项,GC会通过int 32中断扫描内存中长时间不用的内存,我们平常看到的360 2345之类的杀毒软件推出的加速球也是强行进行GC.GC会将内存中长时间不用的数据暂时丢进交换文件,当应用程序需要时会产生一个中断,使GC从交换文件中加载数据,这也是为什么Windows电脑长时间开机不用再用的时候会卡当然这个时候聪明的小伙伴就会发现了,GC是会有无法扫描到的垃圾的,这一部分我们称为WPS(Working Private Set,中文为专用工作集),这一部分是是软件为了使自己不被回收而分配的内存,在任务管理器中可以看到,大部分软件都有这些内存,这些内存并不是软件运行所必需的,可以看到,有些软件的专用工作集是0kb.
这些专用工作集是内存占用的根本原因,GC无法有效的回收这些内存,而Windows10新增的慢速启动加剧了这一问题,慢速启动无视了AIPC(Advanced Interface of Power management and Configuration)所定义的P-state(Power State),看起来似乎是关机了,却只是休眠,GC无法有效释放占用的内存.
Windows中还有另一项内存管理机制,实现了较高延迟的访问读写和执行(Read Write Execute,内存三个基本操作),它的实现机制和x87处理器的RAII(Resource Acquisition Is Initialization)机制有关,当代码访问到不存在的内存时,x87处理器会进行一次initcall(Initialization call),此时操作系统ring3层会对内存进行初始化和清除等操作,并将其返回给x86处理器,并交给GC托管.
RAII机制在Windows中最显著的体现就是页面交换文件,与真实内存相对,页面交换文件产生的内存有时会错译为虚拟内存,但是请记住,只有ring0可以访问虚拟内存,ring3被内核设置了一个中断屏障,当用户访问虚拟内存时,会触发一次initcall,但是由于ring3权限级别限制,会触发一个SHE(Structured Handling Exception)异常,也就是我们开发者常说的访问空指针(nullptr,有时全称null pointer) 野指针(wild pointer) 或者 缓冲区溢出 (buffer overflow),错误代码为0xc000005(一般来说这种SHE异常最高字节都是0xc0),俗称访问冲突(Access crashing),它还有一个更常见的形式,0x3d8a1f5fffacb 不能为 read/write/execute,这种情况就是名为访问冲突的SHE异常.所以一般我们只称ring0可以访问的内存为真实内存.
扯了这么多高深的计算机知识,相信大家也对Windows和x86内存管理机制有所了解了
省流整理版(tl;dr)
原因
Bug11 优良屎山传统, Vista 代代传到 Bug11 , NT 内核就没大改过.(均视为 NT 6)
去你大爷的内置浏览器和CEF(Chromium Embedded Framework)
UWP(Universal Windows Platform)/WinRT(Windows RunTime) 生态和开发被 MS 自己玩坏了
优化
关闭快速启动,不用或者禁用休眠,关闭无必要的软件和系统/非系统服务
设置较大的页面交换文件
尽量使用 UWP 应用(快催更 UWP 应用)
Copyright © 2015-2022 西南消费网版权所有 备案号:皖ICP备2022009963号-8 联系邮箱:39 60 29 14 2@qq.com