计算机操作系统八股总结

概述

一、基本特征

  1. 并发
    并发是指宏观上在一段时间内能同时运行多个程序,而并行则指同一时刻能运行多个指令
    并行需要硬件支持,如多流水线、多核处理器或者分布式计算系统。操作系统通过引入进程和线程,使得程序能够并发运行。
  2. 共享
    共享是指系统中的资源可以被多个并发进程共同使用。
    有两种共享方式:互斥共享和同时共享。互斥共享的资源称为临界资源,例如打印机等,在同一时刻只允许一个进程访问,需要用同步机制来实现互斥访问。
  3. 虚拟
    虚拟技术把一个物理实体转换为多个逻辑实体。
    主要有两种虚拟技术:时(时间)分复用技术和空(空间)分复用技术。
    多个进程能在同一个处理器上并发执行使用了时分复用技术,让每个进程轮流占用处理器,每次只执行一小个时间片并快速切换。
    虚拟内存使用了空分复用技术,它将物理内存抽象为地址空间,每个进程都有各自的地址空间。地址空间的页被映射到物理内存,地址空间的页并不需要全部在物理内存中,当使用到一个没有在物理内存的页时,执行页面置换算法,将该页置换到内存中。
  4. 异步
    异步指进程不是一次性执行完毕,而是走走停停,以不可知的速度向前推进。

二、基本功能

  1. 进程管理
    进程控制、进程同步、进程通信、死锁处理、处理机调度等。
  2. 内存管理
    内存分配、地址映射、内存保护与共享、虚拟内存等。
  3. 文件管理
    文件存储空间的管理、目录管理、文件读写管理和保护等。
  4. 设备管理
    完成用户的 I/O 请求,方便用户使用各种设备,并提高设备的利用率。
    主要包括缓冲管理、设备分配、设备处理、虛拟设备等。

三、系统调用

如果一个进程在用户态需要使用内核态的功能,就进行系统调用从而陷入内核,由操作系统代为完成。
在这里插入图片描述

Linux 的系统调用主要有以下这些:
在这里插入图片描述

四、中断分类

1.外中断

由 CPU 执行指令以外的事件引起,如 I/O 完成中断,表示设备输入/输出处理已经完成,处理器能够发送下一个输入/输出请求。此外还有时钟中断、控制台中断等。

2. 异常

由 CPU 执行指令的内部事件引起,如非法操作码、地址越界、算术溢出等。

3.陷入

在用户程序中使用系统调用。

进程、线程管理

1.进程、线程与协程的区别

  1. 进程(Process)是操作系统中资源分配的基本单位。一个进程包含了程序的代码、数据和执行时所需的系统资源,如内存、文件和设备。每个进程都在独立的内存空间中运行,并且彼此之间相互隔离,通过进程间通信(IPC)才能进行数据交换。进程的切换代价较高,因为需要保存和恢复大量的上下文信息。

  2. 线程(Thread)是进程内的执行单元,也是 CPU 调度的基本单位。一个进程可以包含多个线程,它们共享相同的内存空间和系统资源。不同线程之间可以并发执行,通过共享内存来进行通信。线程之间的切换代价相对较低,因为不需要切换进程的上下文,只需要保存和恢复线程的上下文即可。

  3. 协程(Coroutine)是一种用户级的轻量级线程。它也被称为“协作式多任务”或“协作式并发”。协程由用户控制,而不是由操作系统内核控制。协程可以在特定的代码位置挂起和恢复执行,而不需要进行上下文切换。协程可以看作是一种更加灵活的并发模型,可以在同一个线程中实现高并发的效果。

总结:

  • 进程是操作系统中资源分配的基本单位,每个进程有独立的内存空间,进程之间通信需要通过 IPC。
  • 线程是进程内的执行单元,多个线程共享同一进程的内存和资源,线程之间通过共享内存进行通信。
  • 协程是一种用户级的轻量级线程,由用户控制调度,可以在特定位置挂起和恢复执行,无需进行上下文切换。
  • 由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程 CPU 环境的保存及新调度进程 CPU 环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。

2.进程调度算法

  1. 先来先服务(First-Come, First-Served,FCFS):按照进程到达的先后顺序进行调度。即先到达的进程先执行,直到该进程执行完成或发生阻塞。这种算法简单直观,但可能导致长作业等待时间(饥饿现象)。

  2. 短作业优先(Shortest Job Next,SJN):选择估计运行时间最短的进程进行调度。这种算法能够最小化平均等待时间,但需要准确地预测每个进程的运行时间。

  3. 优先级调度(Priority Scheduling):为每个进程分配一个优先级,优先级高的进程先执行。优先级可以根据进程的特征、重要性或其他因素进行设定。可以使用静态优先级(进程创建时确定)或动态优先级(根据进程状态和行为调整)。

  4. 时间片轮转(Round Robin,RR):将处理器时间划分为固定大小的时间片,每个进程按照时间片顺序执行。当时间片用完时,进程被暂停,并被放到就绪队列的末尾,等待下一轮调度。这种算法公平地分配处理器时间,但可能导致上下文切换频繁。

  5. 多级反馈队列调度(Multilevel Feedback Queue Scheduling):将就绪队列划分为多个优先级队列,每个队列使用不同的调度策略。新到达的进程进入最高优先级队列,如果在该队列中等待时间过长,则降低其优先级,以便给其他进程机会。这种算法结合了先来先服务和轮转调度的优点。

3.进程同步

进程同步是指在多个并发执行的进程之间协调和控制它们的执行顺序以及对共享资源的访问,以避免出现竞争条件、死锁和数据不一致等问题。下面介绍一些常见的进程同步机制:

  1. 临界区(Critical Section):临界区是指一段代码,在同一时间只允许一个进程或线程执行。通过在关键代码段前后使用互斥量(Mutex)、信号量(Semaphore)等同步原语,确保只有一个进程能够进入临界区执行,从而避免数据竞争和冲突。

  2. 互斥量(Mutex):互斥量是一种同步原语,用于确保在同一时间只有一个进程能够访问临界区。一个进程进入临界区后,会锁定(Lock)互斥量,其他进程需要等待该互斥量被释放后才能进入。

  3. 信号量(Semaphore):信号量是一种计数器,用于控制对共享资源的访问。信号量可以有一个整数值,当值大于0时,表示资源可用;当值为0时,表示资源不可用,进程需要等待。通过对信号量进行 P(等待)和 V(发信号)操作来控制资源的访问。

  4. 事件(Event):事件是一种同步原语,用于进程间的通信和同步。一个进程可以等待事件的发生,而其他进程可以触发事件的发生。当事件发生时,等待的进程将被唤醒。

  5. 条件变量(Condition Variable):条件变量用于在进程间传递信息,并允许一个进程等待某个特定条件的发生。它通常与互斥量结合使用。一个进程可以等待条件变量的满足,而其他进程可以通过发送信号来满足条件变量。

  6. 读写锁(Read-Write Lock):读写锁用于在读和写操作之间提供更细粒度的同步。多个进程可以同时读取共享数据,但只有一个进程可以进行写操作。这可以提高并发性能,适用于读操作远远多于写操作的场景。

这些是常见的进程同步机制,不同的机制适用于不同的场景和需求。正确地使用这些同步机制可以确保并发程序的正确性和可靠性。然而,不正确的同步机制使用可能导致死锁、饥饿等问题,因此在设计并发程序时需要仔细考虑同步机制的选择和使用方式。

4.进程通信

进程同步与进程通信很容易混淆,它们的区别在于:

  • 进程同步:控制多个进程按一定顺序执行;
  • 进程通信:进程间传输信息。

进程通信是一种手段,而进程同步是一种目的。也可以说,为了能够达到进程同步的目的,需要让进程进行通信,传输一些进程同步所需要的信息。

  1. 管道
  • 只支持半双工通信(单向交替传输)
  • 只能在父子进程或者兄弟进程中使用
  1. FIFO(命名管道)
    是一种特殊类型的文件,去除了管道只能在父子进程中使用的限制。用于在无关进程之间进行通信。命名管道允许进程通过读取和写入文件来进行通信。

  2. 消息队列
    消息队列是一种通过消息传递进行进程通信的机制。进程可以将消息发送到队列中,其他进程可以从队列中接收消息。消息队列可以实现异步通信和解耦,但需要定义消息格式和协议。

  3. 信号量
    信号量是一种用于控制进程对共享资源的访问的同步机制。它可以用于进程间的同步和互斥操作。进程可以通过对信号量进行 P(等待)和 V(发信号)操作来申请和释放资源。

  4. 共享内存(Shared Memory)
    共享内存是一种高效的进程通信方式,它允许多个进程直接访问同一块内存区域,从而实现数据共享。进程可以在共享内存中读写数据,避免了数据拷贝的开销,但需要适当的同步机制来避免竞争条件。

  5. 套接字(Socket)
    套接字是一种在网络中进行进程通信的机制,可以用于不同计算机上的进程之间的通信。套接字可以实现进程间的网络通信,包括基于 TCP 和 UDP 的通信。

5.线程通信方法

  1. 共享变量:多个线程可以共享同一变量,通过读取和写入共享变量来进行通信。但在多线程环境下,需要使用同步机制如互斥锁、条件变量等来保证对共享变量的访问是安全的。

  2. 互斥锁(Mutex):互斥锁是一种同步原语,用于确保在同一时间只有一个线程能够访问共享资源。当一个线程获得互斥锁时,其他线程需要等待,直到该线程释放互斥锁。

  3. 条件变量(Condition Variable):条件变量用于在线程间传递信息,并允许一个线程等待某个特定条件的发生。一个线程可以等待条件变量的满足,而其他线程可以通过发送信号来满足条件变量。

  4. 信号量(Semaphore):信号量是一种计数器,用于控制对共享资源的访问。信号量可以有一个整数值,当值大于0时,表示资源可用;当值为0时,表示资源不可用,线程需要等待。通过对信号量进行 P(等待)和 V(发信号)操作来控制资源的访问。

  5. 屏障(Barrier):屏障用于确保在并行计算中的多个线程都达到某个点之后才能继续执行。当线程到达屏障时,它会等待其他线程也到达屏障,然后一起继续执行。

  6. 队列(Queue):队列可以用于在线程之间传递数据或消息。一个线程将数据放入队列,而另一个线程从队列中取出数据。队列可以实现线程之间的异步通信和解耦。

  7. 线程间的回调(Thread Callback):一个线程可以调用另一个线程的特定函数或方法,实现线程之间的通信。这种方法常用于线程之间的协作和任务划分。

6.什么时候该用多线程,什么时候该用多进程?

  • 频繁修改:需要频繁创建和销毁的优先使用多线程
  • 计算量:需要大量计算的优先使用多线程 因为需要消耗大量CPU资源且切换频繁,所以多线程好一点
  • 相关性:任务间相关性比较强的用多线程,相关性比较弱的用多进程。因为线程之间的数据共享和同步比较简单。
  • 多分布:可能要扩展到多机分布的用多进程,多核分布的用多线程。

但是实际中更常见的是进程加线程的结合方式,并不是非此即彼的。

死锁

1.必要条件

  • 互斥:每个资源要么已经分配给了一个进程,要么就是可用的。
  • 请求和保持条件:已经得到了某个资源的进程可以再请求新的资源。
  • 不可抢占:已经分配给一个进程的资源不能强制性地被抢占,它只能被占有它的进程显式地释放。
  • 循环等待条件:有两个或者两个以上的进程组成一条环路,该环路中的每个进程都在等待下一个进程所占有的资源。

2.处理方法

(1)鸵鸟策略

因为解决死锁问题的代价很高,因此鸵鸟策略这种不采取任务措施的方案会获得更高的性能。当发生死锁时不会对用户造成多大影响,或发生死锁的概率很低,可以采用鸵鸟策略。
大多数操作系统,包括 Unix,Linux 和 Windows,处理死锁问题的办法仅仅是忽略它。

(2)死锁检测与死锁恢复

运行时检测系统是否发生了死锁,并采取相应的恢复措施。常用的死锁检测算法包括资源分配图算法和银行家算法等。一旦检测到死锁,可以采取抢占资源、终止进程、回滚操作等措施来恢复系统。

(3)死锁预防

通过破坏死锁产生的四个必要条件之一,预防死锁的发生。这包括破坏互斥条件、破坏占有和等待条件、破坏不可抢占条件和破坏循环等待条件。预防死锁需要在设计和实现阶段采取相应的策略,如避免使用多个资源请求、按照特定顺序获取资源等。

(4)死锁避免

在资源分配过程中,采取安全的资源分配策略,以避免系统进入不安全状态,从而避免死锁的发生。避免死锁需要系统具备资源需求的信息和资源分配策略,以评估分配资源的安全性。

内存管理

1.虚拟内存

虚拟内存的目的是为了让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。

为了更好的管理内存,操作系统将内存抽象成地址空间。每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一页。这些页被映射到物理内存,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。当程序引用到不在物理内存中的页时,由硬件执行必要的映射,将缺失的部分装入物理内存并重新执行失败的指令。

从上面的描述中可以看出,虚拟内存允许程序不用将地址空间中的每一页都映射到物理内存,也就是说一个程序不需要全部调入内存就可以运行,这使得有限的内存运行大程序成为可能。例如有一台计算机可以产生 16 位地址,那么一个程序的地址空间范围是 0~64K。该计算机只有 32KB 的物理内存,虚拟内存技术允许该计算机运行一个 64K 大小的程序。

2.分页系统地址映射

内存管理单元(MMU)管理着地址空间和物理内存的转换,其中的页表(Page table)存储着页(程序地址空间)和页框(物理内存空间)的映射表。

一个虚拟地址分成两个部分,一部分存储页面号,一部分存储偏移量。

下图的页表存放着 16 个页,这 16 个页需要用 4 个比特位来进行索引定位。例如对于虚拟地址(0010 000000000100),前 4 位是存储页面号 2,读取表项内容为(110 1),页表项最后一位表示是否存在于内存中,1 表示存在。后 12 位存储偏移量。这个页对应的页框的地址为 (110 000000000100)。
在这里插入图片描述

3.页面置换算法

  1. 先进先出(FIFO):这是最简单的页面置换算法,按照页面进入物理内存的先后顺序进行置换。最早进入内存的页面会被置换出去。FIFO算法容易产生"Belady现象",即在分配更多的物理内存时,页面置换次数反而增加。

  2. 最近最久未使用(LRU):LRU算法根据页面最近被访问的时间来进行置换。每次淘汰的页面是最近最久未使用的页面。该算法的基本思想是利用了程序的局部性原理,即最近被访问的页面很可能在未来也会被访问。

  3. 最不经常使用(LFU):LFU算法根据页面被访问的频率进行置换。当物理内存不足时,置换访问频率最低的页面。LFU算法适用于在一段时间内访问频率相对稳定的场景。

  4. 时钟(Clock):时钟算法是一种近似LRU的页面置换算法。它使用一个时钟指针(Clock Hand)遍历物理内存中的页面,当页面被访问时,将页面的访问位(Reference Bit)设置为1当需要置换页面时,从当前位置开始,找到一个访问位为0的页面进行置换如果当前位置所有页面的访问位都为1,则将所有页面的访问位重置为0,并从当前位置再次开始遍历

  5. 最佳(OPT):最佳算法是一种理论上的最佳页面置换算法,它根据未来一段时间内页面的使用情况进行置换。当需要置换页面时,选择未来最长时间内不会被访问的页面进行置换。最佳算法很难实现,因为需要对未来的页面访问情况进行准确预测,所以通常作为对比参考。

4.分段

虚拟内存采用的是分页技术,也就是将地址空间划分成固定大小的页,每一页再与内存进行映射。

下图为一个编译器在编译过程中建立的多个表,有 4 个表是动态增长的,如果使用分页系统的一维地址空间,动态增长的特点会导致覆盖问题的出现。
在这里插入图片描述
分段的做法是把每个表分成段,一个段构成一个独立的地址空间。每个段的长度可以不同,并且可以动态增长。
在这里插入图片描述

5.段页式

程序的地址空间划分成多个拥有独立地址空间的段,每个段上的地址空间划分成大小相同的页。这样既拥有分段系统的共享和保护,又拥有分页系统的虚拟内存功能。

6.分页与分段的比较

  • 对程序员的透明性:分页透明,但是分段需要程序员显式划分每个段。

  • 地址空间的维度:分页是一维地址空间,分段是二维的。

  • 大小是否可以改变:页的大小不可变,段的大小可以动态改变。

  • 出现的原因:分页主要用于实现虚拟内存,从而获得更大的地址空间;分段主要是为了使程序和数据可以被划分为逻辑上独立的地址空间并且有助于共享和保护。

设备管理

1.磁盘结构

  • 盘面(Platter):一个磁盘有多个盘面;
    磁道(Track):盘面上的圆形带状区域,一个盘面可以有多个磁道;
    扇区(Track Sector):磁道上的一个弧段,一个磁道可以有多个扇区,它是最小的物理储存单位,目前主要有 512 bytes 与 4 K 两种大小;
    磁头(Head):与盘面非常接近,能够将盘面上的磁场转换为电信号(读),或者将电信号转换为盘面的磁场(写);
    制动手臂(Actuator arm):用于在磁道之间移动磁头;
    主轴(Spindle):使整个盘面转动。

2.磁盘调度算法

读写一个磁盘块的时间的影响因素有:

  • 旋转时间(主轴转动盘面,使得磁头移动到适当的扇区上)
  • 寻道时间(制动手臂移动,使得磁头移动到适当的磁道上)
  • 实际的数据传输时间

其中,寻道时间最长,因此磁盘调度的主要目标是使磁盘的平均寻道时间最短。

1.先来先服务

按照磁盘请求的顺序进行调度。
优点是公平和简单。缺点也很明显,因为未对寻道做任何优化,使平均寻道时间可能较长。

2.最短寻道时间优先

优先调度与当前磁头所在磁道距离最近的磁道。
虽然平均寻道时间比较低,但是不够公平。如果新到达的磁道请求总是比一个在等待的磁道请求近,那么在等待的磁道请求会一直等待下去,也就是出现饥饿现象。具体来说,两端的磁道请求更容易出现饥饿现象。

3.电梯算法

电梯总是保持一个方向运行,直到该方向没有请求为止,然后改变运行方向。
电梯算法(扫描算法)和电梯的运行过程类似,总是按一个方向来进行磁盘调度,直到该方向上没有未完成的磁盘请求,然后改变方向。
因为考虑了移动方向,因此所有的磁盘请求都会被满足,解决了 SSTF 的饥饿问题。

参考

  1. https://interviewguide.cn/
  2. https://chat.openai.com/
  • 5
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值