本文内容整理自西安交通大学软件学院田丽华老师的课件,仅供学习使用,请勿转载
操作系统系列笔记汇总:操作系统笔记及思维导图汇总附复习建议_Qlz的博客-CSDN博客
文章目录
文章目录
- 文章目录
- 思维导图
- Background
- Logical vs Physical Address Space
- Contiguous Allocation(连续分配)
- Paging(分页)
- Segmentation(分段)
- Segmentation with Paging(段页式)
思维导图
这章是复习时候第一个看的的章节,就没有做思维导图QAQ,这章主要就是理解重定位的原理以及分页的原理就行了
我们那次考试题里没有涉及到分段式和段页式,不过还是看看理解一下原理好了,和分页式很像
考试中出到了分页式查找的具体查询过程(带TLB),也是简答题
Background
- 程序必需放入内存并放入一个进程才能被执行
- Input queue – collection of processes on the disk that are waiting to be brought into memory for execution.
- 用户程序在执行之前必需经历很多步骤
![image-20211103230130939](https://i-blog.csdnimg.cn/blog_migrate/0ec8258a536d54fc4eb563d9e9814ee9.png)
指令与数据绑定到内存地址
指令和数据绑定到内存地址可以在三个不同的阶段发生
- Compile time(编译时期): 如果内存位置已知,可生成绝对代码;如果开始位置改变,需要重新编译代码
- Load time(装入时期): 如果存储位置在编译时不知道,则必须生成可重定位代码
- Execution time(执行时期): 如果进程在执行时可以在内存中移动,则地址绑定要延迟到运行时。需要硬件对地址映射的支持,例如基址和限长寄存器
![image-20211103230414456](https://i-blog.csdnimg.cn/blog_migrate/5a0f2c4f9ec1698d96757f15fa4d4a35.png)
![image-20211103230439856](https://i-blog.csdnimg.cn/blog_migrate/aef2fed5564d2930cf73e7ab3c0f5089.png)
Logical vs Physical Address Space
- 逻辑地址空间的概念同物理地址空间相关联,它是正确内存管理的中心。
- Logical address – generated by the CPU; also referred to as virtual address.(逻辑地址—由CPU产生;也叫做虚拟空间。)
- Physical address – address seen by the memory unit.(物理地址—内存设备所读入的地址)
- 在编译时期和装入时期的地址绑定策略生成的逻辑地址和物理地址是相同的,而在执行时的地址绑定策略是不同的。
不明白上面那句话
地址重定位
- 将程序装入到与其地址空间不一致的物理空间,所引起的一系列地址变换过程。
- 静态地址重定位:在装入一个作业时,把作业中的指令地址全部转换为绝对地址,在作业执行过程中就无须再进行地址转换工作。
- 动态地址重定位:动态地址重地位是在程序执行过程中,在CPU访问内存之前,将要访问的程序或数据地址转换成内存地址. 动态重定位依靠硬件地址变换机构完成。
Memory-Management Unit (MMU)
- 硬件把虚拟地址映射到物理地址
- 在MMU策略中,基址寄存器中的值被加入到用户进程所产生的每个地址中,在其送入内存的时候
- 用户程序所对应到的是逻辑地址,物理地址对它从来都不可见
下面几个看不懂
Dynamic Loading
- Routine is not loaded until it is called.(例程在调用之前并不加载)
- 更好的内存空间利用率;没有被使用的例程不被载入
- 当需要大量的代码来处理不经常发生的事情时是非常有用的。
- 不需要操作系统的特别支持,通过程序设计实现
Dynamic Linking
- 链接被推迟到执行时期
- Small piece of code, stub, used to locate the appropriate memory-resident library routine.(小的代码片 - 存根,用来定位合适的保留在内存中的库程序。)
- Stub replaces itself with the address of the routine, and executes the routine.(存根用例程地址来替换自己,以及执行例程。)
- Operating system needed to check if routine is in processes’ memory address.(操作系统需要检查例程是否在进程的内存空间)
Overlays
- 只是在内存中保留那些在特定时间所需要的指令和数据
- Needed when process is larger than amount of memory allocated to it.(当进程比所分配的内存大时,覆盖是必需的)
- 由用户执行,不需要操作系统的特别支持,覆盖结构的程序设计很复杂
- 要求用户清楚地了解程序的结构,并指定各程序段调入内存的先后次序,它是一种早期的主存扩充的方式
Swapping
- 一个进程可以暂时被交换到内存外的一个备份区,随后可以被换回内存继续执行
- Backing store – fast disk large enough to accommodate copies of all memory images for all users; must provide direct access to these memory images.(备份区—是一个固定的足够大的可以容纳所有用户内存映像的拷贝;可以提供对这些内存映像的直接存取。)
- 由操作系统控制,利用外存空间(进程交换区),通过对进程实体的整体交换,来满足用户进程的内存需要。它的主要特点是打破了进程运行的驻留性
Contiguous Allocation(连续分配)
存储管理方式
连续分配方式:为一个程序分配一段连续的内存空间,主要有:
-
单一连续区管理方式;
-
多分区管理方式,是一种可用于多道程序的较简单的存储管理方式,又分为:
- 固定分区方式
- 可变分区方式
-
Main memory usually divided into two partitions:(主存通常被分为两部分)
- Resident operating system, usually held in low memory with interrupt vector.(为操作系统保留的部分,通常用中断矢量保存在内存低端。)
- User processes then held in high memory.(用户进程保存在内存高端。)
Single-partition allocation
- 用户区只能容纳一道作业
- 基址寄存器策略由来保护用户进程(同其他进程和改变的操作系统代码和数据分开。)
- 基址寄存器包含最小物理地址的值;限长寄存器包含逻辑地址的范围,每个逻辑地址必需比限长寄存器的值小。
Multiple-partition allocation
固定分区分配
- 固定式分区(Fixed Partitioning)是在作业装入之前,内存就被划分成若干个固定大小的连续分区。
- 划分工作可以由系统管理员完成,也可以由操作系统实现。
- 一旦划分完成,在系统运行期间不再重新划分,即分区的个数不可变,分区的大小不可变,所以,固定式分区又称为静态分区。
- 划分分区的方法如下:
- 分区大小相等:只适用于多个相同程序的并发执行(处理多个类型相同的对象),缺乏灵活性。
- 分区大小不等:多个小分区、适量的中等分区、少量的大分区。根据程序的大小,分配当前空闲的、适当大小的分区。
![image-20211103231813100](https://i-blog.csdnimg.cn/blog_migrate/17654f8b6b574ed77d3996a9eae81566.png)
- 一般将内存的用户区域划分成大小不等的分区,可适应不同大小的作业的需要
- 系统有一张分区说明表,每个表目说明一个分区的大小、起始地址和是否已分配的使用标志
- 优点:易于实现,开销小。
- 缺点:
- 分区大小固定: 内碎片
- 分区总数固定: 限制并发执行的进程数目。
- 采用的数据结构:分区表--记录分区的大小和使用情况
可变分区方式
- 分区的划分是动态的,不是预先确定的
- 分区(Hole)—可用的内存块,不同大小的分区分布在整个内存中
- 当一个进程到来的时候,它将从一个足够容纳它分区中分配内存
- Operating system maintains information about(操作系统包含以下信息):
- allocated partitions (分配的分区)
- free partitions (hole)(空的分区)
分区分配算法
寻找某个空闲分区,其大小需大于或等于程序的要求。若是大于要求,则将该分区分割成两个分区,其中一个分区为要求的大小并标记为“占用”,而另一个分区为余下部分并标记为“空闲”。分区的先后次序通常是从内存低端到高端。具体有以下几种方法:
- First-fit(首先适应): 分配最先找到的合适的分区
- 从空闲分区表的第一个表目开始查找,把找到的第一个满足要求的空闲区分配给作业,目的在于减少查找时间。通常将空闲分区表(空闲区链)中的空闲分区要按地址由低到高进行排序。
- 特点:
- 分配和释放的时间性能较好,较大的空闲分区可以被保留在内存高端。
- 随着低端分区不断划分而产生较多小分区,每次分配时查找时间开销会增大。
- 在系统不断地分配和回收中,必定会出现一些不连续的小的空闲区,称为**外碎片**。虽然可能所有碎片的总和超过某一个作业的要求,但是由于不连续而无法分配。
- Best-fit(最佳适应): 搜索整个序列,找到适合条件的最小的分区进行分配
- 能使碎片尽量小
- 为提高查找效率,空闲分区表(空闲区链)中的空闲分区要按从小到大进行排序,自表头开始查找到第一个满足要求的自由分区分配
- 特点:
- 从个别来看,外碎片较小,但从整体来看,会形成较多无法利用的碎片。
- 较大的空闲分区可以被保留。
- Worst-fit(最差适应):搜索整个序列,寻找最大的分区进行分配
在速度和存储的利用上,首先适应和最佳适应要比最差适应好
分区释放算法
需要将相邻的空闲分区合并成一个空闲分区。(这时要解决的问题是:合并条件的判断)
- 解决碎片的方法是拼接(或称紧凑),即向一个方向(例如向低地址端)移动已分配的作业,使那些零散的小空闲区在另一方向连成一片。
- 分区的拼接技术,一方面要求能够对作业进行动态重定位,另一方面系统在拼接时要耗费较多的时间。
![image-20211103232716707](https://i-blog.csdnimg.cn/blog_migrate/5ea5bcea8a10cf34d2b9e5c0057dca68.png)
Fragmentation
- External fragmentation(外碎片) – 整个内存空间可以被用来满足一个请求,但它不是连续的。
- Internal fragmentation(内碎片) – 分配的内存可能比申请的内存大一点,存在一部分空间没有被利用
- 通过**紧缩(compaction)**来减少外碎片,把一些小的空闲内存结合成一个大的块
- 只有重定位是动态的时候,才有可能进行紧缩,紧缩在执行时期进行
- I/O problem(I/O问题)
- Latch job in memory while it is involved in I/O.(当I/O的时候,把工作锁定在内存中。)
- Do I/O only into OS buffers.(只对操作系统的缓冲区进行I/O。)
Paging(分页)
动态分区产生外碎片的原因是什么?
- 这是因为这种分配要求把作业必须安置在一连续存储区内的缘故。
- 如果允许物理地址空间非连续,则可以解决这个问题
- 分页存储管理是解决存储碎片的一种方法,要避开连续性要求,允许进程的物理地址空间不连续。
Introduction
- 进程的逻辑地址空间可以是不连续的,如果有可用的物理内存,它将分给进程
- Divide physical memory into fixed-sized blocks called frames(帧) (size is power of 2, between 512 bytes and 8192 bytes).
- Divide logical memory into blocks of same size called pages(页)
- 保留所有空闲帧的记录
- 运行一个有N页大小的程序,需要找到N个空的页框读入程序
- Set up a page table(页表) to translate logical to physical addresses. (建立一个,把逻辑地址转换为物理地址。)
- 可能会在最后一页里产生内碎片
Address Translation Scheme
Address generated by CPU is divided into(CPU产生的地址被分为):
- Page number § (页号)– 包含每个页在物理内存中的基址,用来作为页表的索引
- Page offset (d) (偏移)–同基址相结合,用来确定送入内存设备的物理内存地址
- For given logical address space $ 2^m $and page size 2 n 2^n 2n
Address Translation Architecture
Implementation of Page Table
- Page table is kept in main memory.(页表被保存在主存中)
- Page-table base register (PTBR) points to the page table.(页表基址寄存器指向页表)
- Page-table length register (PRLR) indicates size of the page table.(页表限长寄存器表明页表的长度)
- 在这个机制中,每一次的数据/指令存取需要两次内存存取,一次是存取页表,一次是存取数据
- The two memory access problem can be solved by the use of a special fast-lookup hardware cache called associative registers or translation look-aside buffers (TLBs). (通过一个联想寄存器,可以解决两次存取的问题)
Associative Register
- Associative registers – parallel search (联想寄存器—并行查找)
- Address translation (p, d)(地址转换)
- If p is in associative register, get frame # out. (如果p在联想寄存器中,把帧取出来。)
- Otherwise get frame # from page table in memory.(否则从内存中的页表中取出帧#。)
Effective Access Time
- Associative Lookup = ϵ \epsilon ϵ time unit(联想寄存器的查找需要时间 ϵ \epsilon ϵ)
- Assume memory cycle time is 1 microsecond(假设内存一次存取要1微秒)
- Hit ration – percentage of times that a page number is found in the associative registers; ration related to number of associative registers.(命中率—在联想寄存器中找到页号的比率,比率与联想寄存器的大小有关。)
- Hit ratio = α \alpha α
- Effective Access Time (EAT)(有效存取时间)
基本的地址变换机构
- 实现从逻辑地址到物理地址的转换:将用户程序中的页号变换成内存中的物理块号
- 地址变换机构:
- 页表寄存器
- 有效地址寄存器(逻辑地址寄存器)
- 物理地址寄存器
- 页表
- PCB中增加存放页表始址和页表长度的项
地址变换过程
- 按页的大小分离出页号和位移量,放入有效地址寄存器中
- 将页号与页表长度进行比较,如果页号大于页表长度,越界中断;
- 以页号为索引查找页表:将页表始址与页号和页表项长度的乘积相加,便得到该表项在页表中的位置,于是可从中得到该页的物理块号;
- 将该物理块号装入物理地址寄存器的高址部分;
- 将有效地址寄存器中的位移量直接复制到物理地址寄存器的低位部分,从而形成内存地址。
![image-20211103234009133](https://i-blog.csdnimg.cn/blog_migrate/8e9cbbeace3dcae3a848f2c861b67ada.png)
页式地址变换举例
![image-20211103234240203](https://i-blog.csdnimg.cn/blog_migrate/3865a7dd2bd7b0b42fd25fc28faaf25f.png)
Memory Protection
- Memory protection implemented by associating protection bit with each frame.(内存的保护由与每个页框相连的保护位来执行。)
- Valid-invalid bit attached to each entry in the page table
- Valid - 表明相关的页在进程的逻辑地址空间,以及是一个合法的页
- invalid - 表明页不在进程的逻辑地址空间中
![image-20211103234439415](https://i-blog.csdnimg.cn/blog_migrate/984cb16dc4940eabc22a2370ad8eae44.png)
Two-Level Page-Table Scheme
将页表进行分页。每个页面的大小与内存物理块的大小相同,并为它们进行编号,可以离散地将各个页面分别存放在不同的物理块中,为此再建立一张页表,称为外层页表(页表目录),即第一级页表,其中的每个表目是存放某个页表的物理地址。第二级才是页表(其中每个物理块上的页表叫做页表分页),其中的每个表目所存放的才是页的物理块号。
![image-20211103234516353](https://i-blog.csdnimg.cn/blog_migrate/662c20352c34cf0843af1bcdc0592616.png)
- A logical address (on 32-bit machine with 4K page size) is divided into :
- a page number consisting of 20 bits.
- a page offset consisting of 12 bits.
- Since the page table is paged, the page number is further divided into(页表页被分为):
- a 10-bit page number. (一个10位的页号。)
- a 10-bit page offset.(一个10位的偏移。)
- Thus, a logical address is as follows :
- where pi is an index into the outer page table, and p2 is the displacement within the page of the outer page table.
Address-Translation Scheme
Multilevel Paging and Performance
- Since each level is stored as a separate table in memory, covering a logical address to a physical one may take four memory accesses.(由于每一级都
- 分开的以表的形式存储在内存中,把一个逻辑地址转换为一个物理地址可能要进行4次内存存取。)
- 多级页表的引入,使逻辑地址到物理地址的变换时间增加了许多:二级页表需三次访存,三级页表需四次访存,四级页表需五次访存
- Even though time needed for one memory access is quintupled, caching permits performance to remain reasonable.(尽管每次内存存取的时间是很大的,高速缓存使执行的时间还是可以接受的。)
- Cache hit rate of 98 percent yields(如果缓存的命中率有98%)则:
which is only a 28 percent slowdown in memory access time.(这只把内存存取时间降低了28%。)
Hashed Page Tables
- Common in address spaces > 32 bits
- The virtual page number is hashed into a page table
- This page table contains a chain of elements hashing to the same location
- Virtual page numbers are compared in this chain searching for a match
- If a match is found, the corresponding physical frame is extracted
Inverted Page Table
- 通常的页表为每个进程设置一张页表,其不足之处是浪费内存空间
- 解决:倒置页表,按照整个物理内存建造一张表
- 内存中的每一块在表中占一项
- 每项包含存储在物理内存的进程的逻辑页号和进程标示
- 减少了页表占用的内存空间量,但是增加了查找表的时间,因为页表是按物理块的顺序组织的,而查找是按虚地址进行的
- Use hash table to limit the search to one — or at most a few — page-table entries.(使用哈希表来减少搜索。)
Shared Pages
- Shared code(共享代码)
- One copy of read-only (reentrant) code shared among processes (i.e., text editors, compilers, window systems).
- 共享代码出现在所有进程的逻辑地址空间的相同位置
- Private code and data (私有代码和数据)
- 每个进程保留一个代码和数据的私有拷贝
- 私有代码和数据的页可以出现在逻辑地址空间的任何地方
纯分页的特点
- 特点:
- 没有外碎片,每个内碎片不超过页大小。
- 一个程序不必连续存放。
- 程序全部装入内存。
Segmentation(分段)
- Memory-management scheme that supports user view of memory. (内存管理机制支持用户观点的内存。)
- A program is a collection of segments. A segment is a logical unit such as(一个程序是一些段的集合,一个段是一个逻辑单位,如:):
- main program,
- procedure,
- function,
- local variables, global variables,
- common block,
- stack,
- symbol table, arrays
- Logical address consists of a two tuple:
- <segment-number, offset>
- Segment table– maps two-dimensional physical addresses; each table entry has:
- base– contains the starting physical address where the segments reside in memory.(基址 - 包括内存中段物理地址的起始地址。)
- limit – specifies the length of the segment.(限长 - 指定段的长度。)
- Segment-table base register (STBR) points to the segment table’s location in memory.(
- Segment-table length register (STLR) indicates number of segments used by a program;
地址变换过程
- 系统将逻辑地址中的段号S与段表长度TL进行比较。若 S≥TL,访问越界;
- 若未越界,则根据段表的始址和该段的段号,计算出该段对应段表项的位置,从中读出该段在内存中的起始地址;
- 然后再检查段内地址d是否超过该段的段长SL。若超过,即 d≥SL,同样发出越界中断信号;
- 若未越界,则将该段的基址与段内地址d相加,得到要访问的内存物理地址。
![image-20211104000022951](https://i-blog.csdnimg.cn/blog_migrate/17268213a98d7acef2ee78192e68b3eb.png)
Segmentation Architecture
- Relocation.(重定位)
- dynamic(动态)
- by segment table (由段表来执行)
- Sharing.(共享)
- shared segments(共享的段)
- same segment number (同样的段号)
- Allocation.(分配)
- first fit/best fit(首先/最佳适配)
- external fragmentation(外碎片)
- Protection. With each entry in segment table associate(保护,每个段表的表项有):
- validation bit(有效位) = 0 ⇒ \Rightarrow ⇒ illegal segment
- read/write/execute privileges(读/写/执行权利)
- Protection bits associated with segments; code sharing occurs at segment level.(保护位同段相联系,在段的级别进行代码共享。)
- 由于段的各个长度不同,内存分配是一个动态存储-分配问题
分段的特点
- 程序通过分段(segmentation)划分为多个模块,如代码段、数据段、共享段。
- 可以分别编写和编译
- 可以针对不同类型的段采取不同的保护
- 可以按段为单位来进行共享,包括通过动态链接进行代码共享
- 特点:
- 没有内碎片,外碎片可以通过内存紧缩来消除。
- 便于改变进程占用空间的大小。
- 进程全部装入内存。
Segmentation with Paging(段页式)
- 分页和分段存储管理方式都各有其优缺点。如果对两种存储管理方式“各取所长”后,则可以形成一种新的存储管理方式的系统——段页式系统。
- 既具有分页系统能有效地提高内存利用率的优点,又具有分段系统能很好地满足用户需要的长处,是一种有效的存储管理方式。
基本原理
- 将整个主存划分成大小相等的物理块(页框)
- 把用户程序按程序的逻辑关系分为若干个段,并为每个段赋予一个段名
- 把每个段划分成若干页,以页框为单位离散分配。
- 地址结构由段号、段内页号和页内地址三部分组成
![image-20211104000258571](https://i-blog.csdnimg.cn/blog_migrate/4825e85c75820fda3cc20704a7ee25e5.png)
配置
为了实现从逻辑地址到物理地址的变换,系统中需同时配置段表和页表。
- 由于将段中的页进行离散地分配,段表中的内容不再是段的内存始址和段长,而是页表始址和页表长度。
![image-20211104000354898](https://i-blog.csdnimg.cn/blog_migrate/0855a4bfb03780252eb99dbeba4cc69d.png)
- 对于页表来说,存储的东西无变化,存储的仍是页号以及帧号
Address translation
- 在段页式系统中,有一个段表寄存器,存放段表始址和段长TL。
- 地址变换
- 将段号S与段长TL进行比较
- 若S<TL,表示未越界,于是利用段表始址和段号求出该段对应的段表项在段表中的位置,从中得到该段的页表始址与页表长度
- 将逻辑地址中的段内页号P与页表长度PL进行比较:若P<PL,则用页号来获得对应页的页表项位置,从中读出该页所在的物理块号b
- 用块号 b和页内地址构成物理地址
![image-20211104000611743](https://i-blog.csdnimg.cn/blog_migrate/5694d50bb5edb37c7a2d25ea9e6a9a10.png)
- 在段页式系统中,为了获取一条指令或数据,需三次访问内存。
- 第一次是访问内存中的段表,从中取得页表始址
- 第二次是访问内存中的页表,从中取得物理块号,并将该块号与页内地址一起形成物理地址
- 第三次才是真正从第二次访问所得到的物理地址中,取得指令或数据。