精华内容
下载资源
问答
  • 常见的内存由什么构成
    千次阅读
    2021-07-28 02:54:56

    计算机的内存容量通常是指随机存储器RAM的容量,是内存条的关键性参数,内存容量以MB作为单位,可以简写为M,内存容量越大越有利于系统的运行。

    计算机的内存容量通常是指随机存储器(RAM)的容量,是内存条的关键性参数,内存容量以MB作为单位,可以简写为M。

    内存的容量一般都是2的整次方倍,比如64MB、128MB、256MB等,一般而言,内存容量越大越有利于系统的运行。目前台式机中主流采用的内存容量为256MB或512MB,64MB、128MB的内存已较少采用。系统对内存的识别是以Byte(字节)为单位,每个字节由8位二进制数组成,即8bit。

    内存:在计算机的组成结构中,有一个很重要的部分,就是存储器。存储器是用来存储程序和数据的部件,对于计算机来说,有了存储器,才有记忆功能,才能保证正常工作。存储器的种类很多,按其用途可分为主存储器和辅助存储器,主存储器又称内存储器(简称内存),辅助存储器又称外存储器(简称外存)。

    外存通常是磁性介质或光盘,像硬盘,软盘,磁带,CD等,能长期保存信息,并且不依赖于电来保存信息,但是由机械部件带动,速度与CPU相比就显得慢的多。内存指的就是主板上的存储部件,是CPU直接与之沟通,并用其存储数据的部件,存放当前正在使用的(即执行中)的数据和程序,它的物理实质就是一组或多组具备数据输入输出和数据存储功能的集成电路,内存只用于暂时存放程序和数据,一旦关闭电源或发生断电,其中的程序和数据就会丢失。

    更多相关内容
  • 在计算机概念中,内存主要有物理内存和虚拟内存,那么它们分别是什么意思呢?怎么理解物理内存和虚拟内存呢?可能很多用户了解过却不知道具体含义,下面一起看看!物理内存和虚拟内存什么意思?物理内存,就是我们将...

    在计算机概念中,内存主要有物理内存和虚拟内存,那么它们分别是什么意思呢?怎么理解物理内存和虚拟内存呢?可能很多用户了解过却不知道具体含义,下面一起看看!

    物理内存和虚拟内存是什么意思?

    物理内存,就是我们将内存条插在主板内存槽上的内存条的容量的大小。看计算机配置的时候,主要看的就是这个物理内存。一般内存大小有1G、2G、4G。

    a9dc09dcfdbf907bd3d6adae04c6afac.png

    虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。

    8f764672d3d0471a531beecf88ab48be.png

    可能上面这样说大家不是很好理解,举个例子吧,假如你用的是2G的内存条,那么系统检测到你的物理内存是2G,可是如果有的软件是超过出你的物理内存,这样这些软件就不能安装了,这样就需要用到虚拟内存,而这些虚拟内存是调用硬盘的内存来使用,这样通过虚拟内存来安装运行这些应用程序。小。它将计算机的RAM和硬盘上的临时空间组合。当RAM运行速率缓慢时,它便将数据从RAM移动到称为“分页文件”的空间中。将数据移入分页文件可释放RAM,以便完成工作。当然我们可以对虚拟内存设置大小。

    补充:内存常见维护保养技巧

    1.对于由灰尘引起的内存金手指、显卡氧化层故障,大家应用橡皮或棉花沾上酒精清洗,这样就不会黑屏了。

    2.关于内存混插问题,在升级内存时,尽量选择和你现有那条相同的内存,不要以为买新的主流内存会使你的电脑性能很多,相反可能出现很多问题。内存混插原则:将低规范、低标准的内存插入第一内存插槽(即DIMM1)中。

    3.当只需要安装一根内存时,应首选和CPU插座接近的内存插座,这样做的好处是:当内存被CPU风扇带出的灰尘污染后可以清洁,而插座被污染后却极不易清洁。

    4.安装内存条,DIMM槽的两旁都有一个卡齿,当内存缺口对位正确,且插接到位了之后,这两个卡齿应该自动将内存“咬”住。 DDR内存金手指上只有一个缺口,缺口两边不对称,对应DIMM内存插槽上的一个凸棱,所以方向容易确定。而对于以前的SDR而言,则有两个缺口,也容易确定方向,不过SDR已经渐渐淡出市场,了解一下也无妨;而拔起内存的时候,也就只需向外搬动两个卡齿,内存即会自动从DIMM(或RIMM)槽中脱出。

    相关阅读:常用内存条辨别真伪方法

    查看内存标签:正品金士顿内存标签印刷清晰规则,而假货则明显粗糙浅淡,字体显得比较单薄。另外,真假金士顿内存标签的排版规则也有很大出入,请仔细观察。

    查看内存颗粒:通过图片中金士顿内存颗粒可以清晰看出,正品金士顿内存颗粒印刷清晰,而假内存的颗粒则非常暗淡,与正品形成鲜明对比。对于一款内存,PCB电路板仅占内存成本的百分之十左右,而内存颗粒才是决定内存价格的重点。因此,通常假货的PCB基本也是正规代工厂制造,而颗粒则采用行话里的“白片”,就是我们所说的次品,价格低廉,但稳定性和兼容性很差。

    查看注册商标标识:正品金士顿的注册商标“R”的周围清楚的印有由"KINGSTON"英文字母组成的圆圈,而假货则明显胡乱仿制的一个圆框而已。还有一点,仔细观察标签内部的水印,假内存水印和KINGSTON字体衔接处都有明显的痕迹,证明是后印刷的,这在正品金士顿内存中是不会出现的。

    金手指辨认:下为正品金士顿内存的金手指。正品金士顿内存的金手指色泽纯正、紫色方框内的金手指连接部位经过镀金;假冒金士顿内存的金手指色泽略显暗淡,红色方框内的金手指连接处为PCB板的铜片,并未镀金。

    PCB板上的字体辨认:左为正品金士顿内存。正品金士顿内存的字体均匀,无明显大小区别,并且有相关的认证符号。假冒金士顿内存的字体不一,无相关认证符号。

    K字标签:这是使用单反相机进行微距拍摄,同时打开闪光灯拍摄真假标签,正品标签的镭射图案能看出密集的银粉颗粒,K字并不明显,背景呈蓝色。而假冒标签的K字十分明显,银粉颗粒的密度较低。

    翻转角度查看防伪:正品金士顿内存的镭射防伪标签,通过变换角度能呈现出两种图案,第一种图案为上半沿带银粉效果,下半沿呈半个K渍;第二种图案为下半沿带银粉效果,上半沿呈半个K字。而假冒标签就只有一种图案,就是整个呈现出来一个很明显的K字。

    查询序列号:验证方式内存产品编辑短信“M+产品SN序列号”发送至0212 333 0345

    按照金士顿官方的说法,我输入“M36785241571636”发到“02123330345”即可查询内存真伪!

    展开全文
  • 什么要有虚拟内存

    千次阅读 多人点赞 2022-04-28 19:29:31
    4.1 为什么要有虚拟内存? 本篇跟大家说说内存管理,内存管理还是比较重要的一个环节,理解了它,至少对整个操作系统的工作会有一个初步的轮廓,这也难怪面试的时候常问内存管理。 干就完事,本文的提纲: 虚拟内存...

    4.1 为什么要有虚拟内存?

    本篇跟大家说说内存管理,内存管理还是比较重要的一个环节,理解了它,至少对整个操作系统的工作会有一个初步的轮廓,这也难怪面试的时候常问内存管理。

    干就完事,本文的提纲:

    虚拟内存

    如果你是电子相关专业的,肯定在大学里捣鼓过单片机。

    单片机是没有操作系统的,所以每次写完代码,都需要借助工具把程序烧录进去,这样程序才能跑起来。

    另外,单片机的 CPU 是直接操作内存的「物理地址」

    在这种情况下,要想在内存中同时运行两个程序是不可能的。如果第一个程序在 2000 的位置写入一个新的值,将会擦掉第二个程序存放在相同位置上的所有内容,所以同时运行两个程序是根本行不通的,这两个程序会立刻崩溃。

    操作系统是如何解决这个问题呢?

    这里关键的问题是这两个程序都引用了绝对物理地址,而这正是我们最需要避免的。

    我们可以把进程所使用的地址「隔离」开来,即让操作系统为每个进程分配独立的一套「虚拟地址」,人人都有,大家自己玩自己的地址就行,互不干涉。但是有个前提每个进程都不能访问物理地址,至于虚拟地址最终怎么落到物理内存里,对进程来说是透明的,操作系统已经把这些都安排的明明白白了。

    进程的中间层

    操作系统会提供一种机制,将不同进程的虚拟地址和不同内存的物理地址映射起来。

    如果程序要访问虚拟地址的时候,由操作系统转换成不同的物理地址,这样不同的进程运行的时候,写入的是不同的物理地址,这样就不会冲突了。

    于是,这里就引出了两种地址的概念:

    • 我们程序所使用的内存地址叫做虚拟内存地址Virtual Memory Address
    • 实际存在硬件里面的空间地址叫物理内存地址Physical Memory Address)。

    操作系统引入了虚拟内存,进程持有的虚拟地址会通过 CPU 芯片中的内存管理单元(MMU)的映射关系,来转换变成物理地址,然后再通过物理地址访问内存,如下图所示:

    操作系统是如何管理虚拟地址与物理地址之间的关系?

    主要有两种方式,分别是内存分段和内存分页,分段是比较早提出的,我们先来看看内存分段。

    内存分段

    程序是由若干个逻辑分段组成的,如可由代码分段、数据分段、栈段、堆段组成。不同的段是有不同的属性的,所以就用分段(Segmentation)的形式把这些段分离出来。

    分段机制下,虚拟地址和物理地址是如何映射的?

    分段机制下的虚拟地址由两部分组成,段选择子段内偏移量

    • 段选择子就保存在段寄存器里面。段选择子里面最重要的是段号,用作段表的索引。段表里面保存的是这个段的基地址、段的界限和特权等级等。

    • 虚拟地址中的段内偏移量应该位于 0 和段界限之间,如果段内偏移量是合法的,就将段基地址加上段内偏移量得到物理内存地址。

    在上面,知道了虚拟地址是通过段表与物理地址进行映射的,分段机制会把程序的虚拟地址分成 4 个段,每个段在段表中有一个项,在这一项找到段的基地址,再加上偏移量,于是就能找到物理内存中的地址,如下图:

    如果要访问段 3 中偏移量 500 的虚拟地址,我们可以计算出物理地址为,段 3 基地址 7000 + 偏移量 500 = 7500。

    分段的办法很好,解决了程序本身不需要关心具体的物理内存地址的问题,但它也有一些不足之处:

    • 第一个就是内存碎片的问题。
    • 第二个就是内存交换的效率低的问题。

    接下来,说说为什么会有这两个问题。

    我们先来看看,分段为什么会产生内存碎片的问题?

    我们来看看这样一个例子。假设有 1G 的物理内存,用户执行了多个程序,其中:

    • 游戏占用了 512MB 内存
    • 浏览器占用了 128MB 内存
    • 音乐占用了 256 MB 内存。

    这个时候,如果我们关闭了浏览器,则空闲内存还有 1024 - 512 - 256 = 256MB。

    如果这个 256MB 不是连续的,被分成了两段 128 MB 内存,这就会导致没有空间再打开一个 200MB 的程序。

    这里的内存碎片的问题共有两处地方:

    • 外部内存碎片,也就是产生了多个不连续的小物理内存,导致新的程序无法被装载;
    • 内部内存碎片,程序所有的内存都被装载到了物理内存,但是这个程序有部分的内存可能并不是很常使用,这也会导致内存的浪费;

    针对上面两种内存碎片的问题,解决的方式会有所不同。

    解决外部内存碎片的问题就是内存交换

    可以把音乐程序占用的那 256MB 内存写到硬盘上,然后再从硬盘上读回来到内存里。不过再读回的时候,我们不能装载回原来的位置,而是紧紧跟着那已经被占用了的 512MB 内存后面。这样就能空缺出连续的 256MB 空间,于是新的 200MB 程序就可以装载进来。

    这个内存交换空间,在 Linux 系统里,也就是我们常看到的 Swap 空间,这块空间是从硬盘划分出来的,用于内存与硬盘的空间交换。

    再来看看,分段为什么会导致内存交换效率低的问题?

    对于多进程的系统来说,用分段的方式,内存碎片是很容易产生的,产生了内存碎片,那不得不重新 Swap 内存区域,这个过程会产生性能瓶颈。

    因为硬盘的访问速度要比内存慢太多了,每一次内存交换,我们都需要把一大段连续的内存数据写到硬盘上。

    所以,如果内存交换的时候,交换的是一个占内存空间很大的程序,这样整个机器都会显得卡顿。

    为了解决内存分段的内存碎片和内存交换效率低的问题,就出现了内存分页。

    内存分页

    分段的好处就是能产生连续的内存空间,但是会出现内存碎片和内存交换的空间太大的问题。

    要解决这些问题,那么就要想出能少出现一些内存碎片的办法。另外,当需要进行内存交换的时候,让需要交换写入或者从磁盘装载的数据更少一点,这样就可以解决问题了。这个办法,也就是内存分页Paging)。

    分页是把整个虚拟和物理内存空间切成一段段固定尺寸的大小。这样一个连续并且尺寸固定的内存空间,我们叫Page)。在 Linux 下,每一页的大小为 4KB

    虚拟地址与物理地址之间通过页表来映射,如下图:

    页表是存储在内存里的,内存管理单元MMU)就做将虚拟内存地址转换成物理地址的工作。

    而当进程访问的虚拟地址在页表中查不到时,系统会产生一个缺页异常,进入系统内核空间分配物理内存、更新进程页表,最后再返回用户空间,恢复进程的运行。

    分页是怎么解决分段的内存碎片、内存交换效率低的问题?

    由于内存空间都是预先划分好的,也就不会像分段会产生间隙非常小的内存,这正是分段会产生内存碎片的原因。而采用了分页,那么释放的内存都是以页为单位释放的,也就不会产生无法给进程使用的小内存。

    如果内存空间不够,操作系统会把其他正在运行的进程中的「最近没被使用」的内存页面给释放掉,也就是暂时写在硬盘上,称为换出Swap Out)。一旦需要的时候,再加载进来,称为换入Swap In)。所以,一次性写入磁盘的也只有少数的一个页或者几个页,不会花太多时间,内存交换的效率就相对比较高。

    更进一步地,分页的方式使得我们在加载程序的时候,不再需要一次性都把程序加载到物理内存中。我们完全可以在进行虚拟内存和物理内存的页之间的映射之后,并不真的把页加载到物理内存里,而是只有在程序运行中,需要用到对应虚拟内存页里面的指令和数据时,再加载到物理内存里面去。

    分页机制下,虚拟地址和物理地址是如何映射的?

    在分页机制下,虚拟地址分为两部分,页号页内偏移。页号作为页表的索引,页表包含物理页每页所在物理内存的基地址,这个基地址与页内偏移的组合就形成了物理内存地址,见下图。

    总结一下,对于一个内存地址转换,其实就是这样三个步骤:

    • 把虚拟内存地址,切分成页号和偏移量;
    • 根据页号,从页表里面,查询对应的物理页号;
    • 直接拿物理页号,加上前面的偏移量,就得到了物理内存地址。

    下面举个例子,虚拟内存中的页通过页表映射为了物理内存中的页,如下图:

    这看起来似乎没什么毛病,但是放到实际中操作系统,这种简单的分页是肯定是会有问题的。

    简单的分页有什么缺陷吗?

    有空间上的缺陷。

    因为操作系统是可以同时运行非常多的进程的,那这不就意味着页表会非常的庞大。

    在 32 位的环境下,虚拟地址空间共有 4GB,假设一个页的大小是 4KB(2^12),那么就需要大约 100 万 (2^20) 个页,每个「页表项」需要 4 个字节大小来存储,那么整个 4GB 空间的映射就需要有 4MB 的内存来存储页表。

    这 4MB 大小的页表,看起来也不是很大。但是要知道每个进程都是有自己的虚拟地址空间的,也就说都有自己的页表。

    那么,100 个进程的话,就需要 400MB 的内存来存储页表,这是非常大的内存了,更别说 64 位的环境了。

    多级页表

    要解决上面的问题,就需要采用一种叫作多级页表Multi-Level Page Table)的解决方案。

    在前面我们知道了,对于单页表的实现方式,在 32 位和页大小 4KB 的环境下,一个进程的页表需要装下 100 多万个「页表项」,并且每个页表项是占用 4 字节大小的,于是相当于每个页表需占用 4MB 大小的空间。

    我们把这个 100 多万个「页表项」的单级页表再分页,将页表(一级页表)分为 1024 个页表(二级页表),每个表(二级页表)中包含 1024 个「页表项」,形成二级分页。如下图所示:

    你可能会问,分了二级表,映射 4GB 地址空间就需要 4KB(一级页表)+ 4MB(二级页表)的内存,这样占用空间不是更大了吗?

    当然如果 4GB 的虚拟地址全部都映射到了物理内存上的话,二级分页占用空间确实是更大了,但是,我们往往不会为一个进程分配那么多内存。

    其实我们应该换个角度来看问题,还记得计算机组成原理里面无处不在的局部性原理么?

    每个进程都有 4GB 的虚拟地址空间,而显然对于大多数程序来说,其使用到的空间远未达到 4GB,因为会存在部分对应的页表项都是空的,根本没有分配,对于已分配的页表项,如果存在最近一定时间未访问的页表,在物理内存紧张的情况下,操作系统会将页面换出到硬盘,也就是说不会占用物理内存。

    如果使用了二级分页,一级页表就可以覆盖整个 4GB 虚拟地址空间,但如果某个一级页表的页表项没有被用到,也就不需要创建这个页表项对应的二级页表了,即可以在需要时才创建二级页表。做个简单的计算,假设只有 20% 的一级页表项被用到了,那么页表占用的内存空间就只有 4KB(一级页表) + 20% * 4MB(二级页表)= 0.804MB,这对比单级页表的 4MB 是不是一个巨大的节约?

    那么为什么不分级的页表就做不到这样节约内存呢?我们从页表的性质来看,保存在内存中的页表承担的职责是将虚拟地址翻译成物理地址。假如虚拟地址在页表中找不到对应的页表项,计算机系统就不能工作了。所以页表一定要覆盖全部虚拟地址空间,不分级的页表就需要有 100 多万个页表项来映射,而二级分页则只需要 1024 个页表项(此时一级页表覆盖到了全部虚拟地址空间,二级页表在需要时创建)。

    我们把二级分页再推广到多级页表,就会发现页表占用的内存空间更少了,这一切都要归功于对局部性原理的充分应用。

    对于 64 位的系统,两级分页肯定不够了,就变成了四级目录,分别是:

    • 全局页目录项 PGD(Page Global Directory);
    • 上层页目录项 PUD(Page Upper Directory);
    • 中间页目录项 PMD(Page Middle Directory);
    • 页表项 PTE(Page Table Entry);

    TLB

    多级页表虽然解决了空间上的问题,但是虚拟地址到物理地址的转换就多了几道转换的工序,这显然就降低了这俩地址转换的速度,也就是带来了时间上的开销。

    程序是有局部性的,即在一段时间内,整个程序的执行仅限于程序中的某一部分。相应地,执行所访问的存储空间也局限于某个内存区域。

    我们就可以利用这一特性,把最常访问的几个页表项存储到访问速度更快的硬件,于是计算机科学家们,就在 CPU 芯片中,加入了一个专门存放程序最常访问的页表项的 Cache,这个 Cache 就是 TLB(Translation Lookaside Buffer) ,通常称为页表缓存、转址旁路缓存、快表等。

    在 CPU 芯片里面,封装了内存管理单元(Memory Management Unit)芯片,它用来完成地址转换和 TLB 的访问与交互。

    有了 TLB 后,那么 CPU 在寻址时,会先查 TLB,如果没找到,才会继续查常规的页表。

    TLB 的命中率其实是很高的,因为程序最常访问的页就那么几个。

    段页式内存管理

    内存分段和内存分页并不是对立的,它们是可以组合起来在同一个系统中使用的,那么组合起来后,通常称为段页式内存管理

    段页式内存管理实现的方式:

    • 先将程序划分为多个有逻辑意义的段,也就是前面提到的分段机制;
    • 接着再把每个段划分为多个页,也就是对分段划分出来的连续空间,再划分固定大小的页;

    这样,地址结构就由段号、段内页号和页内位移三部分组成。

    用于段页式地址变换的数据结构是每一个程序一张段表,每个段又建立一张页表,段表中的地址是页表的起始地址,而页表中的地址则为某页的物理页号,如图所示:

    段页式地址变换中要得到物理地址须经过三次内存访问:

    • 第一次访问段表,得到页表起始地址;
    • 第二次访问页表,得到物理页号;
    • 第三次将物理页号与页内位移组合,得到物理地址。

    可用软、硬件相结合的方法实现段页式地址变换,这样虽然增加了硬件成本和系统开销,但提高了内存的利用率。

    Linux 内存管理

    那么,Linux 操作系统采用了哪种方式来管理内存呢?

    在回答这个问题前,我们得先看看 Intel 处理器的发展历史。

    早期 Intel 的处理器从 80286 开始使用的是段式内存管理。但是很快发现,光有段式内存管理而没有页式内存管理是不够的,这会使它的 X86 系列会失去市场的竞争力。因此,在不久以后的 80386 中就实现了页式内存管理。也就是说,80386 除了完成并完善从 80286 开始的段式内存管理的同时还实现了页式内存管理。

    但是这个 80386 的页式内存管理设计时,没有绕开段式内存管理,而是建立在段式内存管理的基础上,这就意味着,页式内存管理的作用是在由段式内存管理所映射而成的地址上再加上一层地址映射。

    由于此时由段式内存管理映射而成的地址不再是“物理地址”了,Intel 就称之为“线性地址”(也称虚拟地址)。于是,段式内存管理先将逻辑地址映射成线性地址,然后再由页式内存管理将线性地址映射成物理地址。

    这里说明下逻辑地址和线性地址:

    • 程序所使用的地址,通常是没被段式内存管理映射的地址,称为逻辑地址;
    • 通过段式内存管理映射的地址,称为线性地址,也叫虚拟地址;

    逻辑地址是「段式内存管理」转换前的地址,线性地址则是「页式内存管理」转换前的地址。

    了解完 Intel 处理器的发展历史后,我们再来说说 Linux 采用了什么方式管理内存?

    Linux 内存主要采用的是页式内存管理,但同时也不可避免地涉及了段机制

    这主要是上面 Intel 处理器发展历史导致的,因为 Intel X86 CPU 一律对程序中使用的地址先进行段式映射,然后才能进行页式映射。既然 CPU 的硬件结构是这样,Linux 内核也只好服从 Intel 的选择。

    但是事实上,Linux 内核所采取的办法是使段式映射的过程实际上不起什么作用。也就是说,“上有政策,下有对策”,若惹不起就躲着走。

    Linux 系统中的每个段都是从 0 地址开始的整个 4GB 虚拟空间(32 位环境下),也就是所有的段的起始地址都是一样的。这意味着,Linux 系统中的代码,包括操作系统本身的代码和应用程序代码,所面对的地址空间都是线性地址空间(虚拟地址),这种做法相当于屏蔽了处理器中的逻辑地址概念,段只被用于访问控制和内存保护。

    我们再来瞧一瞧,Linux 的虚拟地址空间是如何分布的?

    在 Linux 操作系统中,虚拟地址空间的内部又被分为内核空间和用户空间两部分,不同位数的系统,地址空间的范围也不同。比如最常见的 32 位和 64 位系统,如下所示:

    通过这里可以看出:

    • 32 位系统的内核空间占用 1G,位于最高处,剩下的 3G 是用户空间;
    • 64 位系统的内核空间和用户空间都是 128T,分别占据整个内存空间的最高和最低处,剩下的中间部分是未定义的。

    再来说说,内核空间与用户空间的区别:

    • 进程在用户态时,只能访问用户空间内存;
    • 只有进入内核态后,才可以访问内核空间的内存;

    虽然每个进程都各自有独立的虚拟内存,但是每个虚拟内存中的内核地址,其实关联的都是相同的物理内存。这样,进程切换到内核态后,就可以很方便地访问内核空间内存。

    接下来,进一步了解虚拟空间的划分情况,用户空间和内核空间划分的方式是不同的,内核空间的分布情况就不多说了。

    我们看看用户空间分布的情况,以 32 位系统为例,我画了一张图来表示它们的关系:

    虚拟内存空间划分

    通过这张图你可以看到,用户空间内存,从低到高分别是 6 种不同的内存段:

    • 程序文件段(.text),包括二进制可执行代码;
    • 已初始化数据段(.data),包括静态常量;
    • 未初始化数据段(.bss),包括未初始化的静态变量;
    • 堆段,包括动态分配的内存,从低地址开始向上增长;
    • 文件映射段,包括动态库、共享内存等,从低地址开始向上增长(跟硬件和内核版本有关);
    • 栈段,包括局部变量和函数调用的上下文等。栈的大小是固定的,一般是 8 MB。当然系统也提供了参数,以便我们自定义大小;

    在这 7 个内存段中,堆和文件映射段的内存是动态分配的。比如说,使用 C 标准库的 malloc() 或者 mmap() ,就可以分别在堆和文件映射段动态分配内存。

    总结

    为了在多进程环境下,使得进程之间的内存地址不受影响,相互隔离,于是操作系统就为每个进程独立分配一套虚拟地址空间,每个程序只关心自己的虚拟地址就可以,实际上大家的虚拟地址都是一样的,但分布到物理地址内存是不一样的。作为程序,也不用关心物理地址的事情。

    每个进程都有自己的虚拟空间,而物理内存只有一个,所以当启用了大量的进程,物理内存必然会很紧张,于是操作系统会通过内存交换技术,把不常使用的内存暂时存放到硬盘(换出),在需要的时候再装载回物理内存(换入)。

    那既然有了虚拟地址空间,那必然要把虚拟地址「映射」到物理地址,这个事情通常由操作系统来维护。

    那么对于虚拟地址与物理地址的映射关系,可以有分段分页的方式,同时两者结合都是可以的。

    内存分段是根据程序的逻辑角度,分成了栈段、堆段、数据段、代码段等,这样可以分离出不同属性的段,同时是一块连续的空间。但是每个段的大小都不是统一的,这就会导致内存碎片和内存交换效率低的问题。

    于是,就出现了内存分页,把虚拟空间和物理空间分成大小固定的页,如在 Linux 系统中,每一页的大小为 4KB。由于分了页后,就不会产生细小的内存碎片。同时在内存交换的时候,写入硬盘也就一个页或几个页,这就大大提高了内存交换的效率。

    再来,为了解决简单分页产生的页表过大的问题,就有了多级页表,它解决了空间上的问题,但这就会导致 CPU 在寻址的过程中,需要有很多层表参与,加大了时间上的开销。于是根据程序的局部性原理,在 CPU 芯片中加入了 TLB,负责缓存最近常被访问的页表项,大大提高了地址的转换速度。

    Linux 系统主要采用了分页管理,但是由于 Intel 处理器的发展史,Linux 系统无法避免分段管理。于是 Linux 就把所有段的基地址设为 0,也就意味着所有程序的地址空间都是线性地址空间(虚拟地址),相当于屏蔽了 CPU 逻辑地址的概念,所以段只被用于访问控制和内存保护。

    另外,Linux 系统中虚拟空间分布可分为用户态内核态两部分,其中用户态的分布:代码段、全局变量、BSS、函数栈、堆内存、映射区。


    哈喽,我是小林,就爱图解计算机基础,如果觉得文章对你有帮助,欢迎微信搜索「小林coding」,关注后,回复「网络」再送你图解网络 PDF

    展开全文
  • 内存容量是什么

    2021-06-23 09:35:39
    内存容量是什么内存容量是指该内存条的存储容量,是内存条的关键性参数。计算机的内存容量通常是指随机存储器(RAM)的容量,是内存条的关键性参数。内存容量以MB作为单位,可以简写为M。内存的容量一般都是2的整次方...

    内存容量是什么

    内存容量是指该内存条的存储容量,是内存条的关键性参数。计算机的内存容量通常是指随机存储器(RAM)的容量,是内存条的关键性参数。内存容量以MB作为单位,可以简写为M。内存的容量一般都是2的整次方倍,比如64MB、128MB、256MB等,一般而言,内存容量越大越有利于系统的运行。目前台式机中主流采用的内存容量为256MB或512MB,64MB、128MB的内存已较少采用。系统对内存的识别是以Byte(字节)为单位,每个字节由8位二进制数组成,即8bit(比特,也称“位”)。

    09ee37962d0ce217e367b44fce662e08.png

    系统中内存的数量等于插在主板内存插槽上所有内存条容量的总和,内存容量的上限一般由主板芯片组和内存插槽决定。不同主板芯片组可以支持的容量不同,比如Inlel的810和815系列芯片组最高支持512MB内存,多余的部分无法识别。目前多数芯片组可以支持到2GB以上的内存。此外主板内存插槽的数量也会对内存容量造成限制,比如使用128MB一条的内存,主板由两个内存插槽,最高可以使用256MB内存。因此在选择内存时要考虑主板内存插槽数量,并且可能需要考虑将来有升级的余地。

    4914334ee0cd598262dda6fae84105cd.png

    手机内存容量

    手机内存分为机身内存、用户内存及可扩展存储。

    b5d2c1e38c3e3ec7610939c8a1d39946.png

    机身内存:机身内存是指手机内部存储,不可以修改,只读文件,也就是系统文件,内含自身所代的铃音,图片,游戏,视频等。 用户内存:用户内存为用户自己可支配内存,有动态和非动态内存,动态内存是随意支配内存用于图片铃音等存储,如机器用户内存为2M动态内存,用户可以将2M内存全部用于存储下载手机铃音。非动态内存是用户不可随意支配的内存,如机器用户内存为2M动态内存,用于存储铃音的为900K、用于存储图片为400K等。

    d330d13ed5df52de30d5427d4b0e4303.png

    可扩展存储:可扩展存储是指手机通过MMC卡、SD卡、T-Flash卡、sony记忆棒等扩展卡。

    286d77b5d74aa8b0e3729146c6e34d03.png

    笔记本电脑:标准内存容量

    是指该机器所标配内存的多少,一般平板电脑标配内存容量从2G-8G不等,也有特殊用途的机器配有16G以上的内存。内存的种类和运行频率会对性能有一定影响,不过相比之下,容量的影响更加大。在其他配置相同的条件下内存越大机器性能也就越高,对于普通家用和日常办公,目前主流配置为2G,对于大型图片和数据处理,一般建议配置最好能在4G以上。

    展开全文
  • 如何检测内存条的好坏有什么软件

    千次阅读 2021-07-23 05:01:21
    内存是电脑的核心部件,所以我们需要经常保养维护它,但是我想检测一下内存的兼容性和稳定性,有什么内存测试软件比较好用吗?下面推荐一款比较好用的检测软件。如何检测内存条的好坏注:一次最大只能是2GB的内存,如...
  • 参考答案:微型计算机硬件一般微处理器、内存储器、外存储器、系统总线、接口电路、输入/输出设备等部件组成。主要组成部件的功能和特点分析如下:(1)微处理器:是微型计算机的核心部件,运算单元ALU、控制单元...
  • 随着计算机芯片技术的不断发展和成熟,为了更好地与之相配合,内存产品也后台走出,成为除CPU外的另一关注焦点。作为计算机的重要组成部分,内存的性能直接影响计算机的整体性能。而内存制造工艺的一步也是关键...
  • 随着计算机芯片技术的不断发展和成熟,为了更好地与之相配合,内存产品也后台走出,成为除CPU外的另一关注焦点。作为计算机的重要组成部分,内存的性能直接影响计算机的整体性能。而内存制造工艺的最后一步也是最...
  • 计算机是我们生活和工作的重要组成部分,我们可以使用它来做很多... 今天,编辑器总结了一些开机时计算机无法进入系统的常见问题和解决方法,主要是通过“启动错误提示”,“内存问题”和“图形卡问题”向您解释参考...
  • JAVA的内存结构

    万次阅读 多人点赞 2018-08-01 09:41:28
    JVM所管理的内存包括以下几个运行时数据区域,如图所示 方法区和堆为线程共享区,虚拟机栈、本地方法栈及程序计数器为线程独占区。 程序计数器 程序计数器是一块较小的空间,它可以看作是当前...
  • 什么内存泄漏?

    千次阅读 多人点赞 2022-05-01 16:58:30
    内存泄漏是什么? 与几种常见情况。存在危害 内存泄漏 和 内存溢出 解决方案 检测内存泄漏常用的检测工具 如何避免内存泄漏?
  • Linux内核中常见内存分配函数

    千次阅读 2019-04-17 09:13:56
    转载:Linux内核中常见内存分配函数 1.原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表,如图2-1所示。四级页表...
  • 内存条不兼容有什么表现

    千次阅读 2021-07-31 00:42:20
    内存条不兼容情况也经常出现,可能很多用户遇到了但是没意识到,还以为只是内存条松了,那么内存条不兼容有哪些表现呢,用户可能并不了解为什么出现这些情况,内存条有哪些常见故障?请参见下文。内存条不兼容有...
  •  每个栈多个栈帧(Frame) 组成,对应着每次方法调用时所占用的内存  每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法 问题辨析   1.垃圾回收是否涉及栈内存? 不会,垃圾回收是回收堆内存中的无用...
  • 内存和外存

    千次阅读 2021-07-17 06:40:59
    半导体存储器分类存储器的种类很多,按其用途可分为主存储器和辅助存储器,主存储器又称内存储器(简称内存),辅助存储器又称外...主存:也成为内存一组DRAM芯片组成的存储体,每个存储体都有一个端口,用于...
  • 文章目录操作系统的oom killjava程序的oomoom erroroom killjava的内存构成HeapClassThreadCodeGCDirectMemorySHR 从容器的自动kill理解java程序的内存使用 操作系统的oom kill 引发操作系统对进程进行oom kill的...
  • 除了上述配置导致告警之外,另一种常见的告警就是ESXi主机的内存使用率过高。ESXi主机内存告警当ESXi主机的内存使用率过高时,将会在警报选项卡下的“已触发的警报”选项卡下看到“主机内存使用情况的告警”。通过...
  • 内存作为电脑的存储部件,是电脑的重要组成部分,一旦内存出现故障,就会影响到电脑的正常启动与运行,那么内存引起的常见故障有哪些呢?今天小编就为大家总结下。 1:内存兼容性不好造成计算机运行不稳定,遇到此...
  • 因此,在概念上,我们可以将整个计算机内存看作时我们可以读和写的一个组成的大数组。 因为作为人类,我们不是很善于在   位   上进行思考和计算,所以,我们将位组成更大的组,它们可以一起用来表示数字...
  • 原文:How JavaScript works: memory management + how...【译者注】本文介绍了JavaScript在内存管理方面的工作原理,同时列举了4种常见内存泄漏和处理方式。以下为译文:几个星期前,我们开始编写深入研究JavaScr...
  • 本文已经收录自笔者开源的 JavaGuide: https://github.com/Snailclimb (【Java学习 面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识)如果...写在前面 (常见面试题) 基本问题 介绍下 Java 内存区域(运...
  • 这个问题,我们需要知道 GC 在什么时候回收内存对象,什么样的内存对象会被 GC 认为是“不再使用”的。 Java中对内存对象的访问,使用的是引用的方式。在 Java 代码中我们维护一个内存对象的引用变量,通过这个引用...
  • 电脑内存损坏会引起哪些故障

    千次阅读 2021-07-24 03:36:36
    说起电脑就不会不提起电脑出现问题故障这样的状况,由于现在电脑的普及速度非常之快,并且电脑操作使用容易,精通的话就比较困难,电脑是软件及硬件两方面组成,电脑出现问题故障通常都是这两方面相互之间影响造成...
  • 其中主要组件包括:CMOS、基本输入/输出系统(BIOS)、高速缓冲存储器、内存插槽、CPU插槽、键盘接口、软盘驱动器接口、硬盘驱动器接口、总线扩展插槽(ISA、PCI等扩展槽)、串行接口(COM1、COM2)、并行接口(打印机接口...
  • iOS之深入解析Memory内存

    千次阅读 2021-10-01 16:37:14
    在此基础之上,进一步在 iOS 系统层面进行分析,包括 iOS 整体的内存机制,以及 iOS 系统运行时的内存占用的情况。最后会将粒度缩小到 iOS 中的单个 App,到单个 App 的内存管理策略。 那么: 什么是冯·诺依曼...
  • 该算法能够判断出某个对象是否可以访问,从而知道该对象是否有用,该算法以下步骤组成: 垃圾收集器构建一个“根”列表,用于保存引用的全局变量。在JavaScript中,“window”对象是一个可作为根节点的全局变量。 ...
  • Apache Flink 是一个分布式系统,它...Flink 集成了所有常见的集群资源管理器,例如Hadoop YARN、Apache Mesos和Kubernetes,Apache Flink 也是基于 JVM 的高效处理能力,我们需对各组件内存的了解,更好的使用内存
  • 计算机内存发展史 内存是电脑必不可少的组成部分,CPU可通过数据总线对内存寻址。历史上的电脑主 板上有主内存内存条是主内存的扩展。以后的电脑主板上没有主内存,CPU完全依赖内 存条。所有外存上的内容必须通过...
  • CPU中常见寄存器及与内存的交互

    千次阅读 2020-04-20 22:27:40
    对于每个CPU,其都有一套自己可以执行的专门的指令集(这部分指令CPU提供)。 正式因为不同CPU架构的指令集不同,使得X86处理器不能执行ARM程序,ARM程序也不能执行X86程序(Inter和AMD都使用x...
  • JVM常见参数 java.security.egd 作用 优化后的效果 JVM参数设置是否生效 基础镜像优化 Fabric8 备注 Xmx < limit 支持springboot多环境和jvm动态配置的Dockerfile 参考 Spring Boot应用内存飙升 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 313,044
精华内容 125,217
热门标签
关键字:

常见的内存由什么构成