linux下内存管理

2008-12-10 14:47
转载自:

An Abstract Model of Virtual Memory(虚拟内存的抽象模型)

进程不管是读取指令还是存取数据都要访问内存。在一个虚拟内存系统中,所有的地址都是虚拟地址而非物理地址。处理器通过操作系统保存的一组信息将虚拟地址转换为物理地址。将虚拟内存和物理内存分为适当大小的块,叫做页。要将虚拟地址转换到物理地址,处理器首先找出虚拟地址的页编号和页内偏移量。处理器必须将虚拟页编号转换到物理的页,并访问物理页的正确偏移处。为此处理器使用了页表(page tables)  

Demand Paging:
节省物理内存的一种方法是只加载执行程序正在使用的虚拟页,这种进行访问时才加载虚拟页的技术叫做Demand Paging,当一个进程试图访问当前不在内存中的虚拟地址的时候处理器无法找到引用的虚拟页对应的页表条目,处理器无法将地址转换为物理地址,这时处理器通知操作系统发生 page fault。如果出错的虚拟地址无效意味着进程试图访问它不应该访问的虚拟地址。也许是程序出错,例如向内存中任意地址写。这种情况下,操作系统会中断它,从而保护系统中其他的进程。 
如果出错的虚拟地址有效但是它所在的页当前不在内存中,操作系统必须从磁盘映像中将相应的页加载到内存中。相对来讲磁盘存取需要较长时间,所以进程必须等待直到该页被取到内存中。如果当前有其他系统可以运行,操作系统将选择其中一个运行。取到的页被写到一个空闲的页面,并将一个有效的虚拟页条目加到进程的页表中。然后这个进程重新运行发生内存错误的地方的机器指令。这一次虚拟内存存取进行时,处理器能够将虚拟地址转换到物理地址,所以进程得以继续运行。 linux使用demand paging技术将可执行映像加载到进程的虚拟内存中,当一个命令执行时,包含它的文件被打开,它的内容被映射到进程的虚拟内存中。这个过程是通过修改描述进程内存映射的数据结构来实现,也叫做内存映射(memory mapping),但实际上只有映像的第一部分真正放在了物理内存中。映像的其余部分仍旧在磁盘上。当映像执行时,它产生page fault ,Linux 使用进程的内存映像表来确定映像的那一部分需要加载到内存中执行。

Swapping:
如果进程需要将虚拟页放到物理内存中而此时已经没有空闲的物理页,操作系统必须废弃物理空间中的另一页,为该页让出空间。如果物理内存中需要废弃的页来自磁盘上的映像或者数据文件,而且没有被写过所以不需要存储,则该页被废弃。如果进程又需要该页,它可以从映像或数据文件中再次加载到内存中。但如果该页已经被改变,操作系统必须保留它的内容以便以后进行访问。这种也叫做dirty page ,当它从物理内存中废弃时,被存到一种叫做交换文件的特殊文件中。因为访问交换文件的速度和访问处理器以及物理内存的速度相比很慢,操作系统必须判断是将数据页写到磁盘上还是将它们保留在内存中以便下次访问。
如果决定哪些页需要废弃或者交换的算法效率不高,则会发生颠簸(thrashing),这时页不断地被写到磁盘上,又被读回,操作系统过于繁忙而无法执行实际的工作。Linux 使用LRU的页面技术来公平地选择需要从系统中废弃的页面。

Shared Vitual Memory(共享虚拟内存):
虚拟内存使多个进程可以方便地共享内存。所有的内存访问都是通过页表,每一个进程都有自己的页表。对于两个共享一个物理内存页的进程,这个物理页编号必须出现在两个进程的页表中。共享的物理页不必存在共享它的进程的虚拟内存空间的同一个地方。

Physical and Vitual Addressing Modes(物理和虚拟寻址模式):
大多数多用途的处理器同时支持物理地址模式和虚拟地址模式。物理寻址模式不需要页表,处理器在这种模式下不需要进行任何地址转换。Linux 核心运行在物理地址模式。

Access Control(访问控制):
页表条目也包括访问控制信息。当处理器使用页表条目将进程的虚拟地址映射到物理地址的时候,它很容易利用访问控制信息控制进程不要用不允许的方式进行访问。

Caches(高速缓存)

Buffer Cache:
包含了用于块设备驱动程序的数据缓冲区。这些缓冲区大小固定,包括从块设备读出的数据或者要写到块设备的数据。

Page Cache:
用来加快对磁盘上映像和数据的访问。它用于缓存文件的逻辑内容,一次一页,并通过文件和文件内的偏移来访问。

Swap Cache:
只有改动过的(或脏 dirty)页才存在交换文件中。只要它们写到交换文件之后没有再次修改,下一次这些页需要交换出来的时候,就不需要再写到交换文件中,因为该页已经在交换文件中了,直接废弃该页就可以了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值