当前位置:   article > 正文

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

计算机操作系统 网易

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

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 非连续内存分配:分段

可以更好的利用碎片,需要从逻辑地址到物理地址的转换:软件方案带来开销太大,所以要和硬件进行结合。
主要方法:分段方法和分页方法。

分段方法核心问题

如何寻址和怎么实现分段寻址机制?

  • 思想
    连续逻辑地址分段后放在不连续的不同段的物理地址中。
  • 寻址
    一个逻辑地址,分为一个段号s和段内偏移offset的二元组(s,offset),可以是段寄存器+地址寄存器方案,也可以是两个接在一起的单地址方案。
  • 实现
    一个程序,通过CPU执行每条指令,CPU就要进行寻址,即具体的物理地址在哪,逻辑地址分成两部分,第一部分是段号,第二部分是段偏移,操作系统建立一个段表,对于一个逻辑地址的段号作为索引index,在段表里查找出唯一一个二元组(base,limit),这个二元组对应的是物理地址的基址和界限,然后再基址的基础上加上偏移offset即为物理地址。如果超过了界限,就按之前说的,抛出异常,按异常的方法进行处理,流程如下图:

4.2 非连续内存分配:分页

和分段一样,也需要页号和页的偏移

把物理内存划分为固定大小的帧;把逻辑地址划分至相同大小的页

划分大小是2的幂,划分数量也是2的幂,这样就能把页号,帧号和页内偏移,帧内偏移都用二级制的位数来代替。

一个物理地址是二元组(f,o)f是帧号,共有2(f)个帧

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/631939
推荐阅读
相关标签
  

闽ICP备14008679号