学习目标:什么是操作系统?
预备知识:
前言
用户角度:操作系统是一个控制软件,用来控制和限制用户的使用
管理应用程序:
资源管理:
管理外设、分配资源
Linux.Windows.Android的界面
属于外壳(Shell),而不是内核(Kernel),Kernel是我们研究重点,在Shell之下
计算机最重要的三部分:
CPU、内存、硬盘
Kernel-操作系统系统(uCore)内部组件,包括:
OS Kernel的特征:
四个:并发、共享、虚拟、异步
一段时间
内,存在多个运行的程序运行,需要OS管理和调度;一个时间点
上,存在多个程序同时运行(需要有多核CPU才能完成)CODEING
计算机调度方式:分时调度(schedule时间片轮询,中断帮助完成分时调度)
计算机组成:CPU,内存,IO外设
操作系统启动过程:
X86:
应用程序主动向操作系统发出服务请求(应用请求)
异常:
中断:
1. 处理时间
2. 响应
中断:
异常:
系统调用
标准C库的例子:
程序访问主要是通过高层次的API接口而不是直接进行系统调用
win32 API 用于windows(可以直接系统调用)
POSIX API 用于POSIX-based systems(包括UNIX\LINUX\MacOS X的系统)
是一套通用可移植的API,只要遵循这个标准都可以执行
(可以直接产生系统调用)JAVA API用于JAVA 虚拟机(JVM)(不能直接残生系统调用,需要再去调用win32/posix)
学习目标:
操作系统是如何完成系统调用的?
用户态:应用程序的特权比较低,不能直接发送机器指令和直接访问设备IO
内核态:操作系统运行中,操作系统可以执行任何一条指令,包括机器指令,访问设备IO
函数调用和系统调用的区别?
函数调用:实际上是在一个栈空间中的调用和返回
系统调用:应用程序和操作系统都拥有各自的堆栈,当应用程序发出系统调用的时候,它需要从用户态的堆栈空间切换到内核态的堆栈空间,同时还需要特权级别的转换(用户->内核);堆栈切换和特权转换都需要一定的开销,也就意味着系统调用的会比函数调用的开销大很多,但这样做目的也为了更加安全和可靠。
知识小结:
跨越操作系统边界的开销
在执行时间上的开销超过程序调用
开销:
1 建立中断/异常/系统调用好与对应服务例程映射关系的初始化开销
2 建立内核堆栈
3 验证参数
4 内核态映射到用户态的地址空间更新页面映射权限
5 内核态独立地址空间TLB
计算机体系结构主要分为三大块:
CPU:程序和软件上的控制
内存: 主要放置程序的代码和数据
外设:满足一些功能,把数据保存在硬盘中…
CPU所访问的数据和指令所存放的位置在哪里?
CPU内部:寄存器->cache
资源很有限
CPU外部:主存->物理硬盘
速度稍慢,但是硬盘可以掉电保存数据,等再启动时CPU读入到内存
在操作系统中管理内存的不同方法:
内存的实现高度依赖于硬件
物理地址:硬件真实的地址
逻辑地址(虚拟地址):一个运行程序所拥有的内存地址
过程: .c -> .s -> .o -> xxx
* 预处理:gcc -E xxx.i xxx.c
* 编译:gcc -S xxx.S xxx.i
* 汇编:gcc -c xxx.o xxx.S
* 链接:gcc -o xxx.elf xxx.o
生成:编译->汇编->链接(编译器 符号地址空间)
运行:加载硬盘中的程序,放到内存中运行(CPU中loader,逻辑地址空间)
CPU中有一个MMU,MMU有一块区域表示了这个映射关系,正如上图中蓝色区域的地址转换过程。
当CPU要执行某一条指令时候,它的ALU固件需要这条指令的内容,他会发出这个这个请求,这个请求中带有逻辑地址,CPU中的MMU会去查询这个逻辑地址在对应的表中有没有对应的物理地址,如果有这个物理地址,那么就可以找到。
分区的动态分配
第一适配
最佳适配
最差适配
压缩式碎片整理
交换时碎片整理
碎片问题
第一适配
优势:
简单
易于产生更大空闲块,向着地址空间的结尾
劣势:
外部碎片
不确定性
把内存中分布不连续的地址空间,重新排序使得连续,从而减少内存碎片。但是会系统的内存拷贝开销会非常大
换入换出(swap)充分利用硬盘部分,p3在运行时,不够p4在内存中等待所需的空间,把p4一部分移到硬盘中(暂时把没有执行的程序放入硬盘中,等需要执行时再放入内存)
连续内存分配的缺点:
分配给一个程序的物理内存时连续的
内存利用率较低
有外碎片、内碎片的问题
非连续内存分配的优点:
一个程序的物理地址空间是非连续的
更好的内存利用和管理
允许共享代码与数据(共享库等…)
支持动态加载和动态链接
非连续内存分配的缺点:
如何建立虚拟地址和物理地址之间的转换
软件方案
硬件方案:
分段:
程序的分段地址
分段寻址方案
分页
通过段号(index)就可以找到对应到段表里面的真实项,就知道了这个项中在物理地址的限制,CPU会判断一下 一个限制是否是一个非法的操作,如果不合法的地址,会产生一个异常,kill这个进程;如果合法就会取出这个物理地址进一步处理。
问题:段表谁来建立?—>操作系统
划分物理内存至固定大小的帧(大小是2的幂,eg:512,4096,8192)
划分逻辑地址空间至相同大小的页(大小是2的幂,eg:512,4096,8192)
建立方案 转换逻辑地址为物理地址(pages to frames)
在逻辑地址上使用页
流程分析:
CPU先获取逻辑地址,逻辑地址中记录了两部分:offset偏移量(o)和pages页号
§,页号当做index索引,然后根据页号(page number)在页表基址(page base address)上的偏移, 找到页表(page table)中找到对应的帧号,然后根据帧号(frame number)和offset偏移量(o)找到实际的物理地址。
页表(page table)是谁建立的?
page table 是操作系统建立的,这样才能让程序完成映射关系,才能正常的跑
地址转换实例
解释
第一个逻辑地址(4,0)代表在页表中的第5个(01234,都是用0开始计数),flags的resident bit(是否对应物理地址的存在位)为图中标红部分(0->没有对应的帧块,物理地址不存在。1->有对应的帧块,物理地址存在)。
第二个逻辑地址(3,1023),同理即可,对应的页帧号为00100 -> 4,再根据后面的偏移量找到对应的物理地址(4,1023)。
64位计算机->寻址空间为2^64
一个页的大小 -> 1024byte -> 2^10
一个页表会多大? -> 2^64 / 2^10
页表性能问题:(空间、时间)
每个应用程序都会有一个页表,会导致栈的空间很大,浪费资源,CPU的cache放不下,需要把页表放到内存中,开销很大
如何解决?
什么是TLB?:
把我们经常访问的页表项放到TLB中,因为虽然TLB(CPU中)访问很快,但是大小是很有限的,如果TLB中有记录页表项被访问到(TLB命中),可以不经过页表,直接访问物理地址。如果TLB中没有记录页表项被访问到(TLB未命中),CPU会去访问页表,再去访问物理地址。
那会不会经常出现TLB未命中?
不会的,因为在32位系统中TLB有4K个项,可以被访问4K次。
延伸扩展:
在我们编程时候,尽量把变量和存储放到一个位置,减小TLB的开销
二级页表产生原因?
由于上节说到页表占用的空间太大,那如何使得页表占用的空间尽量小,引入二级页表。
寻址流程:
CPU是知道一级页表的起始地址的,然后根据p1的number作为index查到一级页表中的page table项,一级页表中存的这个值是二级页表的起始位置(如图箭头所示),然后根据p2的number作为Index(一级页表的address+p2Number)查到二级页表的帧号(frame number),再用帧号加上对应的offset偏移量得到相应的物理地址。页的offset与帧的offset是一样的
优点:
省空间 -> 如果p1中查不到对应的p2映射,那么就不用保留p2在内存中
明白了二级页表进一步也推出多级页表
优点
省空间,时间换取空间
比如我们的64位操作系统可以用5级页表表示,随着页表的增多开销随之越来越大
这里不赘述了,想学习的小伙伴自己学一下
由静态的程序,加载到内存中,成为动态的进程
一个进程应该包含:
程序的代码
程序处理的数据
程序计数器中的值,指示下一条将运行的指令
一组通用的寄存器的当前值,堆、栈
一组系统资源(如打开的文件)
程序与进程的区别?
进程是动态的,程序是静态的:程序是有序代码的集合;进程是程序的执行,进程有核心态/用户态
为什么进程有核心态和用户态的区分?
一个进程不止在用户态上操作,比如需要读写硬盘这些外设,都需要由操作系统去完成
进程是暂时的,程序是永久的:进程是一个变化的过程,程序是可以永久保存
进程与程序的组成不同,进程的组成包含:程序、数据、进程控制块(即进程状态信息)
进程运行不是一直执行的,会被优先级更高的进程打断,然后再进行执行
并发并行(多核)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OfNQrvL2-1660920031852)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209125839929.png)]
进程创建
引起进程创建的3个主要过程:
系统初始化
用户请求创建一个新进程
正在运行的进程执行了创建进程的系统
为什么会从running变为ready?
因为系统的内存资源和CPU的处理是有限的,当有多个程序在运行时,如果一个程序在规定的时间片内没有完成,就会被切换为下一个进程去执行,也就是从running变为ready。
可能的状态变化如下:
NULL->New:一个新进程被产生出来执行一个程序
New->Ready:当进程被创建完成并初始化后,一切就绪准备运行时,变为就绪状态。是否会持续很久->不会,因为OS创建pcb是很快的
Ready->Running:处于就绪状态的进程被进程调度程序选中后,就分配到处理机上来运行。
Running->Exit:当进程便是它已经完成或者因出错,当前运行进程会有操作系统作结束处理
Running->Ready:处于运行状态在其运行过程中,由于分配给它的处理机时间片用完而让出处理机谁完成?->操作系统
Running->Blocked:当进程请求某样东西且等待时
Blocked->Running:当进程要等待某事件到来时,它从阻塞状态到就绪状态
挂起状态
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MIOrDwlj-1660920031857)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209135112740.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i4uSXYbb-1660920031857)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209135301624.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BBFOLIyy-1660920031857)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209135706333.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nDm8hqiH-1660920031858)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209141341809.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rbQxKfYn-1660920031858)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209141653807.png)]
系统资源分配的最小单位,系统调度的最小单位?
如何理解这句话:
进程主要就是负责资源的管理(打开文件,访问网络…)
线程成为了进程组成的重要部分,一个进程中的所有线程共享该进程的所有资源
一个线程组成:code(代码段),Initialized data(数据段),stack(堆栈)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7lJ0RifA-1660920031858)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209142213138.png)]
如何理解线程的缺点:
线程能够共享一个进程的所有资源,若某个线程由于意外破坏了某个资源,其他线程访问这个资源也会出错.如果一个线程崩溃了,所有线程都会崩溃,进程也会挂掉.
什么时候用线程什么时候用进程?
强调性能使用线程,强调安全性使用进程
eg:你浏览器创建的所有网页都是线程,如果一个线程崩溃了,会导致所有网页不能打开,浏览器都崩溃了,这样的设计就不好!!!!!!!! ---> chrome都是使用进程模式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1LWBbMsz-1660920031858)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209143200417.png)]
进程时资源分配单位,线程是CPU调度单位
资源:内存,文件,网络…
cpu调度单位:一些控制流所需要的信息
进程拥有一个完整的资源平台,而线程只独享必不可少的资源
线程同样具有就绪,阻塞和执行三种基本状态,同样具有状态之间的转换关系
线程能减少并发执行的时间和空间开销
1 线程的创建时间比进程短
因为进程要创建内存去管理,创建文件去管理
线程直接使用进程已经创建好的内存和文件
2 线程的终止时间比进程短
同上同理
3 同一进程内的线程切换时间比进程短
因为同一个进程中的线程拥有相同的页表,所以切换快
切换进程时它们的页表都是不同的
4 由于同一进程的各线程间共享内存和文件资源,可直接进行不通过内核通信
同一个线程它们使用的地址是相同的,直接访问地址即可
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vlrM1f2k-1660920031859)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209145105828.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aV0RHi6g-1660920031859)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209145250601.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nPW6HhpY-1660920031859)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209145353390.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JwrDq0rA-1660920031859)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209145628846.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M4HATWru-1660920031860)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209145802784.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sEdONlJU-1660920031860)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209145839329.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d5iKAdGS-1660920031860)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209150106717.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iPkdGiI5-1660920031861)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209150334203.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-elNecVkS-1660920031861)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209150453952.png)]
什么时上下文切换?
process P0运行时要上下文切换,它要把进程寄存器信息保存在PCB中,把另一个进程process p1寄存器信息的PCB恢复CPU中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bmxt4Fzk-1660920031862)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209150722211.png)]
进程的创建
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wBMFWjsC-1660920031862)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209151001342.png)]
exec会把另外一个程序覆盖之前的进程代码段,PCB时不变的,如果执行了why would I execute证明exec执行失败
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Im1IiSS7-1660920031862)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209151513125.png)]
|
|
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7DOqjOuB-1660920031863)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209151623736.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jrz7Unte-1660920031863)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209151704753.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sHxg9QAV-1660920031864)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209151823996.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pJnU10aN-1660920031864)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209151849806.png)]
这是很方便去执行一个新的进程
fork优化
因为fork会拷贝父进程的资源,开销大,你要执行exec是不需要之前父进程的资源,所以拷贝过程是多余的 使用vfork:不会复制所有的资源
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gtD8pN7U-1660920031865)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209152001586.png)]
现在系统基本都是COW
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qLkaI261-1660920031865)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209154050685.png)]
上下文切换
CPU调度
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g81CdttI-1660920031866)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211215211452357.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YUmBuMIW-1660920031866)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211215211622392.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oufOa0z6-1660920031866)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211215213740242.png)]
虚拟文件系统:/proc…