刚刚花了两个半小时把OSC的第八章-Main Memory读完了,在这里用自己的话总结一下记的笔记。
8.1 Background
第一小节是背景知识介绍。
8.1.1首先提到的是基本的硬件,寄存器、内存和高速缓存(Cache)。还介绍了protection,说用户模式(user mode)下,程序访问的内存空间是有限制的,protection的概念贯穿于整个章节。8.1.2介绍了地址转换机制(address binding),程序在执行的时候会把相应的地址读入到内存中。8.1.3介绍了逻辑地址(logical address)和物理地址(physical address)的概念,逻辑地址指的是CPU产生的地址,而物理地址则指的是内存所”见到”的地址。这两个概念很重要,貌似整个一章都在讨论如何在将logical address转换成physical address。8.1.4和8.1.5介绍了动态读取(dynamic loading)和动态链接(dynamic linking),前者是指一段程序只有当被调用时才会读取。后者是跟静态链接(static linking)相对的一个概念,具体看得不是很明白。
8.2 Swapping
swapping技术可以将进程在内存和一个叫做backing store的地方调来调去。比如一个进程所需要的内存不够了,就可以把它swap out到backing store,等到有足够内存时再把它swap in接着执行。
8.3 Contiguous Memory Allocation
首先呢,内存总是被分为两部分,一部分留给操作系统,另一部分则给用户进程所使用。
8.3.1介绍两种寄存器:relocation register, limit register。前者存有物理地址的最小值,后者存储逻辑地址的最大值。8.3.2介绍了内存的分配方式。最简单的一种是把内存分成为几个固定大小(fixed-sized)的区域(partition)。之后还介绍了hole的概念,指的是内存中所有可以被使用的部分。还介绍了三种分配holes的算法:first-fit, best-fit, worst-fit。8.3.3介绍了碎片(fragmentation)。碎片分为external fragmentation和internal fragmentation两种。前者指的是在分配内存的时候,即使有足够大小的空间,可是这些空间不是连续的。而后者指分配给进程的空间可能会大于进程实际需要的空间,这种碎片主要产生在固定区域大小的分配方式时。最后提到了针对碎片的解决方案:分页(paging)和分段(segmentation),这两大技术也是本章剩余部分着重讨论的内容。
8.4 Paging
分页技术允许一个进程跨越不连续的物理空间。
8.4.1首先介绍两个概念:frames, pages。前者是将物理空间划分成相同大小的部分,后者是将虚拟逻辑空间划分成相同大小的部分。最基本的情况是逻辑地址分成两部分:page number, page offset。在将逻辑地址转换成物理地址时,先通过page table查找将page number转换成frame number,则物理地址由frame number,page offset两部分组成。paging的一个特点是将用户所看到的内存与实际物理的内存分开了。8.4.2谈了硬件对分页技术的支持。最简单的情况是用一堆寄存器来做为page table。可是当page数量特别大的时候,这种方法就不可行了。容易想到的方法是把page table放到内存中去,可是这样子效率太低了。现在的标准做法是使用高速缓存,这种技术被称为 TLB。TLB中的每一项(entry)由两部分组成:key, value。这样子,当查找page number的时候会先到TLB中去查找,找不到再去内存中找,同时将该项添加到TLB中以方便下一次查找。此外,TLB还有一个很重要的参数是命中率(hit ratio)。8.4.3介绍了如何使用paging技术来进行保护,大概意思是当对page number进行转换时会判断转换后的物理地址是否是有效的(valid)。8.4.4介绍了shared pages技术,多个进程可以共享同样的pages。
8.5 Structure of the Page Table
该小节介绍了若干种组织page table的方式。
8.5.1介绍了分层法(Hierarchical Paging),当page特别多的时候,可以将page分成两层。通过外层 page number检索到内层page number,再通过内层page number来检索物理地址。8.5.2介绍了利用哈希表来组织 page table。8.5.3介绍一种inverted page tables的技术,不过看得不是很懂。
8.6 Segmentation
分段技术就像我们写x86汇编的时候,把程序分成不同的段。每一段映射到内存的一部分,然后每一段中的偏移在转换成物理地址时要加上段的基地址(base),同时不能超过每一个段的限制(limit)。
8.7 Example: The Intel Pentium
介绍了Intel Pentium中的segmentation和paging技术,没仔细看,也不太明白。
8.8 Summary
貌似外国人写书都喜欢每一章最后一节总结一下~~~
OS第二次实验学长忘记挖空了,要我们分析代码然后写一个详细的报告……还不如填代码呢:(
只好先补一补操作系统关于内存管理部分的知识了。
本来想今晚把虚拟内存一章也看了,不过貌似精力已经不能很集中了