📜  最后一分钟笔记 – 操作系统

📅  最后修改于: 2021-09-27 22:44:21             🧑  作者: Mango

在这里查看所有科目的最后一分钟笔记。

操作系统:它是用户和计算机硬件之间的接口。

操作系统 (OS) 类型:

  1. 批处理操作系统 –一组类似的作业存储在主内存中以供执行。只有在前一个作业的执行完成后,才会将作业分配给 CPU。
  2. 多道程序操作系统——主内存由等待 CPU 时间的作业组成。 OS 选择其中一个进程并将其分配给 CPU。每当正在执行的进程需要等待任何其他操作(如 I/O)时,操作系统就会从作业队列中选择另一个进程并将其分配给 CPU。通过这种方式,CPU 永远不会闲置,并且用户可以同时完成多个任务。
  3. 多任务操作系统——多任务操作系统结合了多道程序操作系统和 CPU 调度的优点,可以在作业之间进行快速切换。切换速度如此之快,以至于用户可以在每个程序运行时与它进行交互
  4. 分时操作系统 –分时系统需要与用户交互以指示操作系统执行各种任务。操作系统以输出作为响应。指令通常通过键盘等输入设备给出。
  5. 实时操作系统——实时操作系统通常是为专用系统构建的,以在期限内完成一组特定的任务。

主题:
线程是轻量级进程,构成 CPU 利用率的基本单位。通过包含多个线程,一个进程可以同时执行多个任务。

  • 线程有自己的程序计数器、寄存器集和堆栈
  • 一个线程与同一进程的其他线程共享资源,包括代码段、数据段、文件和信号。

可以使用 fork() 系统调用引入新线程或给定进程的子进程。具有 n 个 fork() 系统调用的进程会生成 2 n – 1 个子进程。
有两种类型的线程:

  • 用户线程
  • 内核线程

示例: Java线程、POSIX 线程。示例: Window Solaris。

User level thread Kernel level thread
User threads are implemented by users. kernel threads are implemented by OS.
OS doesn’t recognize user level threads. Kernel threads are recognized by OS.
Implementation of User threads is easy. Implementation of Kernel thread is complicated.
Context switch time is less. Context switch time is more.
Context switch requires no hardware support. Hardware support is needed.
If one user level thread performs blocking operation then entire process will be blocked. If one kernel thread performs blocking operation then another thread can continue execution.

过程:
进程是一个正在执行的程序。程序计数器(PC)的值表示正在执行的进程的下一条指令的地址。每个进程都由一个进程控制块 (PCB) 表示。

流程调度:以下是流程的不同时间。

  1. Arrival Time –进程到达就绪队列的时间。
  2. 完成时间 –进程完成执行的时间。
  3. 突发时间 – CPU 执行进程所需的时间。
  4. 周转时间 –完成时间和到达时间之间的时间差。
    Turn Around Time = Completion Time - Arrival Time 
  5. 等待时间 (WT) –周转时间和突发时间之间的时间差。
    Waiting Time = Turn Around Time - Burst Time 

为什么我们需要调度?
一个典型的过程涉及 I/O 时间和 CPU 时间。在像 MS-DOS 这样的单编程系统中,等待 I/O 的时间被浪费了,而 CPU 在这段时间内是空闲的。在多道程序系统中,一个进程可以使用 CPU,而另一个进程正在等待 I/O。这只有通过进程调度才有可能。

流程调度算法的目标:

  • 最大 CPU 利用率(尽可能保持 CPU 繁忙)
  • CPU的公平分配。
  • 最大吞吐量(每个时间单位完成执行的进程数)
  • 最小周转时间(进程完成执行所花费的时间)
  • 最小等待时间(进程在就绪队列中等待的时间)
  • 最小响应时间(进程产生第一响应的时间)

不同的调度算法:

  1. 先来先服务(FCFS) :最简单的调度算法,根据进程的到达时间进行调度。
  2. 最短作业优先(SJF)首先调度具有最短突发时间的进程。
  3. Shortest Remaining Time First (SRTF) :SJF算法的抢占方式,根据最短剩余时间调度作业。
  4. Round Robin (RR) 调度:以循环方式为每个进程分配固定时间。
  5. 基于优先级的调度(非抢占式) :在这种调度中,进程是根据它们的优先级进行调度的,即优先级最高的进程先被调度。如果两个进程的优先级匹配,则根据到达时间进行调度。
  6. 最高响应率下一个(HRRN) :在这个调度中,具有最高响应率的进程被调度。该算法避免饥饿。
    Response Ratio = (Waiting Time + Burst time) / Burst time
  7. 多级队列调度(MLQ) :根据进程的优先级,将进程放在不同的队列中。通常高优先级进程被放置在顶级队列中。只有在顶级队列中的进程完成后,才会调度低级队列进程。
  8. 多级反馈队列 (MLFQ) 调度:它允许进程在队列之间移动。这个想法是根据进程的 CPU 突发特性来分离进程。如果进程使用过多 CPU 时间,则会将其移至优先级较低的队列。

关于调度算法的一些有用的事实:

  1. FCFS 会导致等待时间过长,尤其是当第一个作业占用太多 CPU 时间时。
  2. SJF 和最短剩余时间优先算法都可能导致饥饿。考虑这样一种情况:就绪队列中有一个长进程,而较短的进程不断到来。
  3. 如果 Round Robin 调度的时间量很大,那么它的行为与 FCFS 调度相同。
  4. SJF 在给定进程集的平均等待时间方面是最佳的。 SJF 给出了最短的平均等待时间,但 SJF 的问题是如何知道/预测下一个工作的时间。

临界区问题:

  1. 临界区——程序中访问和/或更新共享变量的代码部分。
  2. 剩余部分——程序的剩余部分,不包括关键部分。
  3. Race around Condition –代码的最终输出取决于访问变量的顺序。这被称为条件竞争。

临界区问题的解决方案必须满足以下三个条件:

  1. 互斥 –如果进程 Pi 在其临界区中执行,则不允许其他进程进入临界区。
  2. 进度——如果在临界区中没有进程正在执行,则进程进入临界区的决定不能由在其剩余部分中执行的任何其他进程做出。程序的选择不能无限期推迟。
  3. 有界等待——在进程提出访问临界区的请求之后和请求被授予之前,其他进程可以进入临界区的次数存在限制。

同步工具:
信号量是一个整数变量,只能通过两个原子操作wait()和signal()访问。原子操作在单个 CPU 时间片内执行,没有任何抢占。信号量有两种类型:

  1. 计数信号量——计数信号量是一个整数变量,其值的范围可以跨越一个不受限制的域。
  2. 互斥 –互斥提供互斥,生产者或消费者都可以拥有密钥(互斥)并继续他们的工作。只要缓冲区被生产者填满,消费者就需要等待,反之亦然。

    在任何时候,只有一个线程可以处理整个缓冲区。这个概念可以使用信号量来概括。

    误解:
    二元信号量和互斥量之间存在歧义。我们可能已经发现互斥体是二进制信号量。但他们不是!互斥量和信号量的目的是不同的。可能是,由于它们实现的相似性,互斥体将被称为二进制信号量。

死锁
一组进程被阻塞的情况,因为每个进程都持有一个资源并等待其他进程获取另一个资源。如果以下四个条件同时成立(必要条件),就会出现死锁:

  1. 互斥 –一种或多种资源不可共享(一次只能使用一个进程)。
  2. 持有并等待——一个进程持有至少一个资源并等待资源。
  3. 无抢占 –除非进程释放资源,否则无法从进程中获取资源。
  4. 循环等待——一组进程以循环形式相互等待。

处理死锁的方法:处理死锁的三种方式

  1. 死锁预防或避免:这个想法是不让系统进入死锁状态。
  2. 死锁检测和恢复:让死锁发生,一旦发生就做抢占处理。
  3. 一起忽略问题- :如果死锁非常罕见,则让它发生并重新启动系统。这是 Windows 和 UNIX 都采用的方法。

银行家算法:
该算法处理同一资源的多个实例。

内存管理:
这些技术允许在多个进程之间共享内存。

  • Overlays –内存应该只包含在给定时间需要的那些指令和数据。
  • 交换——在多道程序设计中,使用了时间片的指令从内存中换出。

内存管理技术:

(a) 单分区分配方案——
内存分为两部分。一部分保留供操作系统使用,另一部分保留供用户使用。

(b) 多重分割方案——

  1. 固定分区——内存被分成固定大小的分区。
  2. 可变分区——内存被划分为可变大小的分区。

可变分区分配方案:

  1. First Fit –到达的进程被分配到它完全适合的第一个内存孔。
  2. 最佳匹配 –通过将最小内存留空,为到达的进程分配最适合它的内存空洞。
  3. Worst Fit –到达的进程被分配到它留下最大间隙的内存空洞。

笔记:

  • 最佳拟合并不一定会为内存分配提供最佳结果。
  • 外部碎片的原因是固定分区和变量分区中的条件说整个进程应该分配在连续的内存位置。因此使用分页
  1. 分页——
    物理内存被分成大小相等的帧。主内存被分成固定大小的页面。物理内存帧的大小等于虚拟内存帧的大小。
  2. 细分——
    实施分段以向用户提供内存视图。逻辑地址空间是段的集合。可以使用或不使用分页来实现分段。

页面错误:页面错误是一种中断,当正在运行的程序访问映射到虚拟地址空间但未加载到物理内存中的内存页面时,由硬件引发。

页面替换算法:

  1. 先进先出 (FIFO) –
    这是最简单的页面替换算法。在该算法中,操作系统跟踪队列中内存中的所有页面,最旧的页面在队列的前面。当一个页面需要被替换时,队列前面的页面被选中进行删除。

    例如,考虑页面引用字符串1、3、0、3、5、6 和 3 页槽。最初,所有槽都是空的,所以当 1、3、0 到来时,它们被分配给空槽 —> 3 页错误。当 3 出现时,它已经在内存中,所以 —> 0 Page Faults。然后是 5,它在内存中不可用,因此它替换了最旧的页槽,即 1。-> 1 页错误。最后,6 来了,它在内存中也不可用,因此它替换了最旧的页槽,即 3 —> 1 页错误。

    Belady的异常:
    Belady 的异常证明,在使用先进先出 (FIFO) 页面替换算法的同时增加页面帧数时,可能会出现更多页面错误。例如,如果我们考虑引用字符串3 2 1 0 3 2 4 3 2 1 0 4 和 3 个插槽,我们总共有 9 个页面错误,但是如果我们将插槽增加到 4,我们会得到 10 个页面错误。

  2. 最佳页面替换 –
    在该算法中,替换未来最长持续时间不使用的页面。

    让我们考虑页面引用字符串7 0 1 2 0 3 0 4 2 3 0 3 2 和 4 页槽。最初,所有插槽都是空的,因此当 7 0 1 2 被分配给空插槽时 -> 4 Page faults。 0 已经存在,所以 —> 0 页面错误。当 3 出现时,它将取代 7,因为它在未来最长的时间内没有使用。—> 1 Page fault。 0 已经存在,所以 —> 0 页面错误。 4 将取代 1 —> 1 Page Fault。现在对于进一步的页面引用字符串-> 0 Page fault 因为它们已经在内存中可用。

    最佳页面替换是完美的,但在实践中是不可能的,因为操作系统无法知道未来的请求。最佳页面替换的用途是设置一个基准,以便可以针对它分析其他替换算法。

  3. 最近最少使用 (LRU) –
    在该算法中,将替换最近最少使用的页面。

    假设页面引用字符串7 0 1 2 0 3 0 4 2 3 0 3 2 。最初,我们有 4 页空位。最初,所有插槽都是空的,因此当 7 0 1 2 被分配给空插槽时 -> 4 Page faults。 0 已经是他们的了 —> 0 Page fault。当 3 出现时,它将取代 7,因为它最近最少使用 —> 1 Page fault。 0 已经在内存中,所以 —> 0 页面错误。 4 将取代 1 —> 1 Page Fault。现在对于进一步的页面引用字符串-> 0 Page fault因为它们已经在内存中可用。

    文件系统:文件是记录在二级存储上的相关信息的集合。或者文件是逻辑相关实体的集合。

    文件目录:文件的集合是一个文件目录。该目录包含有关文件的信息,包括属性、位置和所有权。大部分信息,尤其是与存储有关的信息,都由操作系统管理。

    1. SINGLE-LEVEL DIRECTORY :在这个目录中为所有用户维护一个目录
    2. 两级目录:由于有两个级别,每个文件都有一个路径名来定位该文件。
    3. TREE-STRUCTURED DIRECTORY :目录以树的形式维护。搜索是有效的,并且还有分组功能。

    文件分配方法

    1. 连续分配:在文件创建时将一组连续的块分配给文件。
    2. 链接分配(非连续分配) :分配基于单个块。每个块都包含一个指向链中下一个块的指针。
    3. 索引分配:它解决了许多连续和链式分配的问题。在这种情况下,文件分配表为每个文件包含一个单独的一级索引

    磁盘调度
    磁盘调度由操作系统完成以调度到达磁盘的 I/O 请求。磁盘调度也称为 I/O 调度。

    1. 寻道时间:寻道时间是将磁盘臂定位到要读取或写入数据的指定磁道所花费的时间。
    2. 旋转延迟:旋转延迟是磁盘的所需扇区旋转到一个位置以便它可以访问读/写磁头所花费的时间。
    3. 传输时间:传输时间是传输数据的时间。这取决于磁盘的旋转速度和要传输的字节数。
    4. 磁盘访问时间:寻道时间+旋转延迟+传输时间
    5. 磁盘响应时间:响应时间是请求等待执行其 I/O 操作所花费的平均时间。平均响应时间是所有请求的响应时间。

    磁盘调度算法

    1. FCFS: FCFS 是所有磁盘调度算法中最简单的。在 FCFS 中,请求按照它们到达磁盘队列的顺序进行处理。
    2. SSTF:在SSTF(Shortest Seek Time First)中,首先执行具有最短寻道时间的请求。因此,每个请求的寻道时间都是在队列中预先计算的,然后根据计算出的寻道时间进行调度。因此,磁盘臂附近的请求将首先执行。
    3. SCAN:在 SCAN 算法中,磁盘臂移动到特定方向并为进入其路径的请求提供服务,到达磁盘末端后,它反转其方向并再次为到达其路径的请求提供服务。因此,该算法的工作原理类似于电梯,因此也称为电梯算法。
    4. CSCAN:在 SCAN 算法中,磁盘臂在反转其方向后再次扫描已扫描的路径。因此,可能有太多请求在另一端等待,或者在扫描区域等待的请求可能为零或很少。
    5. LOOK:它类似于SCAN磁盘调度算法,不同之处在于磁盘臂尽管走到磁盘的末尾,但只去到磁头前面的最后一个要服务的请求,然后从那里反转它的方向只要。因此,它可以防止由于不必要的遍历到磁盘末尾而发生的额外延迟。
    6. CLOOK:由于LOOK与SCAN算法相似,因此CLOOK与CSCAN磁盘调度算法相似。在 CLOOK 中,磁盘臂尽管走到了最后,但只去到磁头前面要服务的最后一个请求,然后从那里去到另一端的最后一个请求。因此,它还可以防止由于不必要的遍历磁盘末尾而产生的额外延迟。