操作系统最核心的部分就是放在内核中
操作系统内核需要运行在内核态 非内核功能运行在用户态
大内核的体系结构:
**所有的内核部分都是运行在内核态。 **
**高性能 **
内核庞大, 结构混乱, 难以维持。
微内核的体系结果
对比大内核, 他只将
这些作为内核部分运行在内核态
内核功能少, 结构清晰, 方便维持。
需要频繁的在用户态 和 内核态之间切换 ,性能低。
就上图而言, p1, p2 ,p3 ,p4 这四个进程在执行相对应的应用程序, 假设p1 先执行, p4 最后执行,那么我们就可以暂时将p4所需要的资源放到 磁盘中, 暂缓放到内存中 。而将真正需要内存的p1所需要的资源放到 内存中。
实现高度依赖于硬件, 其中**内存管理单元(MMU)**负责处理CPU的内存访问请求
物理地址空间 : —–直接对应硬件支持的地址空间 逻辑地址空间: ——-一个运行的程序, 他所看到的空间(所拥有的内存范围),是一个一维的线性空间 两者的映射关系是由操作系统去协调
通过MMU表达了这种映射关系
通过下面的步骤进行检查
**简单的内存管理方法: **
分配策略
按照地址顺序的空间块列表 分配需要寻找一个合适的分区
** 在内存中找到最小的空闲块, 分配给应用程序**
为了避免有太多微小的碎片 需求:
分配方式 | 第一匹配分配 | 最优适配分配 | 最差适配分配 |
---|---|---|---|
优势 | 简单 / 易于产生更大空闲块 | 比较简单 / 大部分分配是小尺寸时高效 | 分配很快 / 大部分分配是中尺寸时高效 |
劣势 | 产生外部碎片 / 不确定性 | 产生外部碎片 / 重分配慢 / 产生很多没用的微小碎片 | 产生外部碎片 / 重分配慢 / 易于破碎大的空闲块以致大分区无法被分配 |
答:连续分配的缺点就是会带来各种缺点, 内存利用率低, 外碎片、内碎片等问题。 随意** ** 非连续分配的优点 :
**非连续内存分配机制的缺点 : **
两种硬件方案:
在程序中会有来自不同文件的函数 ; 在程序执行时, 不同的数据也有不同的字段, 比如 : 堆 / 栈 / .bss / .data 等 分段 : 更好的分离和共享 程序的分段地址空间如下图所示 :
逻辑地址空间连续,但是物理地址空间不连续,使用映射机制进行关联. 一个段 : 一个内存”块” 程序访问内存地址需要 : 一个二维的二元组(s, addr) → (段号, 地址) 操作系统维护一张段表, 存储(段号, 物理地址中的起始地址, 长度限制) 物理地址 : 段表中的起始地址 + 二元组中的偏移地址
硬件实现方案:
需要知道页号 + 页类的偏移 划分物理内存至固定大小的帧(Frame)
划分逻辑地址空间至相同大小的页(Page)
建立方案 → 转换逻辑地址为物理地址(pages to frames)
物理内存被分割为大小相等的帧. 一个内存物理地址是一个二元组(f, o) → (帧号, 帧内偏移) 帧号 : F位, 共有2^F个帧 帧内偏移 : S位, 每帧有2^S个字节 物理地址 = 2^S * f + o (例子 : 16-bit地址空间, 9-bit(512 byte) 大小的页帧 物理地址 = (3,6) 物理地址 = 2^9 * 3 + 6 = 1542) 分页和分段的最大区别 : 这里的 S 是一个固定的数, 而分段中的长度限制不定
一个程序的逻辑地址空间被划分为大小相等的页. 页内偏移的大小 = 帧内偏移的大小 页号大小 <> 帧号大小 一个逻辑地址是一个二元组(p, o) → (页号, 页内偏移) 页号 : P位, 共有2^P个页 页内偏移 : S位, 每页有2^S个字节 虚拟地址 = 2^S * p + o 页的寻址机制
分页机制的偏移大小是固定的。
页表结构
每一个运行的程序都有一个页表
他是一块特殊的缓冲地。也可以说是cache。有效的解决了访问速度的问题。
也就是缓解时间问题
Translation Look-aside Buffer(TLB) 是一个缓冲区. CPU中有快表TLB(可以将经常访问的页表存放在这边)
缓存近期访问的页帧转换表项
逻辑框图
页表的缓冲流程
CPU根据程序的page的页号的若干位, 计算出索引值index, 在页表中搜索这个index, 得到的是帧号, 帧号和原本的offset组成物理地址.
上述我们可以知道, 页表可以解决时间上的问题, 但是如何解决空间上的问题呢 ?
这里我们可以通过二级页表乃至多级页表来解决
也就是我们常说的时间换空间
二级页表:
简单来说, 我们如果不知道物理地址空间大小, 那么就只能通过逻辑地址空间来建立, 这样就会浪费很多的空间。因为我们不知道实际的物理地址空间。
所以这里假设出了一种想法, 就是通过物理地址空间的大小来建立页表 。这样就可以避免了浪费。
方案一: : 基于页寄存器的方案
在页表中我们要解决的问题就是怎么通过页号 来找到页帧号
存储 (帧号, 页号) 使得表大小与物理内存大小相关, 而与逻辑内存关联减小.
每一个帧和一个寄存器关联, 寄存器内容包括 :
实例 :
优势 :
劣势 :
方案二 :基于关联内存的方案
硬件设计复杂, 容量不大, 需要放置在CPU中
所以这种一般不实用
方案三: 基于哈希(hash)的方案
哈希函数 : h(PID, p) 从 PID 标号获得页号
在反向页表中通过哈希算法来搜索一个页对应的帧号