【操作系统:简要】总结

最近看到操作系统,这篇文章大致的总结一下操作系统的轮廓。同时也使自己更加清晰一点,之后可能会一步一步的往下面挖。
参考:https://www.yiibai.com/os/os-deadlock-detection-and-recovery.html

1. 定义 && 功能

  • 用户和硬件之间的接口。它负责执行所有进程,资源分配,CPU管理,文件管理和许多其他任务。

  • 做了什么?

  1. 进程管理
  2. 进程同步
  3. 内存管理
  4. CPU调度
  5. 文件管理
  6. 安全
      • 类型:
  • 批量操作系统
  • 多程序操作系统
  • 多处理操作系统
  • 实时操作系统

2. 进程管理

2.1 和进程有关的时间
  1. 到达时间
    进程进入就绪队列的时间称为到达时间。
  2. 突发时间
    CPU执行整个过程所需要的总时间称为突发时间。不包含等待时间。在执行之前计算一个过程的执行时间是困难的,故基于突发时间的调度问题无法在现实中实现。
  3. 完成时间
    进程完成其执行的时间称为完成时间。
  4. 周转时间
    从抵达到完成所花费的时间总量为周转时间。
  5. 等待时间
    进程等待CPU分配的总时间称为等待时间。
  6. 响应时间
    到达时间到进程首次获取CPU的时间间隔称为响应时间。
2.2 操作系统调度算法
  • 调度算法的目的
  1. 最大CPU利用率
  2. 公平分配CPU
  3. 最大吞吐量
  4. 最短周转时间
  5. 最短的等待时间
  6. 最短响应时间
  • 算法:
  1. 先来先服务(FCFS first come first service)
    这是最简单的算法。 最短到达时间的过程将首先获得CPU。 到达时间越少,进程得到CPU的速度越快。 这是非抢先式的调度。

  2. 轮循
    在循环调度算法中,操作系统定义了一个时间片(片)。 所有的进程将以循环方式执行。 每个进程都会获得CPU一小段时间(称为时间片),然后返回就绪队列等待下一个回合。 这是一种抢先式调度。

  3. 最短作业优先(SJF Shortest jib first)
    具有最短爆发时间的作业将首先获得CPU。 突发时间越短,进程得到CPU的速度越快。 这是非抢先式的调度。

  4. 最短剩余时间优先(SRTF Shortest remaining-time first)
    这是SJF的抢先形式。 在该算法中,操作系统根据执行的剩余时间安排作业。

  5. 基于优先级的调度
    在这个算法中,优先级将被分配给每个进程。 优先级越高,进程得到CPU的速度越快。 如果两个进程的优先级相同,则会根据他们的到达时间进行安排。存在两种类型的优先级调度算法。 一种是抢占式优先级调度,而另一种是非抢先式优先级调度。

  6. 最高响应率优先(HRRN highest response-ratio next)
    在这种调度算法中,下一步将调度响应比率最高的进程。 这减少了系统中的饥饿。(非抢占式)
    在这里插入图片描述


3. 同步

  • 当两个或多个进程相互合作时,必须保留其执行顺序,否则可能会在执行过程中产生冲突,并产生不适当的输出。
  • 协同进程是可以影响其他进程执行的协同进程,也可以受到其他进程执行的影响。 这些进程需要同步,以保证其执行顺序。
  • 保持合作进程的适当执行顺序涉及的过程称为进程同步。 有各种同步机制用于同步进程。

**竞争条件:**当两个或多个线程尝试读取,写入并可能根据他们正在同时访问的内存做出决定时,通常会发生竞争状况。
**临界部分:**试图访问共享资源并可能导致竞争条件的程序区域称为临界区。为避免进程间的竞争转态,我们需要确保一次只能在临界部分执行一个进程。

同步处理算法
  1. 信号量机制
    有些时候需要同时在临界区执行多个进程。当我们需要同时在临界区中有多个进程时,可以使用计数信号量。
  • 在这种机制中,临界区的入口和退出是根据计数信号量的值执行的。在任何时间点计算信号量的值表示可以同时在临界区输入的最大进程数。
  • 想要进入临界区的进程首先将信号量值减1,然后检查它是否为负值。如果它变为负数,则该过程被推入阻塞过程的列表(即q),否则它进入临界区。
  • 当进程从临界区退出时,它会将计数信号量增加1,然后检查它是否为负值或零。如果它是负数,那么这意味着至少有一个进程在阻塞状态下等待,因此,为了确保有界等待,阻塞进程列表中的第一个进程将被唤醒并进入临界区。
  • 被阻止列表中的进程将按其睡眠顺序进行唤醒。如果计数信号量的值为负数,则表示处于阻塞状态的进程数量,如果为正数,则表示临界区域中可用的插槽数量。
  1. 二进制信号量机制(互斥量)

二进制信号严格提供互斥。 在这里,临界区域不能有超过1个槽位,而临界区域最多只能有1个槽位。 信号量只能有两个值,0或1。

3. 死锁

这篇文档对死锁的条件有清晰的介绍死锁条件


饥饿死锁的区别:

在这里插入图片描述


死锁的必要条件:

  1. …互斥条件: 一个资源每次只能被一个进程使用。
  2. …请求与保持条件: 一个进程因请求资源而阻塞时,对已获得的资源保持不放。
  3. …不剥夺条件: 进程已获得的资源,在未使用之前,不能强行剥夺
  4. …循环等待条件: 若干进程之间形成一种头尾相接的循环等待资源关系
  • 只要发生死锁,这些条件必然成立。只要上面条件之一不满足,就不会发生死锁。为此可以采用下面三种措施:
  1. 采用资源静态分配策略-----破坏“部分分配”条件
  2. 允许进程剥夺使用其他进程占有的资源,从而破坏“不可剥夺”条件。
  3. 采用资源有序分配法----破坏“环路”条件。
    这里注意:互斥条件无法被破坏。
3.1 死锁检测和恢复
  • 在这种方法中,OS不应用任何机制来避免或防止死锁。 因此,系统认为死锁肯定会发生。 为了摆脱死锁,OS定期检查系统是否存在死锁。 如果发现死锁,操作系统将使用一些恢复技术来恢复系统。
  • 操作系统的主要任务是检测死锁。 操作系统可以借助资源分配图来检测死锁。

在这里插入图片描述


  • 在单个实例化的资源类型中,如果系统中正在形成一个循环,那么肯定会出现死锁。 另一方面,在多实例资源类型图中,检测周期不够。 我们必须通过将资源分配图转换为分配矩阵和请求矩阵来在系统上应用安全算法。
  • 为了从死锁中恢复系统,任一操作系统都会考虑资源或进程。

对于资源:


抢占资源

我们可以从资源所有者(进程)中获取其中一个资源,并将其交给另一个进程,并期望它能够完成执行,并且会尽快释放该资源。 那么,选择一个将被抢走的资源将会有点困难。

回滚到安全状态

系统通过各种状态进入死锁状态。 操作系统将系统回滚到以前的安全状态。 为此,操作系统需要在每个状态下执行检查指针。
现在,我们陷入死锁,将回滚所有分配以进入之前的安全状态。

对于进程:


杀死一个进程
杀死一个进程可以解决问题,但更重要的是要决定要杀死哪个进程。 一般来说,操作系统杀死一个迄今为止工作量最少的进程。
杀死所有进程
这不是一个可以接受的方法,但如果问题变得非常严重,可以实施。 杀死所有进程将导致系统效率低下,因为所有进程将从头开始重新执行。

在这里插入图片描述


4. 内存管理

增加内存,提高CPU利用率:
在这里插入图片描述


4.1 固定分区

缺点:

  1. 内部碎片
    如果进程的大小较小,那么分区的总大小会导致分区的某些大小被浪费并且保持不用。 这是内存的浪费,称为内部碎片。
    如下图所示,4 MB分区仅用于加载3 MB进程,其余1 MB则被浪费。
  2. 外部碎片
    即使有可用空间但不是连续形式,各个分区的总未使用空间也不能用于加载进程。
    如下图所示,每个分区的剩余1 MB空间不能用作存储4 MB进程的单位。 尽管有足够的空间可用于加载进程,但进程将不会加载。
  3. 限制进程的大小
    如果进程大小大于最大的分区的大小,则该进程无法加载到内存中。 因此,可以对进程大小施加限制,即不能大于最大分区的大小。
  4. 多程序的程度较低
    按照多编程的程度,这里只是指可以同时加载到内存中的最大进程数。 在固定分区中,多程序的程度是固定的,因为分区的大小不能根据进程的大小而变化。
4.2 动态分区

动态分区 VS 固定分区

  1. 没有内部碎片考虑到动态分区中的分区是根据进程的需要创建的,很明显,不会有任何内部碎片,因为分区中不会有任何未使用的剩余空间。
  2. 对进程的大小没有限制在固定分区中,由于缺少足够的连续内存,因此大于最大分区大小的进程无法执行。 这里,在动态分区中,由于分区大小是根据进程大小决定的,因此进程大小不能受到限制。
  3. 多程序的程度是动态的由于没有内部碎片,分区中不会有任何未使用的空间,因此可以同时将更多的进程加载到内存中。

动态分区的缺点:

  1. 外部碎片
  2. 复杂的内存分配
4.2 压缩 (碎片整理)
  • 在动态分区中,可以使用压缩来减少外部碎片的可能性。

  • 在压缩过程中,所有的空闲分区都是连续的,所有加载的分区都集中在一起。

  • 通过应用这种技术,可以将更大的进程存储在内存中。 合并可用分区,现在可以根据新进程的需要分配这些分区。 这种技术也称为碎片整理。

缺点:

  1. 系统效率低下
4.3 动态分区的位图

动态分区的主要关注点是跟踪所有空闲和分配的分区。 但是,操作系统为此任务使用以下数据结构。

  1. 位图
  2. 链表
  • 位图是存储细节最少见的数据结构。 在这个方案中,主存储器被分成分配单元的集合。 根据该过程的需要,可以将一个或多个分配单元分配给过程。 但是,分配单元的大小是由操作系统定义的,并且从不更改。 虽然分区大小可能会有所不同,但分配大小是固定的。
  • 操作系统的主要任务是跟踪分区是空闲的还是空闲的。 为此,操作系统还管理另一个称为位图的数据结构。
  • 分配单元中的进程或空洞由位图的标志位表示。 在下面显示的图像中,为分配单元的每一位定义了一个标志位。 但是,这并不是一般情况,它取决于操作系统,对于多少位分配单元,它想要存储标志位。
  • 如果在分配单元中的相邻位上存在连续存在的过程,则将标志位设置为1,否则将其设置为0。
  • 位图中的一串0表示相对分配单元中有一个孔,而1的字符串表示相对分配单元中的过程。

在这里插入图片描述


使用位图的缺点

  • OS必须为位图分配一些内存,因为它存储了有关分配单元的详细信息。 大量的内存不能用于加载任何进程,因此降低了多进程的程度以及吞吐量。在上图中,分配单位是4位,即0.5位。 这里,位图的1位表示1位的分配单位。

    1个分配单元的大小= 4位
    位图大小= 1 /(4 + 1)=总内存的1/5。

  • 因此,在这个位图配置中,总内存的1/5被浪费了。
    要识别内存中的任何空洞,操作系统需要在位图中搜索0字符串。 这种搜索花费了大量的时间,这使得系统在一定程度上效率低下。

4.4 链表动态分区

跟踪自由或填充分区的更好和最流行的方法是使用链表。

  • 在这种方法中,操作系统维护一个链表,每个节点代表每个分区。 每个节点都有三个字段。
  1. 节点的第一个字段存储一个标志位,该标志位显示该分区是一个洞还是某个进程在里面。
  2. 第二个字段存储分区的起始索引。
  3. 第三个字段存储分区的结束索引。
  • 如果某个分区在某个时间点被释放,那么该分区将与其相邻的空闲分区合并,而不会做任何额外的工作。
    在使用这种方法时需要注意一些要点。

  • 操作系统必须非常清楚要添加到链表中的新节点的位置。 但是,根据起始索引的增加顺序添加节点是可以理解的。由于双链表中的节点也可以跟踪其之前的节点,所以使用双链表将会对性能产生一些积极影响。

在这里插入图片描述


4.5 分区算法

操作系统实现了各种算法,以便找出链表中的空洞并将它们分配给进程。

  1. 第一拟合算法(First Fit)

  2. 下一个拟合算法(Next Fit)

与第一个拟合算法不同的是,从先前分配空洞的节点扫描链表。

  1. 最佳拟合算法(Best fit)

速度较慢,同时产生更小的碎片,并不是最好的算法。

  1. 最差拟合算法

  2. 快速拟合算法

  • 快速拟合算法建议保留常用大小的不同列表。 虽然,实际上这并不是可以暗示的,因为程序需要花费很多时间来创建不同的列表,然后花费空间来加载进程。

总结:

第一个拟合算法是所有算法中最好的算法,这是因为

  • 与其他算法相比,花费的时间更少。
  • 它会产生更大的空洞,以后可以用来加载其他进程。
  • 这是最容易实现的。
4.6 分页技术

动态分区的缺点:

  • 动态分区的主要缺点是外部碎片。 尽管这可以通过压缩来消除,但正如我们前面所讨论的那样,压缩使得系统效率低下。
  • 我们需要找一种替代机制,以更优化的方式加载分区中的进程。 让我们讨论一个称为分页的动态灵活机制。

内存管理单元 MMU:

  • 内存管理单元(MMU)的目的是将逻辑地址转换为物理地址。 逻辑地址是CPU为每个页面生成的地址,而物理地址是存储每个页面的帧的实际地址。
  • 当CPU使用逻辑地址访问页面时,操作系统需要获取物理地址以物理访问该页面。

逻辑地址有两部分。

  • 页码
  • 偏移量

OS的内存管理单元需要将页码转换为帧号。

虚拟内存:

虚拟内存的优点

  • 多程序的程度将会增加。
  • 用户可以用较少的真实RAM运行大型应用程序。
  • 不需要购买更多的内存RAM。

虚拟内存的缺点

  • 由于交换需要时间,系统变慢。
  • 切换应用程序需要更多时间。
  • 用户将有较小的硬盘空间供其使用。

转换后备缓冲器(TLB):

在这里插入图片描述


按需分页:

  • 它建议将所有帧的页面保留在辅助存储器中,直到它们被需要为止。 换句话说,它表示在需要之前不要在主内存中加载任何页面。
  • 每当首次在主存中引用任何页面时,该页面将在辅助存储器中找到。
  • 之后,它可能会或可能不会出现在主内存中,具体取决于本教程后面将介绍的页面替换算法。

页面错误:

  • 如果引用的页面不存在于主内存中,那么将会有一个未命中的概念被称为页面遗漏或页面错误。
  • CPU必须从辅助存储器访问遗漏页面。 如果页面错误的数量非常多,那么系统的有效访问时间将变得非常高。

抖动:

  • 如果页面错误的数量等于参考页面的数量或者页面错误的数量如此之高以致CPU在从辅助存储器读取页面时仍然忙,则有效访问时间将是 CPU从辅助存储器读取一个字。 这个概念被称为抖动。
  • 如果页面错误率为PF%,则从辅助存储器获取页面并再次重新启动所需的时间为S(服务时间),并且存储器访问时间为ma,那么有效访问时间可以表示为;

EAT = PF X S + (1 - PF) X (ma)

转换页表:

  • 转换页表是由操作系统为所有进程维护的全局页表。 在转换页表中,条目数等于主存储器中的帧数。 它可以用来克服页表的缺点。
    -无论是否存在于主存储器中,总是为页面保留一个空间。 但是,如果页面不存在,这只是内存的浪费。

在这里插入图片描述


可以通过反转页面表来节省这种浪费。 我们可以只保存主存中存在的页面的细节。 框架是索引,保存在块内的信息将是进程ID和页码。

在这里插入图片描述


4.7 页面替换算法
  • 虚拟内存有两个主要方面,即帧分配和页面替换。 拥有最佳的帧分配和页面替换算法是非常重要的。 帧分配全部是关于将多少帧分配给进程,而页面替换则是确定需要替换的页码,以便为请求的页面留出空间。

  • 如果算法不是最优的:

  1. 如果分配给进程的帧数量不够或不准确,则可能会出现抖动问题。 由于缺少帧,大部分页面将驻留在主内存中,因此会出现更多页面错误。但是,如果操作系统将更多的帧分配给进程,则可能会出现内部碎片。
  2. 如果页面替换算法不是最优的,那么也会出现抖动问题。 如果在不久的将来会引用被请求的页面替换的页面数量,那么将会有更多的插入和换出数量,因此操作系统必须执行更多的替换操作,这会导致性能不足。

最佳页面替换算法的任务是选择可限制抖动的页面。

页面替换算法的类型:

有各种页面替换算法。 每种算法都有一个不同的方法,用来替换页面。

  1. 最佳页面替换算法- 这种算法取代了将来不会被引用的页面。 虽然它不能实际实行,但可以用作基准。 其他算法在最优性方面与此相比较。
  2. 最近最少使用过的(LRU least recently used)页面替换算法 - 该算法替代长时间未被引用的页面。 该算法与最佳页面替换算法相反。
  3. FIFO - 在这个算法中,维护一个队列。 首先分配帧的页面将首先被替换。 换句话说,在队列稀有端的页面将被替换为每个页面错误。

Belady发现,在FIFO页面替换算法中,随着帧数的增加页面错误的数量会增加。在某些情况下,这是FIFO算法显示的奇怪行为。 这一个异常称为Belady异常

4.8 分段

分段的优势

  • 没有内部碎片
  • 平均分段大小大于实际页面大小。
  • 较少开销
  • 重定位段比整个地址空间更容易。
  • 与分页中的页表相比,分段表更小。

分段的缺点

  • 它可以有外部碎片。
  • 很难将连续内存分配给可变大小的分区。
  • 昂贵的内存管理算法。

分页 VS 分段

在这里插入图片描述


分段的分页

在分段的分页中,主存储器被分成可变大小的段,它们被进一步分成固定大小的页面。

  • 页面比分段小。
  • 每个段都有一个页表,这意味着每个程序都有多个页表。
  • 逻辑地址表示为分段号(基地址),页码和页面偏移量。

分段号 → 它指向相应的分段号。
页码 → 它指向分段中的确切页面。
页面偏移 → 用作页面帧内的偏移量。

  • 每页表都包含有关该分段每个页面的各种信息。 分段表包含有关每个分段的信息。 每个分段表项都指向一个页表项,并且每个页表项都被映射到一个分段内的页面。

5. 文件管理

5.1 文件系统

文件系统处理以下问题

  1. 文件结构
  2. 恢复可用空间
  3. 磁盘空间分配给这些文件
  4. 跟踪数据位置

主引导记录:

  • 主引导记录是存在于任何硬盘的第一个扇区中的信息。它包含有关操作系统在硬盘中的位置和位置的信息,以便它可以在RAM中引导。
  • MBR有时称为主分区表,因为它包含一个分区表,用于查找硬盘中的每个分区。
  • 主引导记录(MBR)还包括一个程序,该程序读取包含操作系统的分区的引导扇区记录。

在这里插入图片描述


当打开电脑时会发生什么?

  • 由于主存储器是具有易失性,所以当我们打开计算机时,CPU不能直接访问主内存。 但是,有一个特殊的程序存储在ROM中,叫做:BIOS,它会第一次被CPU访问。
  • BIOS包含代码,通过执行它,CPU访问MBR的第一个硬盘分区。 它包含硬盘所有分区的分区表。
  • 因为MBR包含有关操作系统存储位置的信息,并且它还包含可以读取分区引导扇区记录的程序,因此CPU会获取所有这些信息并将操作系统加载到主内存中。

内存中的数据结构:

  1. 内存安装表内存中安装表包含正在安装到系统的所有设备的列表。 每当连接维护到设备时,其输入将在安装表中完成。
  2. 内存目录结构缓存
    这是CPU最近访问的目录列表。列表中的目录也可以在不久的将来被访问,所以最好将它们临时存储在缓存中。
  3. 全系统打开文件表
    这是特定时间系统中所有打开文件的列表。 每当用户打开任何文件进行读取或写入时,都会在此打开的文件表中进行输入。
  4. 每个进程打开文件表
    它是受到每个进程打开的文件列表。 由于系统中每个打开的文件都有一个列表,因此它只包含指向系统范围表中相应条目的指针。

磁盘调度

磁盘调度有关的重要术语。

寻道时间

  • 寻道时间是将磁盘臂定位到满足读/写请求的指定磁道所用的时间。
    倒换延迟

  • 期望的扇区将自己倒换到可以访问R / W磁头的位置。

转换时间

  • 这是传输数据所需的时间。

磁盘访问时间

磁盘访问时间为,

  • 磁盘访问时间=旋转延迟+搜索时间+传输时间

磁盘响应时间

  • 这是每个请求等待IO操作所花费时间的平均值。

磁盘调度的目的

  • 磁盘调度算法的主要目的是从IO请求队列中选择一个磁盘请求,并决定处理该请求的时间表。

磁盘调度算法的目标

  • 公平
  • 始终最高
  • 最小的遍历时间

磁盘调度算法

下面给出了各种磁盘调度算法的列表。每种算法都具有一些优点和缺点。 每种算法的局限性导致了新算法的发展。

  • FCFS调度算法
  • SSTF(最短寻找时间优先)算法
  • SCAN调度
  • C-SCAN调度
  • LOOK调度
  • C-LOOK调度

磁盘调度算法 C++具体实现 (FCFS&SSFT&SCAN&C-SCAN&LOOK&C-LOOK)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值