导航:首页 > 物理学科 > 页表为什么放在物理内存中

页表为什么放在物理内存中

发布时间:2022-10-05 10:13:26

A. 在操作系统中 存储页表的作用是什么

页表实际上就是进程的虚存空间与系统中的物理存储空间的一个映射关系。

因为每个进程都有自己独立的虚存空间,所以操作系统需要为每个进程保存一个页表。

进程切换的时候操作系统就会把即将调度运行的那个进程的页表加载MMU,完成地址空间的切换。
在页式管理中,页表的作用是实现从页号到物理块号的地址映射,存储页表的作用是记录内存页面的分配情况。

B. 关于虚拟内存中页目录与页表在物理内存中加载的问题

我对Linux操作系统的具体情况不是很熟,回答仅供参考。

首先,物理内存无所谓内核区用户区,所有地址都一样。虚拟的地址空间才分内核区用户区。
处理器通过查看页目录和页表,把虚拟地址换算成物理地址。用户区与内核区的两个不同的虚拟地址对应同一个物理地址也不要紧。
内核区与用户区的真正区别在于普通进程能不能访问该区域中的地址。
在正常情况下,操作系统肯定会把页目录和页表保护起来,可以把它们看作存放在内核区的东西。

编写操作系统时,页目录确实可以放在物理内存中的任何地方(当然偏移必须是1000h的倍数),只要把偏移量填进CR3的高20位就可以了。
Linux内核的页目录放在物理地址0h处,页表紧随其后。0.11版Linux中,所有用户进程和内核用的都是这张页目录。切换进程时,改改页目录项就行了。新版的Linux内核我不太了解,抱歉……
每个页目录项有4字节,高20位储存页表的物理地址,低12位储存页表的属性。

一张页表4KB,这4KB必须是连续的。但是各张页表之间不必连续。Linux创建新进程时,仅仅调用了get_free_page找到一页空内存,把进程页表塞进去而已。
页表不能被普通进程直接访问。访问用户区虚拟地址是看不到进程页表的。
内核的页表前面提到过。它就在内核页目录的后面,物理地址为1000h,虚拟地址为C0001000h。访问用户区的虚拟地址不会看到它。

个人不大擅长表述,恐怕解释得不是很清楚。欢迎追问。

C. Linux存储管理方式

这种方式中,将用户程序的地址空间,注意,是 用户程序的地址空间 分为若干个固定大小的区域,成为“页”或“页面”。我们可以知道,这也页其实是不存在的,只是一种划分内存空间的方法。也就是说,这种方式将用户的程序 “肢解” 了,分成很多个小的部分,每个部分称为一个“页”。

将逻辑地址的前n位作为页号,后面32-n位作为页内偏移量。

由于进程的最后一页经常装不满一个块,从而形成了不可利用的碎片,称之为 “页内碎片”

作用:实现页号到物理号的地址映射。

页表是记录逻辑空间(虚拟内存)中每一页在内存中对应的物理块号。但并非每一页逻辑空间都会实际对应着一个物理块,只有实际驻留在物理内存空间中的页才会对应着物理块。

系统会为每一个进程建立一张页表,页表是需要一直驻留在物理内存中的(多级页表除外),另外页表的起址和长度存放在 PCB(Process Control Block)进程控制结构体中。

可以在页表的表项中设置相关的权限控制字段,例如设置存取控制字段,用于保护该存储块的读写;若存取控制字段为2位,则可以设置读/写、只读和只执行等存取方式。

物理块是实实在在存在于内存中的:

由于执行频率高,要求效率比较高,需要使用硬件实现。

在系统中设置一个 页表寄存器(PTR) ,其中存放页表在内存的起始地址和页表的长度。平时进程未执行的时候,页表的起始地址和页表长度放在本进程的PCB中。当调度程序调度到某个进程的时候,才将这两个数据装入 页表寄存器

变换过程:

快表的变换机构

为了提高地址变换速度,可在地址变换机构中增设一个具有并行查询能力的特殊高速缓冲寄存器,又称为"联想寄存器"或者“快表”。俗称TLB。

快表与页表的功能类似,其实就是将一部分页表存到 CPU 内部的高速缓冲存储器 Cache。CPU 寻址时先到快表查询相应的页表项形成物理地址,如果查询不到,则到内存中查询,并将对应页表项调入到快表中。但,如果快表的存储空间已满,则需要通过算法找到一个暂时不再需要的页表项,将它换出内存。

由于成本的关系,快表不可能做得很大,通常只存放 16~512 个页表项,这对中、小型作业来说,已有可能把全部页表项放在快表中;但对于大型作业而言,则只能将其一部分页表项放入其中。由于对程序和数据的访问往往带有局限性,因此,据统计,从快表中能找到所需页表项的概率可达 90% 以上。这样,由于增加了地址变换机构而造成的速度损失可减少到 10% 以下,达到了可接受的程度。

我们可以采用这样两个方法来解决这一问题:

① 对于页表所需的内存空间,可采用离散分配方式,以解决难以找到一块连续的大内存空间的问题;

只将当前需要的部分页表项调入内存,其余的页表项仍驻留在磁盘上,需要时再调入。

二级页表的页表项:

过程:

在采用两级页表结构的情况下,对于正在运行的进程,必须将其外层页表调入内存,而对于内页表则只需调入一页或几页。为了表征某页的页表是否已经调入内存,还应在外层页表项中增设一个状态位 S,其值若为 0,表示该页表分页不在内存中,否则说明其分页已调入内存。进程运行时,地址变换机构根据逻辑地址中的 P1去查找外层页表;若所找到的页表项中的状态位为 0,则产生一个中断信号,请求 OS 将该页表分页调入内存。

多级页表和二级页表类似。多级页表和二级页表是为了节省物理内存空间。使得页表可以在内存中离散存储。(单级页表为了随机访问必须连续存储,如果虚拟内存空间很大,就需要很多页表项,就需要很大的连续内存空间,但是多级页表不需要。)

为什么引入分段存储管理?

引入效果:

它将用户程序的地址空间分为若干个大小不同的的段,每个段可以定义一组完整的信息。

段号表示段名,每个段都从0开始编址,并且采用一段连续的地址空间。

在该地址结构中,允许一个作业最长有64K个段,每个段的最大长度为64KB。

在分段式存储管理系统中,为每一个分段分配一个连续的分区。进程的各个段,可以离散地装入内存中不同的分区中。

作用:实现从逻辑地址到物理内存区的映射。

为了保证程序能够正常运行,就必须能够从物理内存中找出每个逻辑段所对应的位置。为此在系统中会为每一个进程建立一张 段表 。每个段在表中有一个表项,其中记录了该段在内存中的起始地址和段的长度。一般将段表保存在内存中。

在配置了段表之后,执行的过程可以通过查找段表,找到每一个段所对应的内存区。

为了实现进程从逻辑地址到物理地址的变换功能,在系统设置了段表寄存器,用于存放段表的起始地址和段表长度TL。

在进行地址变换时,系统将逻辑地址中的段号与段表长度TL 进行比较。若 S > TL,表示段号太大,是访问越界,于是产生越界中断信号。若未越界,则根据段表的始址和该段的段号,计算出该段对应段表项的位置,从中读出该段在内存的起始地址。然后,再检查段内地址 d 是否超过该段的段长 SL。若超过,即 d>SL,同样发出越界中断信号。若未越界,则将该段的基址 d 与段内地址相加,即可得到要访问的内存。

分页和分段系统相似之处:两者都采用离散分配方式,且都是通过地址映射机构实现地址变换。

但在概念上两者完全不同,主要表现在下述三个方面:

分页系统以页面作为内存分配的基本单位,能有效地提高内存利用率,而分段系统以段作为内存分配的基本单位,它能够更好地满足用户多方面的需要。

段页式地址结构由段号、段内页号及页内地址三部分所组成

段页式系统的基本原理是分段和分页原理的结合,即先将用户程序分成若干个段,再把每个段分成若干个页,并为每一个段赋予一个段名。如下图展示了一个作业地址空间的结构。该作业有三个段:主程序段、子程序段和数据段;页面大小为 4 KB:

在段页式系统中,为了实现从逻辑地址到物理地址的变换,系统中需要同时配置段表和页表。段表的内容与分段系统略有不同,它不再是内存始址和段长,而是页表始址和页表长度。下图展示出了利用段表和页表进行从用户地址空间到物理(内存)空间的映射。

在段页式系统中,为了便于实现地址变换,须配置一个段表寄存器,其中存放段表始址和段长 TL。进行地址变换时,首先利用段号 S,将它与段长 TL 进行比较。若 S < TL,表示未越界,于是利用段表始址和段号来求出该段所对应的段表项在段表中的位置,从中得到该段的页表始址,并利用逻辑地址中的段内页号 P 来获得对应页的页表项位置,从中读出该贝所在的物理块号 b,再利用块号 b 和页内地址来构成物理地址。

在段页式系统中,为了获得一条指令或数据,须三次访问内存。第一次访问是访问内存中的段表,从中取得页表始址;第二次访问是访问内存中的页表,从中取出该页所在的物理块号,并将该块号与页内地址一起形成指令或数据的物理地址;第三次访问才是真正从第二次访问所得的地址中取出指令或数据。

显然,这使访问内存的次数增加了近两倍。为了提高执行速度,在地址变换机构中增设一个高速缓冲寄存器。每次访问它时,都须同时利用段号和页号去检索高速缓存,若找到匹配的表项,便可从中得到相应页的物理块号,用来与页内地址一起形成物理地址:若未找到匹配表项,则仍需第三次访问内存。

参考链接:

D. 磁盘缓存,虚拟内存,页面文件,和物理内存的关系

如果它不存在,但是你能看见它 -- 它是虚拟的(IBM宣传虚拟内存之用语)。虚拟内存技术是计算机发展史上的一项重要的技术,它帮助应用程序摆脱了“体积”的限制。

记得上大学时,有一本书好像叫做“计算机网络 - 自顶向下”,全名记不太清了。书中从人们接触最多也最熟悉的“应用层”开始讲,一直讲到“物理层”,看完这本书后感觉效果不错。所以按照这种方法我也尝试着自上而下的去学习“虚存”,从我们最熟悉的C库接口调用说起,一直谈到底层的硬件支持设施。

1、初学者的疑惑
初学者往往都会写出以下这样的例子程序来学习malloc和free的使用。
int main() {
int *p = malloc(10000);
printf("p's address is 0x%p\n", p);
free(p);
return 0;
}
但往往结果让这些初学者们感到疑惑。比如上述的例子,在SUN SPARC 64编译后其输出如下:
p's address is 0x100100dc0
看到这样的结果,初学者往往心里嘀咕,“这台机器物理内存才4G,其地址空间总共才4294967296(dec),而0x100100dc0转换十进制为4296019392(dec),这个地址明显已经超出了我的物理内存的限制,这是怎么回事呢?”。其实这里的解释很简单:因为我们看到的都是“虚拟内存地址”。

2、“堆”为何物
malloc是个极其常见的内存分配接口函数,它主要负责运行时在“堆”上为程序动态分配内存空间。我们总是在口头上谈论着“堆”,那么“堆”到底为何物呢?我们已经知道了有“虚拟地址”这个东西的存在,想必“堆”和“虚拟地址”有着千丝万缕的联系^_^。我们来翻看一些经典书籍中的描述。在CS.APP[注1]中的描述是这样的:“堆是进程地址空间中的一段“虚拟地址”空间。在大多数的Unix系统中,堆是映射“二进制零区域(demand-zero)”实现的。其位置在bss段后,其增长方向为高地址方向”。

3、内存映射
前面谈到“demand-zero”这个新名词,那么什么叫“映射到demand-zero”呢?这里蕴含着一个极其重要的概念“内存映射”。内存映射好似一道桥梁,将放在物理磁盘上的对象和一段进程“虚拟地址”空间连接起来。磁盘上的对象,主要指的就是文件,在多数Unix的实现中支持两种文件的内存映射,分别为Regular File和匿名文件(如demand-zero)。映射的过程大致为将文件分成若干“虚拟内存基本单元(页)”大小存于“交换区”,直到CPU指令第一次访问到某个单元时,这个单元才真正被加载到物理内存中。

4、虚拟内存,何方神圣
看到这是不是有些“云里雾里”的感觉亚^_^。其实对于用户进程来说,它是看不到CPU和OS是如何相互配合完成内存管理的。它只认为它面前的是一个这样的情景:“一个完全被我拥有的CPU、一个从拥有M地址空间的物理内存(M = 2的n次方,n为地址总线宽度)...”。这里的用户进程眼中的“物理内存”实际就是“虚拟内存”。虚拟意味着假象,我们知道一个用户进程运行时可能仅仅占用的物理内存的一小部分。看来用户进程被欺骗了。而这个骗局是由操作系统和CPU共同布置的。为了让这个骗局一直维持下去,CPU和OS还是做了很多工作的,究竟有哪些工作呢?我们一一来看看。

1) 交换区(swap)
为了支持虚拟内存,操作系统在物理内存、磁盘之间交换数据的基本单元为“页”。页的大小是固定的,其因操作系统而异。这样一个用户进程在被加载之前首先要被分成若干个“页”,这些页存储在磁盘上。那么是不是进程启动后所有的页都被加载到物理内存中呢?答案是NO。在当前的Unix操作系统中,都有一个叫“交换区”的地方,“交换区”在磁盘上,它存储的是“已分配的虚拟内存页”。又有些糊涂是吧,什么叫已分配的页呢?一个进程虚拟内存页的加载流程大致是这样的:一旦用户进程一虚拟页需要被加载,则操作系统会在“交换区”中为该页分配一个页,一旦CPU访问的虚拟地址落入该页地址空间,则该页才被换入到物理内存中。在这个过程中虚拟页有多个状态,分别如下:
未分配的 - 进程虚拟页未得到加载指令,仍安静的待在磁盘上;
未缓存的 - OS为该进程虚拟页在交换区分配了一个空间,但是该虚拟页还未被引用;
已缓存的 - 该虚拟页被引用,被载入到物理内存中。

2) 换入换出
物理内存容量有限,当物理内存无空间存储新的内存页的时候,就需要将某些内存页从物理内存中移出以为新页腾出空间。这个过程对于那些被移出的页来说,就叫“换出”;相反对于那些新加入到物理内存中的页来说就叫做“换入”。

5、从缓存角度看虚存
现代计算机的存储体系是呈金字塔状的。越接近顶层,速度越快,容量越小,价格越贵;越接近底层,速度越慢,容量越大,价格越低。这样就形成了一个逐级缓存的机制。第K层设备永远是第K+1层设备的缓存。按照这种说法,在早期计算机中,主存是磁盘的缓存,CPU内的高级Cache是主存的缓存。现代计算机基本都支持虚拟内存机制,而虚存页是存储在磁盘上的,虚存页在主存中换入换出。按照缓存的概念,虚存属于容量大,速度慢的第K+1层,而处于第K层的主存就可以看作是虚拟内存的缓存。那么一切缓存理论就都可以应用在虚存和物理内存之间了,比如换入换出算法等。

6、硬件支持
在支持虚拟内存机制的计算机中,CPU都是以虚拟地址形式生成指令地址或者数据地址的,而这个虚拟地址对于物理内存来说是不可见的,那么是谁来屏蔽这个差异的呢?答案是MMU(Memory Management Unit)。MMU负责将CPU发出的虚拟地址转换成相应的物理内存地址。MMU不是孤立工作的,OS为其提供了很好的支持,OS在物理内存中为MMU维护着一张全局的页表,来帮助MMU找到正确地物理内存地址。

E. 每个进程的内核页表为什么单独分配存储空间

问题没太看懂。

你是指每个进程为何有独立的地址空间吗?
操作系统开启分页后,每个进程有自己独立的页目录与页表,cpu操作内存会自动将当前线性地址转换为物理地址(MMU负责),然后再放在地址总线上。所以每个进程即使访问相同的线性地址会最终对应到不同的物理地址,因为他们的pde与pte不同。

F. 关于计算机操作系统页表项大小的疑问

操作系统中的分页存储管理系统的实现需要页表。
首先,页表存放在内存中
其次,页表中记录了页号(程序在内存中被分成好多页)和其对应的物理内存的块号,等等
最后,一个页号及其对应的块号等等就被称为一个页表项,他们在内存的占据的比特位数或者字数就称为页表项大小。
可能你又会问干嘛知道页表项大小,这就要结合用户程序的相对地址转化绝对地址来理解了

G. 页表的相关概念

当然是需要的进程才驻留物理内存,如果所有进程都驻留内存的话,那还要页表干什么?页表的作用就是建立起进程占用的页号和物理地址的对应关系,在用户层面只能看见逻辑地址看不见真实的物理地址。当某个进程需要的某页不在内存中时,CPU就需暂停工作,置换掉内存中的某一页,然后将需要的页从驱动器置换到内存里,这个过程就叫缺页中断。Windows的虚拟内存就是这一原理

H. 内存管理

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

局部性原理的 分类

将编译后的目标模块装配成一个可执行程序。

可执行程序以 二进制可执行文件 的形式存储在磁盘上。

链接程序的 任务

程序的链接,可划分为:

重定位 :将逻辑地址(相对地址)转换为物理地址(绝对地址)的过程。

物理地址 = 逻辑地址 + 程序在内存中的起始地址

程序的装入,可划分为:

任何时刻主存储器 最多只有一个作业

每个分区 大小固定不变 :分区大小相等、分区大小不等。

每个分区可以且 仅可以装入一个作业

使用 下限寄存器 上限寄存器 来保存当前作业的起始位置和结束位置。

使用 固定分区说明表 区分各分区的状态。

分区 大小不是预先固定的 ,而是按作业(进程)的实际需求来划分的。

分区 个数也不是预先固定的 ,而是由装入的作业数决定的。

使用 空闲分区表 说明空闲分区的位置。

使用 空闲分区链 说明空闲分区的位置。

首次适应算法的 过程

外部碎片:空闲内存 没有在 分配的 进程 中。

内部碎片:空闲内存 分配的 进程 中。

上次找到的 空闲分区的 下一个 空闲分区开始查找。

优点:空闲区分布均匀、查找开销较小。

缺点:缺乏大空闲区。

最佳适应算法的 过程

优点:提高内存利用率。

注意点:每次在进行空闲区的修改前,需要先进行 分区大小递增 的排序。

:将一个 进程 逻辑地址空间 分成若干个 大小相等

页框 :将 物理内存空间 分成与页大小相同的若干个 存储块

分页存储 :将进程的若干 分别装入多个 可以不相邻 页框 中。

页内碎片 :进程 最后一页 一般装不满一个页框,形成 页内碎片

页表 :记录描述页的各种数据,实现从 页号 页框号 的映射。

注意: 页内偏移量 的单位是 字节

分页地址变换指是: 逻辑地址 通过 地址变换机构 变换为 物理地址

分页地址变换的 过程

操作系统在修改或装入页表寄存器的值时,使用的是 特权级 指令。

页大小:512B ~ 4KB,目前的计算机系统中,大多选择 4KB 大小的页。

页大小的 选择因素

快表也称为“转换后援缓冲”,是为了提高CPU访问速度而采用的专用缓存,用来存放 最近被访问过的页表项

英文缩写:TLB。

组成: 键和值

在TLB中找到某一个页号对应的页表项的百分比称为 TLB命中率

在TLB中找到所需要的页表项时:

有效访问时间 = 一次访问TLB 的时间 + 一次访问内存 的时间(访问内存读写数据或指令)

不能 在TLB中找到所需要的页表项时:

有效访问时间 = 一次访问TLB 的时间 + 两次访问内存 的时间(一次访问内存页表,一次访问内存读写数据或指令)

将页表再分页,形成两级或多级页表,将页表离散地存放在物理内存中。

在进程切换时,要运行的进程的页目录表歧视地址被写入 页表寄存器

在二级分页系统中,为页表再建立一个页目录表的目的是为了能在地址映射时得到页表在物理内存中的地址,在页目录表的表项中存放了每一个 页表 在物理内存中所在的 页框号

虚拟存储器 :是指具有 请求调入功能 置换功能 ,能 从逻辑上对内存容量进行扩充 的一种存储系统。

请求调入 :就是说,先将进程一部分装入内存,其余的部分什么时候需要,什么时候请求系统装入。

置换 :如果请求调入时,没有足够的内存,则由操作系统选择一部分内存中的进程内容移到外存,以腾出空间把当前需要装入的内存调入。

为了实现请求分页,需要:

保证进程正常运行的所需要的最小页框数。

最小页框数与进程的大小没有关系,它与计算机的 硬件结构 有关,取决于 指令的格式、功能和寻址方式

内存不够时,从进程本身选择淘汰页,还是从系统中所有进程中选择?:

采用什么样的算法为不同进程分配页框?:

常用的两种 置换策略 局部置换 全局置换

从分配给进程的页框数量上看,常使用的两种 分配策略 固定分配 可变分配

用新调入的页替换 最长时间没有访问 的页面。

找到 未来最晚被访问 的那个页换出。

,P为缺页率。

有效访问时间与缺页率成 正比 ,缺页率越高,有效访问时间越长,访问效率越低。

工作集 :某段时间间隔里,进程实际要访问的页的集合。

引入工作集的 目的 :降低缺页率,提高访问内存效率。

抖动 :运行进程的大部分时间都用于页的换入换出,几乎不能完成任何有效果工作的状态。

抖动的 产生原因

抖动的 预防方法

在分段存储管理的系统中,程序使用 二维 的逻辑地址,一个数用来表示 ,另一个数用来表示 段内偏移量

引入分段的 目的

引入分段的 优点

进程的地址空间被划分成 若干个段

每个段定义了一组逻辑信息,每个段的大小由相应的逻辑信息组的长度确定, 段的大小不一样 ,每个段的逻辑地址从0开始,采用一段 连续的地址空间

系统为每个段分配一个 连续的物理内存区域 ,各个 不同的段可以离散 地放入物理内存不同的区域。

系统为 每个进程建立一张段表 ,段表的每一个表项记录的信息包括: 段号、段长和该段的基址 ,段表存放在内存中。

分段的 逻辑地址结构

段表是由操作系统维护的用于支持分段存储管理 地址映射 的数据结构。

每个进程有一个段表,段表由段表项构成。每个段表项包括: 段号、段长(段的大小)和该段的基址(段的起始地址)

若已知逻辑单元的地址为 S:D (段号:段内偏移量),求相应物理地址的步骤如下:

相同点 :分页和分段都属于 离散 分配方式,都要通过数据结构与硬件的配合来实现 逻辑地址到物理地址 的映射。

不同点

将用户进程的逻辑空间 先划分为若干个段 每个段再划分成若干个页

进程以页为单位在物理内存中 离散 存放,每个段中被离散存放的页具有 逻辑相关性

为了实现地址映射,操作系统为 每个进程建立一个段表 ,再为 每个段建立一个页表

进程段表的段表项组成:

满足以下条件的两个块称为 伙伴

I. 页表放是在内存上还是磁盘上,为什么

你说的页表指的是什么,如果是一般文件,在没保存之前是放在内存上,保存之后则在磁盘,因为没保存的时候是临时文件

阅读全文

与页表为什么放在物理内存中相关的资料

热点内容
word中化学式的数字怎么打出来 浏览:740
乙酸乙酯化学式怎么算 浏览:1406
沈阳初中的数学是什么版本的 浏览:1353
华为手机家人共享如何查看地理位置 浏览:1045
一氧化碳还原氧化铝化学方程式怎么配平 浏览:886
数学c什么意思是什么意思是什么 浏览:1411
中考初中地理如何补 浏览:1300
360浏览器历史在哪里下载迅雷下载 浏览:703
数学奥数卡怎么办 浏览:1388
如何回答地理是什么 浏览:1025
win7如何删除电脑文件浏览历史 浏览:1058
大学物理实验干什么用的到 浏览:1487
二年级上册数学框框怎么填 浏览:1701
西安瑞禧生物科技有限公司怎么样 浏览:976
武大的分析化学怎么样 浏览:1250
ige电化学发光偏高怎么办 浏览:1339
学而思初中英语和语文怎么样 浏览:1653
下列哪个水飞蓟素化学结构 浏览:1425
化学理学哪些专业好 浏览:1488
数学中的棱的意思是什么 浏览:1059