Linux的内存分页管理

  • 时间:
  • 浏览:3
  • 来源:5分时时彩官网_线上5分时时彩投注平台_网络5分时时彩平台

作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载

内存是计算机的主存储器。内存为多线程 池池开辟出多线程 池池空间,让多线程 池池在其中保存数据。我将从内存的物理底部形态出发,深入到内存管理的细节,不得劲是了解虚拟内存和内存分页的概念。

内存

简单地说,内存什么都有 一一还还有一个数据货架。内存有一一还还有一个最小的存储单位,大多数全是一一还还有一个字节。内存用内存地址(memory address)来为每个字节的数据顺序编号。因此,内存地址说明了数据在内存中的位置。内存地址从0结束了了,每次增加1。类似 线性增加的存储器地址称为线性地址(linear address)。为了方便,亲戚亲戚我们都都都用十六进制数来表示内存地址,比如0x00000003、0x1A010CB0。这里的“0x”用来表示十六进制。“0x”底下跟着的,什么都有 作为内存地址的十六进制数。

内存地址的编号有上限。地址空间的范围和地址总线(address bus)的位数直接相关。CPU通过地址总线来向内存说明让你存取数据的地址。以英特尔32位的80386型CPU为例,这款CPU有3一一还还有一个针脚都还要传输地址信息。每个针脚对应了一位。随后 针脚上是高电压,没有类似 位是1。随后 是低电压,没有类似 位是0。32位的电压高低信息通过地址总线传到内存的3一一还还有一个针脚,内存就能把电压高低信息转添加32位的二进制数,从而知道CPU让你的是哪个位置的数据。用十六进制表示,32位地址空间什么都有 从0x00000000 到0xFFFFFFFF。

内存的存储单元采用了随机读取存储器(RAM, Random Access Memory)。所谓的“随机读取”,是指存储器的读取时间和数据所在位置无关。与之相对,什么都有 存储器的读取时间和数据所在位置有关。就拿磁带来说,亲戚亲戚我们都都都想听其中的一首歌,还要转动带子。随后 那首歌是第一首,没有立即就都还要播放。随后 那首歌恰巧是最后一首,亲戚亲戚我们都都都快进到都还要播放的位置就还要花很长时间。亲戚亲戚我们都都都随后 知道,多线程 池池还要调用内存中不同位置的数据。随后 数据读取时间和位置相关搞笑的话,计算机就很难把控多线程 池池的运行时间。因此,随机读取的底部形态是内存成为主存储器的关键因素。

内存提供的存储空间,除了能满足内核的运行需求,还通常能支持运行中的多线程 池池。即使多线程 池池所需空间超过内存空间,内存空间也都还要通过血块拓展来弥补。换句话说,内存的存储能力,和计算机运行清况 的数据总量相当。内存的缺点是只能持久地保存数据。一旦断电,内存中的数据就会消失。因此,计算机即使有了内存随后 一一还还有一个主存储器,还是还要硬盘随后 的内外部存储器来提供持久的储存空间。

虚拟内存

内存的一项主要任务,什么都有 存储多线程 池池的相关数据。亲戚亲戚我们都都都随后 随后 看过很多线程 池池空间的多线程 池池段、全局数据、栈和堆,以及那此那此存储底部形态在多线程 池池运行中所起到的关键作用。有趣的是,尽管多线程 池池和内存的关系没有紧密,但多线程 池池不让说能直接访问内存。在Linux下,多线程 池池只能直接读写内存中地址为0x1位置的数据。多线程 池池中能访问的地址,只能是虚拟内存地址(virtual memory address)。操作系统会把虚拟内存地址翻译成真实的内存地址。类似 内存管理土最好的办法,称为虚拟内存(virtual memory)。

每个多线程 池池全是自己的一套虚拟内存地址,用来给自己的多线程 池池空间编号。多线程 池池空间的数据同样以字节为单位,依次增加。从功能上说,虚拟内存地址和物理内存地址类似 ,全是为数据提供位置索引。多线程 池池的虚拟内存地址相互独立。因此,一一还还有一个多线程 池池空间都还要有相同的虚拟内存地址,如0x800800。虚拟内存地址和物理内存地址又有一定的对应关系,如图1所示。对多线程 池池某个虚拟内存地址的操作,会被CPU翻译成对某个具体内存地址的操作。

图1 虚拟内存地址和物理内存地址的对应

应用多线程 池池来说对物理内存地址一无所知。它只随后 通过虚拟内存地址来进行数据读写。多线程 池池中表达的内存地址,什么都有 是虚拟内存地址。多线程 池池对虚拟内存地址的操作,会被操作系统翻译成对某个物理内存地址的操作。随后 翻译的过程由操作系统全权负责,什么都有 应用多线程 池池都还要在全过程中对物理内存地址一无所知。因此,C多线程 池池中表达的内存地址,全是虚拟内存地址。比如在C语言中,都还要用下面指令来打印变量地址:

int v = 0;
printf("%p", (void*)&v);

本质上说,虚拟内存地址剥夺了应用多线程 池池自由访问物理内存地址的权利。多线程 池池对物理内存的访问,还要经过操作系统的审查。因此,掌握着内存对应关系的操作系统,也掌握了应用多线程 池池访问内存的闸门。借助虚拟内存地址,操作系统都还要保障多线程 池池空间的独立性。因此操作系统把一一还还有一个多线程 池池的多线程 池池空间对应到不同的内存区域,随后 一一还还有一个多线程 池池空间成为“老死不相往来”的一一还还有一个小王国。一一还还有一个多线程 池池就不随后 相互篡改对方的数据,多线程 池池出错的随后 性就大为减少。

自己面,有了虚拟内存地址,内存共享也变得简单。操作系统都还要把同一物理内存区域对应到多个多线程 池池空间。随后 ,不还要任何的数据一键复制,多个多线程 池池就都还要看过相同的数据。内核和共享库的映射,什么都有 通过类似 土最好的办法进行的。每个多线程 池池空间中,最初一部分的虚拟内存地址,都对应到物理内存中预留给内核的空间。随后 ,所有的多线程 池池就都还要共享同一套内核数据。共享库的清况 也是类似 。对于任何一一还还有一个共享库,计算机只还要往物理内存中加载一次,就都还要通过操纵对应关系,来让多个多线程 池池并肩使用。IPO中的共享内存,全是赖于虚拟内存地址。

内存分页

虚拟内存地址和物理内存地址的分离,给多线程 池池带来便利性和安全性。但虚拟内存地址和物理内存地址的翻译,又会额外耗费计算机资源。在多任务的现代计算机中,虚拟内存地址随后 成为必备的设计。没有,操作系统还要要考虑清楚,何如能高效地翻译虚拟内存地址。

记录对应关系最简单的土最好的办法,什么都有 把对应关系记录在一张表中。为了让翻译下行传输速率 足够地快,类似 表还要加载在内存中。不过,类似 记录土最好的办法惊人地浪费。随后 树莓派1GB物理内存的每个字节全是一一还还有一个对应记录搞笑的话,没有光是对应关系就要远远超过内存的空间。随后 对应关系的条目众多,搜索到一一还还有一个对应关系所需的时间也很长。随后 搞笑的话,会让树莓派陷入瘫痪。

因此,Linux采用了分页(paging)的土最好的办法来记录对应关系。所谓的分页,什么都有 以更大尺寸的单位页(page)来管理内存。在Linux中,通常每页大小为4KB。随后 让你获取当前树莓派的内存页大小,都还要使用命令:

得到结果,即内存分页的字节数:

4096

返回的4096代表每个内存页都还要存放4096个字节,即4KB。Linux把物理内存和多线程 池池空间都分割成页。

内存分页,都还要极大地减少所要记录的内存对应关系。亲戚亲戚我们都都都随后 看过,以字节为单位的对应记录人太好不让 。随后 把物理内存和多线程 池池空间的地址都分成页,内核只还要记录页的对应关系,相关的工作量就会大为减少。随后 每页的大小是每个字节的800倍。因此,内存中的总页数什么都有 总字节数的四千分之一。对应关系也缩减为原始策略的四千分之一。分页让虚拟内存地址的设计有了实现的随后 。

无论是虚拟页,还是物理页,一页之内的地址全是连续的。随后 搞笑的话,一一还还有一个虚拟页和一一还还有一个物理页对应起来,页内的数据就都还要按顺序一一对应。这原因分析,虚拟内存地址和物理内存地址的末尾部分应该详细相同。大多数清况 下,每一页有4096个字节。随后 4096是2的12次方,什么都有 地址最后12位的对应关系火山岩石石成立。亲戚亲戚我们都都都把地址的类似 部分称为偏移量(offset)。偏移量实际上表达了该字节在页内的位置。地址的前一部分则是页编号。操作系统只还要记录页编号的对应关系。



图2 地址翻译过程

多级分页表

内存分页制度的关键,在于管理多线程 池池空间页和物理页的对应关系。操作系统把对应关系记录在分页表(page table)中。类似 对应关系让上层的抽象内存和下层的物理内存分离,从而让Linux能灵活地进行内存管理。随后 每个多线程 池池会有一套虚拟内存地址,没有每个多线程 池池前会 有一一还还有一个分页表。为了保证查询下行传输速率 ,分页表也会保所处内存中。分页表有什么都有 种实现土最好的办法,最简单的一种生活生活分页表什么都有 把所有的对应关系记录到同一一还还有一个线性列表中,即如图2中的“对应关系”部分所示。

类似 单一的连续分页表,还要给每一一还还有一个虚拟页预留两根绳子 记录的位置。但对于任何一一还还有一个应用多线程 池池,其多线程 池池空间真正用到的地址都相当有限。亲戚亲戚我们都都都还记得,多线程 池池空间会有栈和堆。多线程 池池空间为栈和堆的增长预留了地址,但栈和堆很少会占满多线程 池池空间。这原因分析,随后 使用连续分页表,什么都有 条目都没有真正用到。因此,Linux中的分页表,采用了多层的数据底部形态。多层的分页表也能减少所需的空间。

亲戚亲戚我们都都都来看一一还还有一个简化的分页设计,用以说明Linux的多层分页表。亲戚亲戚我们都都都把地址分为了页编号和偏移量两部分,用单层的分页表记录页编号部分的对应关系。对于多层分页表来说,会进一步分割页编号为一一还还有一个或更多的部分,因此用两层或更多层的分页表来记录其对应关系,如图3所示。



图3 多层分页表



在图3的例子中,页编号分成了两级。第一级对应了前8位页编号,用一一还还有一个十六进制数字表示。第二级对应了后12位页编号,用一还还有一个十六进制编号。二级表记录有对应的物理页,即保存了真正的分页记录。二级表有什么都有 张,每个二级表分页记录对应的虚拟地址前8位都相同。比如二级表0x00,底下记录的前8位全是0x00。翻译地址的过程要跨越两级。亲戚亲戚我们都都都先取地址的前8位,在一级表中找到对应记录。该记录会我不知道们,目标二级表在内存中的位置。亲戚亲戚我们都都都再在二级表中,通过虚拟地址的后12位,找到分页记录,从而最终找到物理地址。

多层分页表就好像把详细的电话号码分成区号。亲戚亲戚我们都都都把同一地区的电话号码以及对应的人名记录同通一一还还有一个小本子上。再用一一还还有一个上级本子记录区号和各个小本子的对应关系。随后 某个区号没有使用,没有亲戚亲戚我们都都都只还要在上级本子上把该区号标记为空。同样,一级分页表中0x01记录为空,说明了以0x01开头的虚拟地址段没有使用,相应的二级表就不还要所处。正是通过类似 手段,多层分页表所处的空间要比单层分页表少了什么都有 。

多层分页表还有随后 优势。单层分页表还要所处于连续的内存空间。而多层分页表的二级表,都还要散步于内存的不同位置。随后 搞笑的话,操作系统就都还要利用零碎空间来存储分页表。还还要注意的是,这里简化了多层分页表的什么都有 细节。最新Linux系统中的分页表多达3层,管理的内存地址也比本章介绍的长什么都有 。不过,多层分页表的基本原理全是相同。

综上,亲戚亲戚我们都都都了解了内存以页为单位的管理土最好的办法。在分页的基础上,虚拟内存和物理内存实现了分离,从而让内核厚度参与和监督内存分配。应用多线程 池池的安全性和稳定性因此大为提高。

欢迎阅读“骑着企鹅采树莓”系列文章