📄 00000004.htm
字号:
于处理器和物理内存的速度,访问交换文件的速度是非常缓慢的,操作系统必须在将这 <BR> <BR>些dirty页面写入磁盘和将其继续保留在内存中做出选择。 <BR>选择丢弃页面的算法经常需要判断哪些页面要丢弃或者交换,如果交换算法效率很低, <BR> <BR>则会发生"颠簸"现象。在这种情况下,页面不断的被写入磁盘又从磁盘中读回来,这样 <BR> <BR>一来操作系统就无法进行其他任何工作。以图3.1为例,如果物理页面框号1被频繁使用 <BR>, <BR>则页面丢弃算法将其作为交换到硬盘的侯选者是不恰当的。一个进程当前经常使用的页 <BR> <BR>面集合叫做工作集。高效的交换策略能够确保所有进程的工作集保存在物理内存中。 <BR>Linux使用最近最少使用(LRU)页面衰老算法来公平地选择将要从系统中抛弃的页面。 <BR> <BR>这种策略为系统中的每个页面设置一个年龄,它随页面访问次数而变化。页面被访问的 <BR> <BR>次数越多则页面年龄越年轻;相反则越衰老。年龄较老的页面是待交换页面的最佳侯选 <BR> <BR>者。 <BR>3.1.3 共享虚拟内存 <BR>虚拟内存让多个进程之间可以方便地共享内存。所有的内存访问都是通过每个进程自身 <BR> <BR>的页表进行。对于两个共享同一物理页面的进程,在各自的页表中必须包含有指向这一 <BR> <BR>物理页面框号的页表入口。 <BR>两个进程共享物理页面框号4。对进程X来说其对应的虚拟页面框号为4而进程Y的为6。 <BR>这个有趣的现象说明:共享物理页面的进程对应此页面的虚拟内存位置可以不同。 <BR>3.1.4 物理与虚拟寻址模式 <BR>操作系统自身也运行在虚拟内存中的意义不大。如果操作系统被迫维护自身的页表那将 <BR> <BR>是一个令人恶心的方案。多数通用处理器同时支持物理寻址和虚拟寻址模式。物理寻址 <BR> <BR>模式无需页表的参与且处理器不会进行任何地址转换。Linux核心直接运行在物理地址空 <BR> <BR>间上。 <BR>Alpha AXP处理器没有特殊的物理寻址模式。它将内存空间划分为几个区域并将其中两个 <BR> <BR>指定为物理映射地址。核心地址空间被称为KSEG地址空间,它位于地址0xfffffc000000 <BR>0000 <BR>以上区域。为了执行位于KSEG的核心代码或访问那里的数据,代码必须在核心模式下执 <BR>行。 <BR>Alpha上的Linux核心从地址0xfffffc0000310000开始执行. <BR>3.1.5 访问控制 <BR>页表入口包含了访问控制信息。由于处理器已经将页表入口作为虚拟地址到物理地址的 <BR>映 <BR>射,那么可以很方便地使用访问控制信息来判断处理器是否在以其应有的方式来访问内 <BR>存。 <BR>诸多因素使得有必要严格控制对内存区域的访问。有些内存,如包含执行代码的部分, <BR>显 <BR>然应该是只读的,操作系统决不能允许进程对此区域的写操作。相反包含数据的页面应 <BR>该 <BR>是可写的,但是去执行这段数据肯定将导致错误发生。多数处理器至少有两种执行方式 <BR>: <BR>核心态与用户态。任何人都不会允许在用户态下执行核心代码或者在用户态下修改核心 <BR>数 <BR>据结构。 <BR>页表入口中的访问控制信息是处理器相关的;Alpha AXP处理器的PTE(Page Table Entr <BR>y)。 <BR>这些位域的含义如下: <BR>V 有效,如果此位置位,表明此PTE有效 <BR>FOE “执行时失效”,无论合时只要执行包含在此页面中的指令,处理器都将报告页面 <BR> <BR> 错误并将控制传递 <BR>FOW “写时失效”, 除了页面错误发生在对此页面的写时,其他与上相同。 <BR>FOR “读时失效”,除了页面错误发生在对此页面的读时,其他与上相同。 <BR>ASM 地址空间匹配。被操作系统用于清洗转换缓冲中的某些入口。 <BR>KRE 运行在核心模式下的代码可以读此页面。 <BR>URE 运行在用户模式下的代码可以读此页面。 <BR>GH 将整个块映射到单个而不是多个转换缓冲时的隐含粒度。 <BR>KWE 运行在核心模式下的代码可以写此页面。 <BR>UWE 运行在用户模式下的代码可以写此页面。 <BR>page frame number <BR> 对于V位置位的PTE,此域包含了对应此PTE的物理页面框号;对于无效PTE,此域不 <BR> <BR>为0,它包含了页面在交换文件中位置的信息。 <BR>以下两位由Linux定义并使用。 <BR>_PAGE_DIRTY <BR> 如果置位,此页面要被写入交换文件。 <BR>_PAGE_ACCESSED <BR> Linux用它表示页面已经被访问过。 <BR>3.2 高速缓冲 <BR>如果用上述理论模型来实现一个系统,它可能可以工作,但效率不会高。操作系统设计 <BR> <BR>者和处理器设计者都在努力以提高系统的性能。除了制造更快的CPU和内存外,最好的办 <BR> <BR>法是在高速缓冲中维护有用信息和数据以加快某些操作。Linux使用了许多与高速缓冲相 <BR> <BR>关的内存管理策略。 <BR>Buffer Cache <BR> 这个buffer cache中包含了被块设备驱动使用的数据缓冲。 <BR> 这些缓冲的单元的大小一般固定(例如说512字节)并且包含从块设备读出或者写入 <BR> <BR> 的信息块。块设备是仅能够以固定大小块进行读写操作的设备。所有的硬盘都是块 <BR> <BR> 设备。 <BR> 利用设备标志符和所需块号作索引可以在buffer <BR> cache中迅速地找到数据。块设备只能够通过buffer <BR> cache来存取。如果数据在buffer <BR> cache中可以找到则无需从物理块设备(如硬盘)中读取,这样可以加速访问。 <BR>Page Cache <BR> 用来加速硬盘上可执行映象文件与数据文件的存取。 <BR> 它每次缓冲一个页面的文件内容。页面从磁盘上读入内存后缓存在page <BR> cache中。 <BR>Swap Cache <BR> 只有修改过的页面存储在交换文件中。 <BR> 只要这些页面在写入到交换文件后没有被修改,则下次此页面被交换出内存时, <BR> 就不必再进行更新写操作,这些页面都可以简单的丢弃。在交换频繁发生的系统 <BR> 中,Swap Cache可以省下很多不必要且耗时的磁盘操作。 <BR>Hardware Caches <BR> 一个常见的hardware <BR> cache是处理器中的页表入口cache。处理器不总是直接读取页表而是在需要时 <BR> 缓存页面的转换。这种cache又叫做转换旁视缓冲(Translation Look-aside <BR> Buffers),它包含系统中一个或多个处理器的页表入口的缓冲拷贝。 <BR> 当发出对虚拟地址的引用时,处理器试图找到相匹配的TLB入口。如果找到则直接 <BR> <BR> 将虚拟地址转换成物理地址并对数据进行处理。如果没有找到则向操作系统寻求帮 <BR> <BR> 助。处理器将向操作系统发出TLB失配信号,它使用一个特定的系统机制来将此异 <BR>常 <BR> 通知操作系统。操作系统则为此地址匹配对产生新的TLB入口。当操作系统清除此 <BR> <BR> 异常时,处理器将再次进行虚拟地址转换。由于此时在TLB中已经有相应的入口, <BR> <BR> 这次操作将成功。 <BR> 使用高速缓存的缺点在于Linux必须消耗更多的时间和空间来维护这些缓存,并且 <BR> <BR> 当缓存系统崩溃时系统也将崩溃。 <BR>3.3 Linux 页表 <BR>Linux总是假定处理器有三级页表。每个页表通过所包含的下级页表的页面框号来访问。 <BR> <BR>每个域提供了某个指定页表的偏移。为了将虚拟地址转换成物理地址,处理器必须得到 <BR>每 <BR>个域的值。这个过程将持续三次直到对应于虚拟地址的物理页面框号被找到。最后再使 <BR>用 <BR>虚拟地址中的最后一个域,得到了页面中数据的地址。 <BR>为了实现跨平台运行,Linux提供了一系列转换宏使得核心可以访问特定进程的页表。 <BR>这样核心无需知道页表入口的结构以及它们的排列方式。 <BR>这种策略相当成功,无论在具有三级页表结构的Alpha AXP还是两级页表的Intel X86处 <BR> <BR>理器中,Linux总是使 用相同的页表操纵代码。 <BR>3.4 页面分配与回收 <BR>对系统中物理页面的请求十分频繁。例如当一个可执行映象被调入内存时,操作系统必 <BR> <BR>须为其分配页面。当映象执行完毕和卸载时这些页面必须被释放。物理页面的另一个用 <BR> <BR>途是存储页表这些核心数据结构。虚拟内存子系统中负责页面分配与回收的数据结构和 <BR> <BR>机制可能用处最大。 <BR>系统中所有的物理页面用包含mem_map_t结构的链表mem_map来描叙,这些结构在系统启 <BR> <BR>动时初始化。每个mem_map_t描叙了一个物理页面。其中与内存管理相关的重要域如下: <BR> <BR>count <BR> 记录使用此页面的用户个数。当这个页面在多个进程之间共享时,它的值大于1。 <BR> <BR>age 此域描叙页面的年龄,用于选择将适当的页面抛弃或者置换出内存时。 <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -