清华大学计算机操作系统网易公开课笔记(持续更新)

本文详细解析了操作系统从开机到内存管理的全过程,涵盖开机、中断和异常、内存分层、连续分配与非连续分配、分段与分页、虚拟内存及其页面置换算法等内容。通过实例介绍了操作系统如何利用硬件机制如MMU和页表来实现逻辑地址到物理地址的映射,以及如何通过请求调页和页面置换策略优化内存利用率。
摘要由CSDN通过智能技术生成

注:本文使用的所有截图均来自于网易公开课课程

1.开机

开机的时候,内存里的bios先进行外设的自检,然后从硬盘加载bootloader到内存,然后指令转到bootloader的地址,然后再把操作系统加载到内存里,然后指令转到操作系统的地址,由操作系统接管整个机器。

2.中断和异常

中断(interrupt):来源于外设,系统调用(system call)和异常(exception)来源于应用程序。处理时间:中断异步,异常同步,系统调用异步或同步,同步指你知道这里会发生,异步指你在等待,不知道这里会不会发生。响应:中断,持续,异常,杀死或重新执行,系统调用:等待和持续。

产生中断或者异常,由哪个位置服务呢?我们有个表,一侧称为key,是中断号或者异常号,给他编号可以区分不同的外设的中断,每个编号有个地址,收到中断,查中断表,直接转到地址去执行指令。程序的保存与恢复:中断后程序回到之前状态执行。

  • 中断处理过程

硬件:外设产生中断标记,cpu看到标记可以得出是哪号中断,可以得到一个具体的中断号,把中断号发给操作系统。
软件:保存被打断的现场+中断服务程序处理+清除中断标记+恢复之前保存的处理状态。

  • 异常处理过程

异常编号,保存现场,异常处理(杀死产生异常的程序或者重新执行异常指令),恢复现场后,重点是,这里可能会修复异常指令后重新执行指令

  • 系统调用过程

系统调用接口:操作系统给应用程序提供服务。
如:应用程序代码printf触发系统调用write,包括显示设备和显示内容,获取信息后就会去执行。
操作系统有各自的高级API,应用程序一般直接调用这些高级API,比如win32API用于windows,java API用于JAVA虚拟机(jvm),POSIX用于POSIX-based system(包括unix,linux,macosx),JVM是虚拟在windows和posix上的。

  • 操作系统怎样完成系统调用的实现呢?

Interface(应用程序通过library库访问) –> 触发从用户态到内核态的转变(用户态:特权级低,不能访问特权指令和IO指令,内核态:特权级高,可以访问所有的指令,控制权从应用程序交到操作系统 -> 从系统调用ID号,等参数做标识,从而识别并完成对应服务。函数调用:一个堆栈内完成;系统调用,不同堆栈完成

3.1 计算机体系结构和内存分层

  • 体系结构

CPU,内存,设备(I/O)

  • 内存层次结构

CPU访问的数据包括指令和数据,从CPU往外:寄存器,cache,主存(即物理内存),磁盘(虚拟内存)

  • 操作系统的目标

1. 抽象:应用程序不用考虑底层的东西,只要考虑一个连续的逻辑地址空间即可
2. 保护:内存中可同时运行多个不同的应用程序,可能会需要访问想同的内存空间,可能会破坏,需要隔离。
3. 共享:很多应用程序要共享数据,进程之间要交互,使得进程之间能够安全可靠地传递数据
4. 虚拟化:当内存不够的时候,把最需要内存空间的数据放到内存里,暂时不需要访问的数据可以放到硬盘里,硬盘分配出一块虚拟空间。

CPU运行程序时,要把两个部分放到内存中:
(1) 程序本身 (2)程序要使用的数据
操作系统管理内存必须高度依赖硬件

3.2 地址空间和地址生成

  • 物理地址空间

主存和硬盘,和硬件直接对应,管理和控制由硬件完成。

  • 逻辑地址空间

一个运行的程序看到的内存空间(程序没有直接访问硬盘的权限,需要通过操作系统转化地址,并且方便应用程序自身的访问和控制)是一个简单的一维数据空间。两者形成映射。

  • 逻辑地址生成

对一个.c file从硬盘上创建编译汇编链接,再载入到内存中的全过程:(每个部分的逻辑地址都是只对它自己有意义)
1、一个c file,函数位置和变量名字就是它逻辑地址;
2、经过编译后得.s file,还是名字;
3、经过汇编,得到.o file,这时候,语句已经分布到一个它的一维的逻辑地址了,比如,jmp 75,指的是跳到逻辑地址为75的语句
4、再经过链接(多个文件),成为exe file,已经是可以执行但是目前还存放在硬盘里的程序,地址已经进行了全局的分布,不同的.o程序对应到了同一个一维逻辑地址的不同位置,从常规库开始分布,后面是各个文件语句的位置。
5、载入:放在硬盘中的exe文件,通过loader,loader也是一个应用程序,当程序被操作系统放到内存中去运行,loader在上面的逻辑地址加上一个偏移量,得到了内存中的逻辑地址。
1到5步,不需要操作系统参与,通过编译器,通过loader等,就可以完成,接下来,我们要把这个最终得到的内存中的逻辑地址转化成物理地址。
CPU有一个叫MMU,内存管理单元,里面有一块区域,表示了逻辑地址到物理地址的映射关系,也存在内存中的一个位置。我们查这个表,就能知道了。

  • CPU执行指令流程

流程:CPU执行一条指令,ALU部件需要发出请求这条指令的内容,参数就是逻辑地址,CPU就去查MMU中的映射表,如果有就找到了物理地址,如果没有就去内存的map中找,然后CPU的控制器给主存发出一个请求,需要这个物理地址的内容,主存通过总线把这个内容通过主线传到CPU,进行执行。操作系统完成的就是在这个流程之前,就建好逻辑地址到物理地址的映射关系。这个关系可以放在内存中,加快速度。

操作系统还要设置逻辑地址空间的基址和界限,以保证内存访问的正确性。超过界限,就抛出异常,按前述异常处理。

3.3 连续内存分配

内存碎片:外碎片,程序分配的区域之间的碎片;内碎片:程序分配之内的碎片
操作系统把程序从硬盘加载到内存中去,需要分配一块空间,常用的分配策略:
首次适配first fit,最优适配best fit和最差适配worst fit
first fit:从零开始,找到的第一个能放得下的空间放它
best fit:最小的可以放得下的空间放它
worst fit:最大的可以放得下的空间放它

3.4 连续内存分配:压缩式与交换式碎片整理

(一)压缩式碎片整理
重置程序以合并孔洞
要求所有程序是动态可重置的
(二)交换式碎片整理
运行程序需要更多的内存
抢占等待的程序&回收它们的内存

4.1 非连续内存分配:分段

可以更

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值