本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。
小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
- 操作系统的作用:通过资源管理提高计算机系统的效率;改善人机界面向用户提供友好的工作环境。
- 操作系统的特征:并发性、 共享性、虚拟性、不确定性。
- 操作系统的功能:进程管理、存储管理、文件管理、设备管理、作业管理。
- 操作系统的分类:批处理操作系统、分时操作系统(轮流使用CPU工作片)、实时操作系统(快速响应)、网络操作系统、分布式操作系统(物理分散的计算机互联系统)、微机操作系统(Windows)、嵌入式操作系统。
- 嵌入式系统初始化过程按照自底向上、从硬件到软件的次序依次为:
- 片级初始化
- 板级初始化
- 系统初始化
- 芯片级是微处理器的初始化,板卡级是其他硬件设备初始化,系统级初始化就是软件及操作系统初始化。
- 计算机启动的基本流程为: BIOS->主 引导记录>操作系统。
一 进程管理
1.1 进程的组成和状态
- 进程的组成:进程控制块PCB (唯- -标志)、程序(描述进程要做什么)、数据(存放进程执行时所需数据)。
- 进程基础的状态是下左图中的三态图,这是系统自动控制时只有三种状态,而下右图中的五态,是多了两种状态:静止就绪和静止阻塞,需要人为的操作才会进入对应状态,活跃就绪即就绪,活跃阻塞即等待。
上图可知,当人为干预后,进程将被挂起,进入静止状态,此时,需要人为激活,才能恢复到活跃状态,之后的本质还是三态图。
1.2前趋图和进程资源图
1.2.1 前趋图
用来表示哪些任务可以并行执行,哪些任务之间有顺序关系,具体如下图:
1.2.2 程资源图
用来表示进程和资源之间的分配和请求关系,如下图所示:
-
P代表进程,R代表资源,R方框中有几个圆球就表示有几个这种资源,在上图中,R1指向P1,表示R1有一个资源已经分配给了P1, P1 指向R2,表示P1还需要请求-一个R2资源才能执行。
-
阻塞节点:某进程所请求的资源已经全部分配完毕,无法获取所需资源,该进程被阻塞了无法继续。如上图中P2。
-
非阻塞节点:某进程所请求的资源还有剩余,可以分配给该进程继续运行。如_ 上图中P1、P3。
-
当一个进程资源图中所有进程都是阻塞节点时,即陷入死锁状态。
-
进程资源图的化简方法:先看系统还剩下多少资源没分配,再看有哪些进程是不阻塞的,接着把不阻塞的进程的所有边都去掉,形成一一个孤立的点,再把系统分配给这个进程的资源回收回来,这样,系统剩余的空闲资源便多了起来,接着又去看看剩下的进程有哪些是不阻塞的,然后又把它们逐个变成孤立的点。最后,所有的资源和进程都变成孤立的点。
1.3 进程间的同步与互斥
-
互斥和同步并非反义词,互斥表示一个资源在同一时间内只能由一个任务单独使用,需要加锁,使用完后解锁才能被其他任务使用;
-
同步表示两个任务可以同时执行,只不过有速度上的差异,需要速度上匹配,不存在资源是否单独或共享的问题。
1.4 PV操作信号量
1.4.1 基本概念
- 临界资源:各个进程间需要互斥方式对其进行共享的资源,即在某一一时刻只能被-一个进程使用,该进程释放后又可以被其他进程使用。
- 临界区:每个进程中访问临界资源的那段代码。
- 信号量:是一种特殊的变量。
- 互斥信号量,对临界资源采用互斥访问,使用互斥信号量后其他进程无法访问,初值为1。
- 同步信号量,对共享资源的访问控制,初值是共享资料的个数。 PV操作
PV操作是荷兰人Dijkstra发明的。是一种算法思维。
P:翻译成荷兰语passeren, 申请的意思。
V::翻译成荷兰语vrijgeven, 释放的意思。
- 解决互斥和同步的问题。PV操作是分开来看的
- P操作:申请资源,使S=S-1,若 S< 0就排入等待队列等待,大于等于O就继续执行。返回的结果是
等待 或 继续执行(通过)。 - V操作:释放资源,使S=S+1,若S<=0,发送信号唤醒等待队列中的一个进程。可能返回的结果是
唤醒。
1.5 进程调度
进程调度方式是指当有更高优先级的进程到来时如何分配 CPU。分为可剥夺和不可剥夺两种,可剥夺指当有更高优先级进程到来时,强行将正在运行进程的CPU分配给高优先级进程;不可剥夺是指高优先级进程必须等待当前进程自动释放CPU。
三级调度:高级调度(又称长调度或作业调度,决定哪个作业可以调入系统中)、高级调度(又称对换调度,决定哪个就绪进程可以调入内存中)、低级调度(又称进程调度,决定内存中哪个就绪进程可以占用CPU)。
1.5.1 调度算法:
- 先来先服务FCFS:先到达的进程优先分配CPU。用于宏观调度。
- 时间片轮转:分配给每个进程CPU时间片,轮流使用CPU,每个进程时间片大小相同,很公平,用于微观调度。
- 优先级调度:每个进程都拥有一个优先级,优先级大的先分配CPU。
- 多级反馈调度:时间片轮转和优先级调度结合而成,设置多个就绪队列 1,2,3..n,每个队列分别赋予不同的优先级,分配不同的时间片长度;新进程先进入队列1的末尾,按FCFS原则,执行队列1的时间片;若未能执行完进程,则转入队列2的末尾,如此重复。
1.6 死锁问题
当一个进程在等待永远不可能发生的事件时,就会产生死锁,若系统中有多个进程处于死锁状态,就会造成 系统死锁。
死锁产生的四个必要条件:
- 资源互斥、
- 每个进程保持和等待其他资源、
- 系统不能剥夺进程资源、
- 进程资源图是一个环路。
死锁产生后,解决措施是打破四大条件,有下列方法: 死锁预防:采用某种策略限制并发进程对于资源的请求,破坏死锁产生的四个条件之一,使系统任何时刻都不满足死锁的条件。
1.6.1 死锁避免
一般采用银行家算法来避免,银行家算法,就是提前计算出一条不会死锁的资源分配方法,才分配资源,否则不分配资源,相当于借贷,考虑对方还得起才借钱,提前考虑好以后,就可以避免死锁。银
- 死锁检测:允许死锁产生,但系统定时运行一个检测死锁的程序,若检测到系统中发生死锁,则设法加以解除。
- 死锁解除::即死锁发生后的解除方法,如强制剥夺资源,撤销进程等。
- 死锁资源计算:系统内有n个进程,每个进程都需要R个资源,那么其发生死锁的最大资源数为n*(R-1)。其不发生死锁的最小资源数为 n * (R-1) + 1
1.7 线程
传统的进程有两个属性:
- 可拥有资源的独立单位
- 可独立调度和分配的基本单位。 引入线程后,线程是独立调度的最小单位,进程是拥有资源的最小单位,线程可以共享进程的公共数据、全局变量、代码、文件等资源,但不能共享线程独有的资源,如线程的栈指针等标识数据。
二 存储管理
存储器的结构:寄存器——高速缓存Cache——主存——外存。
地址重定位:将逻辑地址转换为实际主存物理地址的过程,分为静态重定位(在程序装入主存时就完成了转换)、动态重定位(边运行边转换)。
2.1 分区存储管理
所谓分区存储组织,就是整存,将某进程运行所需的内存整体一起分配给它,然后再执行。有三种分区方式:
- 固定分区:静态分区方法,将主存分为若干个固定的分区,将要运行的作业装配进去,由于分区固定,大小和作业需要的大小不同,会产生内部碎片。
- 可变分区:动态分区方法,主存空间的分区是在作业转入时划分,正好划分为作业需要的大小,这样就不存在内部碎片,但容易将整片主存空间切割成许多块,会产生外部碎片。可变分区的算法如下: 系统分配内存的算法有很多,如下图所示,根据分配前的内存情况,还需要分配9K空间,对不同算法的结果介绍如下:
- 首次适应法:按内存地址顺序从头查找,找到第一个>=9K空间的空闲块,即切割9K空间分配给进程。
- 最佳适应法:将内存中所有空闲内存块按从小到大排序,找到第一个>=9K空间的空闲块,切割分配,这个将会找到与9K 空间大小最相近的空闲块。
- 最差适应法:和最佳适应法相反,将内存中空闲块空间最大的,切割9K空间分配给进程,这是为了预防系统中产生过多的细小空闲块。
- 循环首次适应法:按内存地址顺序查找,找到第一个>=9K空间的空闲块,而后若还需分配,则找下一个,不用每次都从头查找,这是与首次适应法不同的地方。
- 可重定位分区:可以解决碎片问题,移动所有已经分配好的区域,使其成为一个连续的区域,这样其他外部细小的分区碎片可以合并为大的分区,满足作业要求。只在外部作业请求空间得不到满足时进行。
2.2 页式存储管理
如果采用分区存储,都是整存,会出现一个问题,即当进程运行所需的内存大于系统内存时,就无法将整个进程一起调入内存,因此无法运行,若要解决此问题,就要采用段页式存储组织,页式存储是基于可变分区而提出的。
先介绍页式存储组织,将进程空间分为一个个页,假设每个页大小为4K,同样的将系统的物理空间也分为一个个4K大小的物理块,这样,每次将需要运行的逻辑页装入物理块中,运行完再装入其他需要运行的页,这样就可以分批次运行完进程,而无需将整块逻辑空间全部装入物理内存中,解决了空间极大的进程的运行问题。
如下图所示,逻辑页分为页号和页内地址,页内地址就是物理偏移地址,而页号与物理块号并非按序对应的,需要查询页表,才能得知页号对应的物理块号,再用物理块号加上偏移地址才得出了真正运行时的物理地址。
- 优点:利用率高,碎片小,分配及管理简单。
- 缺点:增加了系统开销,可能产生抖动现象
2.2.1 地址表示和转换
- 地址组成:页地址+页内偏移地址;(页地址在高位,页内偏移地址在低位
- 物理地址:物理块号+页内偏移地址;
- 逻辑地址:页号+页内偏移地址; 物理地址和逻辑地址的页内偏移地址是一样的,只需要求出页号和物理块号之间的对应关系,首先需要求出页号的位数,得出页号,再去页表里查询其对应的物理块号,使用此物理块号和页内偏移地址组合,就能得到物理地址。
2.2.2 页面置换算法
有时候,进程空间分为100个页面,而系统内存只有10个物理块,无法全部满足分配,就需要将马上要执行的页面先分配进去,而后根据算法进行淘汰,使100个页面能够按执行顺序调入物理块中执行完。
缺页表示需要执行的页不在内存物理块中,需要从外部调入内存,会增加执行时间,因此,缺页数越多,系统效率越低。页面置换算法如下:
- 最优算法:OPT,理论上的算法,无法实现,是在进程执行完后进行的最佳效率计算,用来让其他算法比较差距。原理是选择未来最长时间内不被访问的页面置换,这样可以保证未来执行的都是马上要访问的。
- 先进先出算法:FIFO,先调入内存的页先被置换淘汰,会产生抖动现象,即分配的页数越多,缺页率可能越多(即效率越低).
- 最近最少使用:LRU,在最近的过去,进程执行过程中,过去最少使用的页面被置换淘汰,根据局部性原理,这种方式效率高,且不会产生抖动现象,使用大量计数器,但是没有LFU多。
- 淘汰原则:优先淘汰最近未访问的,而后淘汰最近未被修改的页面。
2.2.3 快表
是一块小容量的相联存储器,由快速存储器组成,按内容访问,速度快,并且可以从硬件上保证按内容并行查找,一般用来存放当前访问最频繁的少数活动页面的页号。
快表是将页表存于Cache 中;慢表示将页表存于内存上。慢表需要访问两次内存才能取出页,而快表是访问一次Cache和一次内存,因此更快。
2.3 段式存储管理
将进程空间分为一个个段,每段也有段号和段内地址,与页式存储不同的是,每段物理大小不同,分段是根据逻辑整体分段的,因此,段表也与页表的内容不同,页表中直接是逻辑页号对应物理块号,而下图所示,段表有段长和基址两个属性,才能确定一个逻辑段在物理段中的位置。
分页是根据物理空间划分,每页大小相同;分段是根据逻辑空间划分,每段是一个完整的功能,便于共享,但是大小不同。
2.3.1 地址表示
(段号,段内偏移):其中段内偏移不能超过该段号对应的段长,否则越界错误,而此地址对应的真正内存地址应该是:段号对应的基地址+段内偏移。
2.4 段页式存储管理
对进程空间先分段,后分页,具体原理图和优缺点如下: