(1) 计算机的体系结构

(2) 内存的层次结构

从上到下,CPU访问的速度由快到慢,但是他们的存储容量越来越大
(3) 操作系统的目标

操作系统将很多底层的处理抽象成接口为上层提供服务,应用程序不需要知道底层是怎样实现的,只需要访问一个连续的地址空间即可(逻辑地址)
在内存中,可以运行多个不同的应用程序,可能他们之间会访问其他程序的地址空间并造成破坏,所以就需要操作系统提供一种机制保护进程间的地址空间隔离开
操作系统提供一种进程间能够安全、可靠、有效的数据传递机制
操作系统将当前的程序加载到内存中,然后暂时用不到的从内存中移动到磁盘上,这样内存中的空间就好像扩大了一样,虚拟出来更多的空间。
举个栗子:
从图中可以看出,在操作系统下有 p1~p4 四个放在内存中的程序,正在占用CPU运行的程序为P1,P2、P3、P4处于等待状态,正在运行的P1可能需要更多的空间,所以P4当前访问的数据没必要放到内存中,操作系统就将P4存储到了硬盘上
(1)什么是地址空间?

(2)地址空间是怎么生成的?
逻辑地址空间的生成: 主要分为编译、汇编、链接、载入几个步骤

以C程序(.c)为例,对于逻辑地址空间的生成是由编译器提供的
C程序通过编译得到汇编程序(.asm)
C 程序中函数的位置和变量的名字都属于它的逻辑地址,更加便于人理解
汇编程序接近机器语言,用符号代表函数和变量名,更加便于机器去理解
汇编语言通过汇编程序转化为机器语言的程序(.o)
机器语言可以把函数名和变量名转化成对应的地址,生成的地址是从零开始的连续的地址空间
通过linker将多个机器语言程序转化为单一的可执行程序(.exe)
属于可以在内存中执行,目前存放在硬盘中的程序,对逻辑地址进行全局的划分,不同机器语言程序访问不同的地址空间
硬盘中的执行程序通过loader放到内存中去运行
从符号表示的逻辑地址到可以在内存中运行的逻辑地址,整个过程不需要操作系统参与
逻辑地址映射到物理地址:
当CPU要执行某条指令时,它的ALU(计算逻辑单元)部件需要这条指令的内容,它会发出一条参数为指令逻辑地址的请求
CPU 中的MMU(内存管理单元)会去查找这个逻辑地址的映射表中是否存在对应的物理地址
CPU 的控制器会给计算机的主存发出一个请求,需要某一个物理地址的内容,内容就是指令的内容
主存会将内存的内容通过总线传给CPU,CPU获得指令之后就可以执行指令
操作系统需要在逻辑地址转化为物理地址之前将这个逻辑地址与物理地址的关系建好,这个关系可以放在内存中由CPU进行缓存,从而加快访问过程
(3)操作系统如何保护不同的进程之间相互不干扰?(安全检查机制)

操作系统确保每个应用程序访问的地址空间是合法的,并且限制在它的约束范围之内。
通过起始地址和偏移地址知道,有一块区域属于这个应用程序合理访问范围
内部碎片:在分配单元 中 未使用的内存 【没分配出去的部分】
外部碎片:在分配单元 间 未使用的内存 【分配给了应用程序,但应用程序无法进一步使用】
(1) 操作系统将应用程序从硬盘加载到内存中,这就需要分配一块连续的空间让应用程序运行
(2) 在应用程序运行的时候需要访问数据,就需要操作系统给这些数据分配一块连续的内存空间

首次适配、最佳适配、最差适配 三种分配策略

按照地址排序、根据大小匹配、相邻重分配

优势:容易产生较大的剩余空闲块,如果与其他空闲块相邻的话,那么就会提高重分配的效率【指的是 从没使用的地址开始,直到末尾,这部分的合并】
缺点:把当前块分配掉了,当下一次分配时就要从下一个块开始考虑【如果分配后都有剩余,那么持续一段时间后就会显得对内存的利用率并不是很高】

按照尺寸排序、根据大小匹配、相邻重分配
优势:避免了分割大的空闲块,使外部碎片尽可能的小
缺点:剩余很多很小的空间,不利于后续空间的管理

按照尺寸排序、大块优先匹配、相邻重分配
优势:避免了产生太多小内存块,适用于为中尺寸的需求分配空间
缺点:在后续分配过程中无大块内存可用,重分配慢


后续会对 选择哪个等待程序拷贝到硬盘中 以及 什么时候去执行换入换出操作 进行讲解!