windows修改内存读写权限_内存去哪了

cab5b2c953a7ac57aa3a020e5f592215.png

刚才回答了个问题,觉得回答不太完整,就写篇文章详细阐述下自己的想法。

win10内存的利用规律是什么,为什么有些时候会自己回收内存?​www.zhihu.com

内存买来就是拿来用的,所以内存被占满了,肯定是数据干的。那么具体是什么数据呢?


我们先来给数据划分几种类型

1.有用数据,就是程序主动申请起来的数据。

2.缓存数据,就是操作系统把文件读到内存里,当你访问文件的时候直接读内存就行了。

先声明,缓存数据不是“无用”数据,有用数据也不是随时随刻都“有用”。

然后我们要给数据存放的地点也划分一下:

1.物理内存,就是你买的内存条。容量是定死的。

2.页面文件,就是你的机械硬盘/固态硬盘。容量可变,但也有上限。

数据和地点是正交的,即有用数据可能在物理内存上,也可能在页面文件上。但缓存数据一般只可能在物理内存上。

最后我们还要明确几个概念:

1.虚拟内存和页面文件

虚拟内存不等于页面文件虚拟内存是无时无刻都存在的,你的chrome和qq都可能会申请到0xabadcafe的内存空间,但却不会互相影响,这就是因为虚拟内存的存在。虚拟内存是和物理内存相对应的。

你可以想象一下手机上的沙箱,两个程序互相看不到彼此的文件。但他们又都真实地存在手机的NAND上。

虚拟内存还有个好处就是4G的物理内存我可以假装给你16G的虚拟内存,至于凭空多出的12G哪来的?这个不能像央行印钞票一样产生出来,那就得放在页面文件上。

2.速度

内存>固态硬盘>机械硬盘,每一级之间的差距都是几十倍。

此外内存的随机读写/持续读写速度差异不大,硬盘上则持续读写通常远高于随机读写。

3.内存和硬盘

内存是易失性储存器,硬盘是非易失性储存器。换句话说,断电了内存上东西就没了,硬盘上还有。所以大多数数据最终都要在硬盘上。

好了,可以开始正式讨论了。


Q:物理内存里放了什么?

A:物理内存上的有用数据+物理内存上的缓存数据

Q:windows的任务管理器里内存使用百分比是什么?

A:物理内存上的有用数据/物理内存,其实也就是物理内存上有用数据的百分比。

Q:linux/macos/ios上内存使用百分比是什么?

A:我好久没用了,但如果你看到常年接近100%的话,就是(物理内存上的有用数据+物理内存上的缓存数据)/物理内存,也就是真正的物理内存的利用率。

Q:缓存数据不算有用数据,那缓存数据有用吗?

A:有用。前面说到硬盘速度低于内存,而绝大部分数据都被持久化保持在硬盘上。

想要加快访问那部分数据怎么办?把它们搬到内存上。

可是内存掉电数据就丢了啊?那就把它们复制到内存上。

万一修改了数据呢?这就需要写回到硬盘上了。

Q:为什么任务管理器上内存占用高?

A:根据前面的说法,这意味着物理内存上有用数据比例比较高。

Q:为什么任务管理器上内存占用低?

A:根据前面的说法,这意味着物理内存上有用数据比例比较低。

Q:为什么缓存数据要那么多?

A:因为系统怎么可能准确知道你要访问什么数据嘛,换句话说这叫饱和式拷贝,缓存得越多,命中概率越大。

Q:为什么任务管理器上内存占用低?

A:看起来问题重复了,其实根据上一个解释就能有新的推断:

系统可能更喜欢缓存数据在物理内存里,而不是有用数据。

首先,程序申请的空间通常不会太大,就算很大,同一时间需要使用的也不会很大,这是往内存里放缓存数据的前提。

其次,缓存数据能提升磁盘访问的性能,这是缓存数据的意义。

然后,缓存数据一般都是未经修改的,和磁盘上内容同步,这意味着这部分数据丢了/抛弃了也没事,大不了再从磁盘上读回来。打个比方,需要打仗的时候,缓存数据能马上变成士兵(空闲空间)派上战场,而有用数据先要训练(写回或者保存到页面文件)才能变成士兵

总结:多留点缓存数据在内存,既有提升IO性能,又能更好应对后续内存申请。

Q:还有什么原因吗?

A:可能跟休眠有关?休眠文件也在硬盘上,但可以理解为是物理内存上的有用数据的备份。

换句话说,物理内存上有用数据越多,休眠文件就越大。而写入休眠文件可能比较耗时还比较耗电,文件本身还占空间……

Q:为什么任务管理器上内存占用高?

A:这也是个老问题。建立在前面“系统可能更喜欢缓存数据在物理内存里”的推论基础上,如果现实却是有用数据在物理内存上占了更大比例,那说明什么?

考虑到页面文件有上限,数据不可能无限地往页面文件堆,所以可能原因是页面文件满了塞不下了,不得不放弃缓存数据来优先保证有用数据

再考虑到有用数据虽然不是同一时刻都有用,但总还是有一大片数据是相对比较频繁被使用的。如果把他们放到页面文件上,使用时就会不断换入换出带来更巨大的开销,所以要优先保证这部分频繁使用的数据位于物理内存上,结果没想到这部分数据就把物理内存占得差不多了

总而言之,就是物理内存不太够用,系统不得不放弃自己原有的追求。

Q:任务管理器的截图怎么解释?

fb9d7f1eab7ebe3aa4b1ea83bcea9485.png

A:右上角32G,物理内存大小。

使用中15.4G,物理内存上的有用数据。已压缩4.4G,前面15.4G的一部分。

可用16.2G,约等于物理内存-物理内存上的有用数据(32-15.4~=16.2)

已提交43.3G,有用数据+缓存数据。46.5G,物理内存+页面文件。

已缓存5.7G,缓存数据。

分页缓冲池/非分页缓冲池,超纲了。

Q:资源监视器的截图怎么解释?

6aae75389ab757720f4f54aeeca0e686.png

A:正在使用16061M:物理内存上的有用数据。

可用16199M:约等于物理内存-物理内存上的有用数据(32768-16061~=16199)

可用10682M:物理内存上真正没被使用的空间

硬件保留142M:可能给核显了

已修改366M:缓存数据里被修改的部分。

备用5517M:缓存数据里没被修改的部分。

缓存5883M:缓存数据,也就是366+5517。

Q:RamMap截图怎么解释?

df296d6a948603758607129c747b7d2f.png

A:饶了我吧,您都会用这个了还看我这个小白科普干啥……


后记:这不是严谨的技术讲解,而是科普向文章……看最后RamMap的截图就知道了,页表、页面缓冲池、共享空间这种就没考虑在内了。

当然我理解的也可能有误,欢迎在评论区提出相互交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: c/c++和易语言都是常用的编程语言,可以用来编写驱动内存无痕读写的源码。 1. C/C++的驱动内存无痕读写源码: C/C++可以使用Windows提供的驱动开发工具包(Windows Driver Kit,简称WDK)编写驱动程序。在编写驱动程序时,可以使用设备驱动程序接口(Device Driver Interface,简称DDI)函数来读写内存。 首先,需要创建一个设备驱动程序,定义驱动程序的入口点,在其中初始化驱动程序,并注册读写内存的回调函数。在回调函数中,可以使用DDI函数来访问和修改内存。 2. 易语言的驱动内存无痕读写源码: 在易语言中,可以使用EasyAnti提供的驱动内存读写接口来实现驱动内存无痕读写的功能。EasyAnti是一个易语言开发的驱动内核模块,提供了一系列的读写内存函数。 首先,需要加载EasyAnti驱动模块,并进行初始化。然后,使用EasyAnti提供的读写内存函数来访问和修改内存。 无论是使用C/C++还是易语言,驱动内存无痕读写都需要特殊的权限和操作系统支持。此外,在进行驱动内存无痕读写时,需要确保程序安全可靠,避免对系统造成损害。 ### 回答2: C/C++和易语言都是编程语言,可以用来编写驱动内存无痕读写的源码。 驱动内存无痕读写是指在操作系统内核层面进行内存读写操作,不留下任何痕迹,不受应用程序或者防护软件的检测和干扰。 在C/C++中,可以使用Windows内核编程技术来实现驱动内存无痕读写。具体步骤如下: 1. 创建一个内核模式的驱动程序,可以使用Visual Studio等开发工具。 2. 在驱动程序中,使用操作系统提供的API函数来打开、读取和写入进程的内存。 3. 在驱动程序中,通过提权来获得对内核空间的访问权限。 4. 使用内核模式的I/O函数来读取和写入指定进程的内存。 在易语言中,可以使用Win32扩展库来实现驱动内存无痕读写。具体步骤如下: 1. 创建一个易语言项目,导入Win32扩展库。 2. 使用Win32扩展库提供的函数和接口,来打开、读取和写入进程的内存。 3. 通过调用Windows API函数来获得对内核空间的访问权限。 4. 使用Win32扩展库提供的函数来读取和写入指定进程的内存。 无论是使用C/C++还是易语言,实现驱动内存无痕读写都需要对操作系统内核有一定的了解,并且需要具备驱动开发和内核编程的相关知识和技能。此外,如此高级的技术也可能涉及到系统安全和法律合规性的问题,需慎重使用。 ### 回答3: C/C++和易语言都是常用的编程语言,可以用于编写驱动程序和进行内存读写操作。下面分别讨论这两种语言的驱动内存无痕读写源码实现。 对于C/C++语言来说,可以通过直接调用操作系统提供的API函数来实现驱动内存的无痕读写。例如,在Windows平台上,可以使用Windows内核编程接口(Kernel-Mode Driver Framework,简称KMDF)和Windows驱动开发包(Windows Driver Kit,简称WDK)来编写驱动程序。具体实现的步骤包括以下几个方面: 1. 首先,需要通过注册驱动程序等步骤将编写的驱动程序加载到操作系统中。 2. 然后,驱动程序使用C/C++语言编写,并通过调用API函数来获取目标进程的句柄,进而访问进程的内存。 3. 在获取目标进程的内存句柄之后,可以通过调用API函数读取或写入目标进程的内存数据。 相比之下,易语言编写驱动程序则较为简单。由于易语言的语法和开发方式相对于C/C++来说更加简洁,易于上手和理解,因此许多初学者也会选择使用易语言编写驱动程序。易语言的编程环境自带了驱动开发模块,可以直接在集成开发环境中编写驱动程序,无需独立的驱动开发包。然而,易语言编写驱动程序的功能和灵活性相对较弱,对于一些高级操作可能存在限制。 综上所述,C/C++和易语言都可以用于编写驱动程序和进行内存的无痕读写操作。相比而言,C/C++提供了更为底层、灵活和功能丰富的编程能力,适合于对性能和功能有较高要求的应用场景;而易语言则更适合初学者或对功能需求较简单的场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值