物理内存


Time:2023-06-01 23:56:20

关于物理内存的问题,我们总结了以下几点,给你解答:

物理内存


物理内存

一、 虚拟地址的由来

在早期的计算机中,要运行一个程序,会把这个程序全部都加载到内存,程序是直接运行到物理内存上的。也就是说,程序运行时直接访问的就是实际的物理内存地址。当计算机要运行某些程序时(运行中的程序称为进程),只要这些进程所需要的内存空间不超过计算机所拥有的物理内存空间,那么就不会出问题。由于程序都是直接访问物理内存,所以一个进程是可以随意修改别的进程的内存数据。如果某个"恶意"的进程修改了其它进程的内存数据,往往就会导致系统奔溃。这种情况对我们来说是无法容忍的,因为我们希望使用计算机的时候,任意一个任务出现问题了,不要去影响其它任务的执行。当在使用不同顺序去运行多个任务时,这些程序的运行内存地址是不确定的。假如当时的计算机物理内存空间有128MB,操作系统的运行要78MB的物理内存空间,那么就剩余50MB的物理内存空间了,此时再运行一个任务A需要30MB的物理内存空间,若要再运行一个任务B,那么任务B所要求的物理内存空间不能超过20MB,否则就会出问题,下一次先运行任务B,再运行任务A,此时它们的地址和上次是不一样的。而且在程序运行时,如果去窜改程序上运行的物理内存的数据的,轻则程序挂掉,重则计算机系统奔溃。从上面可以看到,计算机的物理内存使用率是比较低下的,而且也是不安全的,轻微的一个失误都可能导致系统的奔溃,而且某个程序在运行时,并不需要运行所有的功能,只是某一时段运行某一功能。在程序的执行过程中,也存在着大量在物理内存和硬盘之间的数据交换过程

二、分段

为了解决上述一系列问题,人们想到了一种有效的方法,增加一个程序与物理内存之间的中间层,利用一种间接的地址访问方法去访问物理内存。按照这种方法,程序中访问的内存地址不再是实际的物理内存地址,而是一个虚拟地址,然后由操作系统将这个虚拟地址映射到物理内存地址上。这样,只要操作系统处理好虚拟地址到物理内存地址的映射关系,就可以保证不同的程序最终访问的内存地址位于不同的区域,彼此不会存在地址重叠的现象,就可以达到物理内存地址被隔离的效果,进而保护计算机不会被"轻易"破坏。比如在一个32位的Windows操作系统中,当创建一个进程时,操作系统会为该进程分配一个4GB大小的虚拟进程地址空间。之所以是4GB,是因为在32位的操作系统中,一个指针长度是4字节,而4字节指针的寻址能力是从0x00000000~0xFFFFFFFF,最大值0xFFFFFFFF表示的即为4GB大小的容量。与虚拟地址空间相对的,还有一个物理地址空间,这个地址空间对应的是真实的物理内存。如果你的计算机上安装了512MB大小的内存,那么这个物理地址空间表示的范围是0x00000000~0x1FFFFFFF。当操作系统做虚拟地址到物理地址映射时,只能映射到这一范围,操作系统也只会映射到这一范围。当进程创建时,每个进程都会有一个自己的4GB虚拟地址空间。要注意的是这个4GB的地址空间是"虚拟"的,并不是真实存在的,而且每个进程只能访问自己虚拟地址空间中的数据,无法访问别的进程中的数据,通过这种方法实现了进程间的地址隔离。那是不是这4GB的虚拟地址空间应用程序可以随意使用呢?很遗憾,在Windows系统下,这个虚拟地址空间被分成了4部分:NULL指针区、用户区、隔离区和内核区。

1) NULL指针区(0x00000000~0x0000FFFF):如果进程中的一个线程试图操作这个分区中的数据,CPU就会引发非法访问。它的作用是,当调用 malloc 等内存分配函数时,如果无法找到足够的内存空间,它将返回 NULL。而不进行安全性检查。它只是假设地址分配成功,并开始访问内存地址 0x00000000(NULL)。由于禁止访问内存的这个分区,因此会发生非法访问现象,并终止这个进程的运行。

2) 用户区(0x00010000~0xBFFEFFFF):这个分区中存放进程的私有地址空间。一个进程无法以任何方式访问另外一个进程驻留在这个分区中的数据(相同exe,通过copy-on-write来完成地址隔离)。(在windows中,所有.exe和动态链接库都载入到这一区域。系统同时会把该进程可以访问的所有内存映射文件映射到这一分区)。

3) 隔离区(0xBFFF0000~0xBFFFFFFF):这个分区禁止进入。任何试图访问这个内存分区的操作都是违规的。微软保留这块分区的目的是为了简化操作系统的现实。

4) 内核区(0xC0000000~0xFFFFFFFF):这个分区存放操作系统驻留的代码。线程调度、内存管理、文件系统支持、网络支持和所有设备驱动程序代码都在这个分区加载,该分区被所有进程共享。

虚拟地址空间

由于程序的运行必须运行在真实的物理内存上,而直接操作物理内存的危险性较大,所以通过创建了一个虚拟地址空间,虚拟地址和物理地址之间存在一一映射的关系,程序运行地址和物理地址的隔离,确保不同的进程地址空间被映射到不同的人物理地址空间上去。从而解决了同一计算机相同程序运行地址不确定的问题,也解决了因程序运行时被其它程序修改物理内存数据直接导致系统奔溃的弊病。但是物理内存使用效率低下的问题依然没有得到解决。

三、分页

为了解决物理内存使用效率低下的问题,于是人们又提出了分页的办法。分页的基本方法是,将地址空间分成许多页,每页的大小由CPU决定,然后由操作系统选择执行页的多少。有些CPU页的大小为4KB,也有些CPU页的大小为4MB。假设页大小为4KB,那么4GB的虚拟内存空间共可分为4×1024×1024÷4=1048576页,如果此时计算机安装的内存条大小为512MB,那么512MB的物理内存可分为512×1024÷4=131072页,显然虚拟内存地址空间的页数要比物理内存空间的页数多得多。

在分段方法中,每次程序的运行都会被全部加载到虚拟内存中;而分页方法则不同,它是将程序的大部分存在硬盘中,此时该部分硬盘称为"交换区",而将少部分要运行的加载到虚拟内存中,通过映射在物理内存中运行,从而提高了物理内存的使用率。

物理内存与交换区

为了方便CPU高效执行管理物理内存,每一次都需要从虚拟内存中拿一个页的代码放到物理内存。虚拟内存页有三种状态,分别是未分配、已缓存和未缓存状态。

未分配:指的是未被操作系统分配或者创建的,未分配的虚拟页不存在任何数据和代码与它们关联,因此不占用磁盘资源;

已缓存:表示的是物理内存中已经为该部分分配的,存在虚拟内存和物理内存映射关系的;

未缓存:指的是已经加载到虚拟内存中的,但是未在物理内存中建立映射关系的。

四、页表

虚拟内存中的一些虚拟页是要缓存在物理内存中才能被执行的,因此操作系统存在一种机制用来判断某个虚拟页是否被缓存在物理内存中,还需要知道这个虚拟页存放在磁盘上的哪个位置,从而在物理内存中选择空闲页或者更新缓存页,并将需要的虚拟页从磁盘复制到物理内存中。这些功能是由软硬件结合完成的,他存放在物理内存中一个叫页表的数据结构中。页表的结构如下图所示:

页表实际上是一个数组。该数组存放的是一个称为页表条目(PTE)的结构。虚拟地址空间的每一个页在页表中,都有一个对应的页表条目(PTE)。虚拟页地址翻译的时候就是查询的各个虚拟页在页表中的PTE,从而进行地址翻译的。地址翻译的过程如下所示:

假设每一个PTE都有一个有效位和一个n位字段的地址。其中有效位表示对应的虚拟页是否缓存在了物理内存中。0表示未缓存。1表示已缓存。n位地址字段表示如果未缓存(有效字段为0),n位地址字段不为空的话,这个n位地址字段就表示该虚拟页在磁盘上的起始的位置。如果这个n位字段为空,那么就说明该虚拟页未分配;如果已缓存(有效字段为1),n位地址字段则不为空,它表示该虚拟页在物理内存中的起始地址。

在上图中,四个虚拟页VP1 , VP2, VP4 , VP7 是被缓存在物理内存中。 两个虚拟页VP0, VP5还未被分配。但是剩下的虚拟页VP3 ,VP6已经被分配了,但是还没有缓存到物理内存中去执行。

五、内存管理单元MMU(Memory Management Unit)

内存管理单元MMU的主要功能是虚拟地址到物理地址的转换。除此之外,它还可以实现内存保护、缓存控制、总线仲裁以及存储体切换。也就是说程序运行的过程所需要的物理内存地址都是经过一个叫内存管理单元的东西完成的,需要注意的是内存管理单元是硬件管理,而不是软件实现内存管理的。内存管理单元使每一个程序都有自己独立的虚拟地址空间,提高了物理内存的使用率,它还提供了内存保护功能,可以将特定的内存块设置为读、写或者可执行属性,可以防止被程序恶意窜改内存。它的工作流程如下所示:

六、逻辑地址、线性地址、物理地址和虚拟地址的区别

1)逻辑地址(Logical Address):是指由程序产生的和分段相关的偏移地址部分。例如,你在进行 C 语言指针编程中,能读取指针变量本身值( &操作 ),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址,不和绝对物理地址相干。只有在 Intel 实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,CPU不进行自动地址转换),逻辑地址也就是在Intel保护模式下,程序执行代码的偏移地址(假定代码段、数据段如果完全相同)。程序员开发应用程序时是需要和逻辑地址打交道,而不需要和分段和分页机制打交道,分段分页是系统编程人员要涉及的。程序员虽然能直接操作内存,那也只能在操作系统给你分配的内存段操作。

2)线性地址(Linear Address):是逻辑地址到物理地址变换之间的中间层。程序代码会产生逻辑地址,或说是段中的偏移地址,加上相应段的基地址就生成了一个线性地址。如果启用了分页机制,那么线性地址能再经变换以产生一个物理地址。若没有启用分页机制,那么线性地址直接就是物理地址。Intel 80386 的线性地址空间容量为 4G(2的32次方即32根地址总线寻址)。

3)物理地址(Physical Address):是指出目前 CPU 外部地址总线上的寻址物理内存的地址,是地址变换的最终结果地址,也就是计算机安装的内存条大小。如果启用了分页机制,那么线性地址会使用页目录和页表中的项变换成物理地址。如果没有启用分页机制,那么线性地址就直接成为物理地址了。

4)虚拟地址(Virtual Address):是指计算机呈现出要比实际拥有的内存大得多的内存量,每一个程序都用自己的虚拟内存,而且一般和物理内存大小一样。因此允许程序员编写并运行比实际系统拥有的内存大得多的程序。这使得许多大型项目也能够在具有有限内存资源的系统上实现。一个恰如其分的比喻是,你要从深圳去北京,你不必拥有一列长度像从深圳到北京距离的火车,只需要有两段比火车稍长的铁轨就能完成这个任务,在火车行驶时,只要铺铁轨的动作足够快,就可以使用两段铁轨交替铺在路上的办法使火车从深圳行驶到北京,让火车就像行驶在一条铁路上一样。这也就是虚拟内存管理需要完成的任务。在Linux 0.11内核中,给每个进程都划分了总容量为64MB的虚拟内存空间。因此程序的逻辑地址范围是0x0000000到0x4000000。有时我们也把逻辑地址称为虚拟地址。逻辑地址和物理地址的差值是0xC0000000,是由于虚拟地址->线性地址->物理地址映射正好差这个值。这个值是由操作系统指定的。逻辑地址(或称为虚拟地址)到线性地址是由CPU的分段机制自动转换的。如果没有开启分页管理,则线性地址就是物理地址。如果开启了分页管理,那么系统程序需要参和线性地址到物理地址的转换过程。具体是通过设置页目录表和页表项进行的。

物理内存是什么


物理内存是什么

说简单点,物理内存就是内存条,是独立的硬件,虚拟内存是硬盘上的一块区域,微软称为“页面文件”,是防止物理内存不足所设置的,当物理内存不够的时候就使用这块来当作内存使用,不过速度上没有物理内存速度快。
内存在计算机中的作用很大,电脑中所有运行的程序都需要经过内存来执行,如果执行的程序很大或很多,就会导致内存消耗殆尽。为了解决这个问题,Windows中运用了虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,当内存占用完时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。举一个例子来说,如果电脑只有128MB物理内存的话,当读取一个容量为200MB的文件时,就必须要用到比较大的虚拟内存,文件被内存读取之后就会先储存到虚拟内存,等待内存把文件全部储存到虚拟内存之后,跟着就会把虚拟内里储存的文件释放到原来的安装目录里了。下面,就让我们一起来看看如何对虚拟内存进行设置吧。 虚拟内存的设置 对于虚拟内存主要设置两点,即内存大小和分页位置,内存大小就是设置虚拟内存最小为多少和最大为多少;而分页位置则是设置虚拟内存应使用那个分区中的硬盘空间。对于内存大小的设置,如何得到最小值和最大值呢?你可以通过下面的方法获得:选择“开始→程序→附件→系统工具→系统监视器”(如果系统工具中没有,可以通过“添加/删除程序”中的Windows安装程序进行安装)打开系统监视器,然后选择“编辑→添加项目”,在“类型”项中选择“内存管理程序”,在右侧的列表选择“交换文件大小”。这样随着你的操作,会显示出交换文件值的波动情况,你可以把经常要使用到的程序打开,然后对它们进行使用,这时查看一下系统监视器中的表现值,由于用户每次使用电脑时的情况都不尽相同,因此,最好能够通过较长时间对交换文件进行监视来找出最符合您的交换文件的数值,这样才能保证系统性能稳定以及保持在最佳的状态。 找出最合适的范围值后,在设置虚拟内存时,用鼠标右键点击“我的电脑”,选择“属性”,弹出系统属性窗口,选择“性能”标签,点击下面“虚拟内存”按钮,弹出虚拟内存设置窗口,点击“用户自己指定虚拟内存设置”单选按钮,“硬盘”选较大剩余空间的分区,然后在“最小值”和“最大值”文本框中输入合适的范围值。如果您感觉使用系统监视器来获得最大和最小值有些麻烦的话,这里完全可以选择“让Windows管理虚拟内存设置”。 调整分页位置 Windows9x的虚拟内存分页位置,其实就是保存在C盘根目录下的一个虚拟内存文件(也称为交换文件)Win386.swp,它的存放位置可以是任何一个分区,如果系统盘C容量有限,我们可以把Win386.swp调到别的分区中,方法是在记事本中打开System.ini(C:\Windows下)文件,在[386Enh]小节中,将“PagingDrive=C:WindowsWin386.swp”,改为其他分区的路径,如将交换文件放在D:中,则改为“PagingDrive=D:Win386.swp”,如没有上述语句可以直接键入即可。 而对于使用Windows2000和WindowsXP的,可以选择“控制面板→系统→高级→性能”中的“设置→高级→更改”,打开虚拟内存设置窗口,在驱动器[卷标]中默认选择的是系统所在的分区,如果想更改到其他分区中,首先要把原先的分区设置为无分页文件,然后再选择其他分区。 或者,WinXP一般要求物理内存在256M以上。如果你喜欢玩大型3D游戏,而内存(包括显存)又不够大,系统会经常提示说虚拟内存不够,系统会自动调整(虚拟内存设置为系统管理)。 如果你的硬盘空间够大,你也可以自己设置虚拟内存,具体步骤如下:右键单击“我的电脑”→属性→高级→性能设置→高级→虚拟内存更改→选择虚拟内存(页面文件)存放的分区→自定义大小→确定最大值和最小值→设置。一般来说,虚拟内存为物理内存的1.5倍,稍大一点也可以,如果你不想虚拟内存频繁改动,可以将最大值和最小值设置为一样。 44》虚拟内存使用技巧 对于虚拟内存如何设置的问题,微软已经给我们提供了官方的解决办法,对于一般情况下,我们推荐采用如下的设置方法: (1)在Windows系统所在分区设置页面文件,文件的大小由你对系统的设置决定。具体设置方法如下:打开"我的电脑"的"属性"设置窗口,切换到"高级"选项卡,在"启动和故障恢复"窗口的"写入调试信息"栏,如果你采用的是"无",则将页面文件大小设置为2MB左右,如果采用"核心内存存储"和"完全内存存储",则将页面文件值设置得大一些,跟物理内存差不多就可以了。 小提示:对于系统分区是否设置页面文件,这里有一个矛盾:如果设置,则系统有可能会频繁读取这部分页面文件,从而加大系统盘所在磁道的负荷,但如果不设置,当系统出现蓝屏死机(特别是STOP错误)的时候,无法创建转储文件(Memory.dmp),从而无法进行程序调试和错误报告了。所以折中的办法是在系统盘设置较小的页面文件,只要够用就行了。 (2)单独建立一个空白分区,在该分区设置虚拟内存,其最小值设置为物理内存的1.5倍,最大值设置锢砟诖娴?倍,该分区专门用来存储页面文件,不要再存放其它任何文件。之所以单独划分一个分区用来设置虚拟内存,主要是基于两点考虑:其一,由于该分区上没有其它文件,这样分区不会产生磁盘碎片,这样能保证页面文件的数据读写不受磁盘碎片的干扰;其二,按照Windows对内存的管理技术,Windows会优先使用不经常访问的分区上的 页面文件,这样也减少了读取系统盘里的页面文件的机会,减轻了系统盘的压力。 (3)其它硬盘分区不设置任何页面文件。当然,如果你有多个硬盘,则可以为每个硬盘都创建一个页面文件。当信息分布在多个页面文件上时,硬盘控制器可以同时在多个硬盘上执行读取和写入操作。这样系统性能将得到提高。
简单的说,虚拟内存是从你硬盘里划出一部分作为内存。从而提高电脑的速度。 物理内存是你的内存条里的内存容量, 从理论上讲,物理内存要比虚拟内存的读写速度快50倍之多!
我给你说简单点吧,物理内存就是你的硬件内存,你硬件内存有多大你物理内存就有多大,虚拟内存就是在你硬盘上划一些空间做为内存来使用,WINDOS用的内存比较多,所以就有了虚拟内存,运用上是一样的,但虚拟内存要比物理内存慢得多~·
不是的 物理内存的作用是直接处理数据的 虚拟内存是暂存数据等待物理内存读取的 虚拟内存内存是在硬盘上设置大小 物理内存就是你的内存条的大小

物理内存使用率过高怎么办


物理内存使用率过高怎么办

物理内存使用率过高的解决方法参考如下:

工具:戴尔XPS13-93来自50-3708、win7。

1、在运行中输入msconfig,然后回车。

2、然后在系统配置窗口中点击服务,在服务的列表中将一些用不到的服务禁用掉,将需要禁用的服务前面的勾怀勾上,然后点击全部禁用就能禁他林用了。

3、也可以在运行中输入services.msc,然后回车。

4、在服务列表中将一些不需要用到的服务禁用掉,双击要禁用的服务,然后将启动类型改为禁用然后点击确定即可。

系统自检轻松搞材尼语板晶出零企定

内存随着每次电脑关机重启都会自动清理,启动后自动运行的程序和各种进程会响月述国害关推奏玉景给重新载入内存。清理内存有很多专用软件。比如Windows优化大师、超级兔子、360安全卫士、鲁大师程南诗说书坏非的一键清理可以帮你内存清理,释放不需要的软件。

也可亮逐经院绝良文满脸走以下载安装专门的内存清理软件,如果是因为电脑运行速度慢,有时仅靠研跳造殖读垂轴孩清理内存达到提升速度的方法是不够的。还要进行一系列优化,例如,把不必要的启动项删除,检查是否存在软件冲突。


本文拓展问题:

物理内存是什么物理内存16g,虚拟内存怎么设置物理内存