前言:
之前有粗略的学过一遍操作系统,但是很多细节都有所忘记了,这一次通过观看b站上清华大学的操作系统课程为主,之前看过的哈工大的操作系统课程为辅,再结合书本和微信公众号上的好文章进行总结
观看顺序与课程的顺序相同,即内存管理->进程管理->文件系统管理->输入输出设备管理
第一部分:连续式内存分配
1.1计算机体系结构及内存分层体系
1)计算机体系结构
2)内存分层体系
这两张图很好的显式了内存的分层及内存的结构
3)操作系统在内存管理中要完成的目标
-
抽象:由于操作系统的存在希望应用进程在运行时不需要考虑底层的细节,比如物理内存、外设位置等,,只需访问一个连续的地址空间,即逻辑地址空间
-
保护:操作系统希望提供一种有效机制保护不同的应用进程之间的地址空间是隔离的,不能非法的访问
-
共享:操作系统提供一种机制使得不同的应用进程可以访问相同的内存
-
虚拟化:通过虚拟化使得内存大大提升,由于程序的局部性原理,把目前需要的代码/数据放置在物理内存中,将不需要的数据放在外存(机械硬盘、固态硬盘),而操作系统向应用程序屏蔽这种机制,使得应用程序认为内存很大
4)操作系统的内存管理高度依赖硬件 -
必须知道内存架构
-
MMU(内存管理单元):位于CPU中,负责处理CPU的内存访问请求
1.2地址空间与地址生成
1)地址空间定义 -
物理地址空间:硬件支持的地址空间
-
逻辑地址空间:一个运行的程序所拥有的内存范围
一个逻辑地址空间都是落实在一个物理地址空间中存在的,而这其中的映射关系(逻辑地址空间->物理地址空间)是需要操作系统进行管理的
2)逻辑地址的生成 -
编译:将c程序变成汇编程序
-
汇编:将汇编程序转化为机器语言,把变量符号名、函数符号名转化为相应的地址
-
链接:将多个.o程序链接成一个单一的执行程序,一个存放在硬盘中的可执行程序
-
载入(程序重定位):将程序从硬盘中载入内存,仍然是逻辑地址,从符号表示的逻辑地址变成了最终可以在内存中运行的具体的逻辑地址
3)物理地址的生成
-
CPU计算逻辑单元ALU需要在逻辑地址的内存内容,发出请求
-
CPU中的内存管理单元MMU查表寻找逻辑地址与物理地址的映射关系
-
CPU控制器从总线发送在物理地址的内存内容的请求
-
内存通过总线将物理地址的内存内容发送给CPU
-
CPU拿到指令内容即可进行执行
其中,操作系统的作用是把这其中逻辑地址与物理地址的映射关系建立好
4)地址安全检查
1.3连续内存分配:内存碎片与分区的动态分配
1)内存碎片问题
-
内部碎片:已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间内部碎片 占有这些区域或页面的进程并不使用这个存储块,直到进程释放它或进程结束时,系统才有可能利用这个存储块,常见于固定分区
-
外部碎片:指的是还没有被分配出去(不属于任何进程),但由于太小了无法分配给申请内存空间的新进程的内存空闲区域,处于任何两个已分配区域或页面之间的空闲存储块。这些存储块的总和可以满足当前申请的长度要求,但是由于它们的地址不连续或其他原因,使得系统无法满足当前申请。
2)分区的动态分配
分区:是指按进程为单位进行划分内存