面试操作系统常考问题

Posted 中二病没有蛀牙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试操作系统常考问题相关的知识,希望对你有一定的参考价值。

真的有被问到的

  • 进程与线程区别
  • 进程和线程的通信方式
  • 死锁,死锁的产生条件
  • 虚拟内存
  • 并发和并行

进程管理

进程与线程

进程

是对程序的封装,进程有独立的空间,是系统进行资源调度和分配的基本单位PCB是进程存在的标志

线程

线程是进程的子任务,是CPU调度和分派的基本单位
用于保证程序的实时性,实现进程内部的并发。它是比进程更小的能独立运行的基本单位。每个线程不拥有独立拥有系统资源,只拥有一些必不可少的资源,比如说 独自的虚拟处理器,独立的寄存器组,指令计数器,和处理器状态,栈段,每个线程完成自己的任务,但是共用地址空间。

区别:

  • 一个线程只能属于一个进程,但一个进程允许有多个线程

  • 一个进程可以分配的线程数量取决于进程分配虚拟空间的大小和线程栈段的大小。

  • 进程在运行时拥有自己独立的内存单元,线程共享进程的内存。

  • 进程编程调试可靠性高,但是创建销毁的开销很大,线程编程相反,开销小但是编程调试较为复杂。

通信方式

进程的通信方式

  1. 管道(pipe)及命名管道
    允许一个进程和另一个与它有共同祖先的进程之间进行通信
    命名管道(FIFO):类似于管道,但是它可以用于任何两个进程之间的通信,命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建
  2. 信号(signal):信号是比较复杂的通信方式,用于通知接收进程有某种事情发生,除了用于进程间通信外,进程还可以发送信号给进程本身
  3. 消息队列(MQ):消息队列是消息的连接表,包括POSIX消息对和System V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。
    消息队列克服了信号承载信息量少,管道只能用无格式字节流以及缓冲区大小受限等缺点;
  4. 共享内存(shared memory):最有用的进程间通信方式,它使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。(Inter-Process Communication)这是针对其他通信机制运行效率较低而设计的。它往往与其他通信机制,如信号量结合使用,以达到进程间的同步及互斥.
  5. 信号量(semaphore):信号量主要作为进程间以及同进程不同线程之间的同步和互斥手段;
  6. Socket(套接字通信):它是更为通用的进程间通信机制,可用于不同机器之间的进程间通信,应用广泛

线程的通信方式(这个可能有问题)

信号:类似进程间的信号处理
锁机制:互斥锁、读写锁和自旋锁
条件变量:使用通知的方式解锁,与互斥锁配合使用
信号量:包括无名线程信号量和命名线程信号量

并发和并行的区别:
并发:当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。.这种方式我们称之为并发(Concurrent)。
并行(多个CPU):当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。

进程调度算法

先来先服务算法(FCFS)

只考虑就绪的先后,按就绪队列给进程分配资源

特点:效率低,不利于短作业,适合cpu繁忙型

短作业优先算法(SJF)

对预计处理时间短的作业优先分配资源

时间片轮转法

让每个进程在就绪队列中等待的时间与享受服务时间成正比例

优先级调度

为每个进程分配一个优先级,按优先级进行调度。

最短剩余时间优先

多级反馈队列算法

设置多个就绪队列分别赋予优先级,较高的优先级队列分配较少的时间片

死锁

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。如下图所示,P1拥有S1资源,P2拥有S2资源,这时候P1、P2又互相请求对方的资源,可是资源被占用着,若没有外力介入就会造成一直互相等待的僵局

产生条件

互斥条件:
进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。

不可剥夺条件:
进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放(只能是主动释放)。

请求与保持条件:
进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。

循环等待条件:
存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被 链中下一个进程所请求。

解决策略

解决死锁的基本方法主要有 预防死锁、避免死锁、检测死锁、解除死锁 、鸵鸟策略 等。

死锁预防

死锁预防的基本思想是 只要确保死锁发生的四个必要条件中至少有一个不成立,就能预防死锁的发生,具体方法包括:

破坏互斥条件
允许进程同时访问某些资源。但是,有些资源是不能被多个进程所共享的,这是由资源本身属性所决定的,因此,这种办法通常并无实用价值。

破坏占有等待条件
可以实行资源预先分配策略(进程在运行前一次性向系统申请它所需要的全部资源,若所需全部资源得不到满足,则不分配任何资源,此进程暂不运行;只有当系统能满足当前进程所需的全部资源时,才一次性将所申请资源全部分配给该线程)或者只允许进程在没有占用资源时才可以申请资源(一个进程可申请一些资源并使用它们,但是在当前进程申请更多资源之前,它必须全部释放当前所占有的资源)。但是这种策略也存在一些缺点:在很多情况下,无法预知一个进程执行前所需的全部资源,因为进程是动态执行的,不可预知的;同时,会降低资源利用率,导致降低了进程的并发性。

破坏不可抢占条件
允许进程强行从占有者哪里夺取某些资源。也就是说,但一个进程占有了一部分资源,在其申请新的资源且得不到满足时,它必须释放所有占有的资源以便让其它线程使用。这种预防死锁的方式实现起来困难,会降低系统性能。

破坏环路等待条件
给资源统一编号,进程只能按编号顺序来请求资源。

死锁检测与死锁恢复

可以允许系统进入死锁状态,然后检测它,并加以恢复。
抢占资源
回滚恢复
杀死进程

死锁避免

死锁避免的基本思想是动态地检测资源分配状态,以确保循环等待条件不成立,从而确保系统处于安全状态。
银行家算法

鸵鸟策略

和名字一样,不管死锁就完事了

协程

协程是用户态的一种轻量级线程,协程拥有自己的上下文和栈,协程调度时可以把上下文和栈保存在其他地方,协程能保留上一次调用时的状态,再次运行时能直接进入上次的状态。

协程的好处:

无需线程上下文切换的开销
无需原子操作锁定及同步的开销
方便切换控制流,简化编程模型

内存管理

虚拟内存

虚拟内存允许执行进程不必完全在内存中。虚拟内存的基本思想是:每个进程拥有独立的地址空间,这个空间被分为大小相等的多个块,称为页(Page),每个页都是一段连续的地址。这些页被映射到物理内存,但并不是所有的页都必须在内存中才能运行程序。当程序引用到一部分在物理内存中的地址空间时,由硬件立刻进行必要的映射;当程序引用到一部分不在物理内存中的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的命令。这样,对于进程而言,逻辑上似乎有很大的内存空间,实际上其中一部分对应物理内存上的一块(称为帧,通常页和帧大小相等),还有一些没加载在内存中的对应在硬盘。

页面置换算法

OPT:最佳替换算法(optional replacement)

替换下次访问距当前时间最长的页。opt算法需要知道操作系统将来的事件,显然不可能实现,只作为一种衡量其他算法的标准。

最近最少使用(Least Recently Used).

替换上次使用距离当前最远的页。根据局部性原理:替换最近最不可能 访问到的页。性能最接近OPT,但难以实现。可以维护一个关于访问页的栈或者给每个页添加最后访问的时间标签,但开销都很大。
(哈希和双向链表)

FIFO:先进先出(First In First Out)

将页面看做一个循环缓冲区,按循环方式替换。这是实现最为简单的算法,隐含的逻辑是替换驻留在内存时间最长的页。但由于一部分程序或数据在整个程序的生命周期中使用频率很高,所以会导致反复的换入换出。

Clock:时钟替换算法(Clock)

给每个页帧关联一个使用位。当该页第一次装入内存或者被重新访问到时,将使用位置为1。每次需要替换时,查找使用位被置为0的第一个帧进行替换。在扫描过程中,如果碰到使用位为1的帧,将使用位置为0,在继续扫描。如果所谓帧的使用位都为0,则替换第一个帧。

颠簸

颠簸本质上是指频繁的页调度行为,具体来讲,进程发生缺页中断,这时,必须置换某一页。然而,其他所有的页都在使用,它置换一个页,但又立刻再次需要这个页。因此,会不断产生缺页中断,导致整个系统的效率急剧下降,这种现象称为颠簸(抖动)。

内存颠簸的解决策略包括:

如果是因为页面替换策略失误,可以修改替换算法来解决这个问题;

如果是因为运行的程序太多,造成程序无法同时将所有频繁访问的页面调入内存,则要降低多道程序的数量;

磁盘调度算法

为什么有磁盘调度算法?

  • 在多道程序设计的计算机系统中,各个进程随时都可能提出对磁盘进行读写的请求。因为进程请求速度远高于磁盘读写速度,所以我们会为磁盘设备建立一个等待队列,然后按照调度算法,来调度磁盘执行读写操作。

先来先服务FIFO

按照磁盘请求的顺序进行调度。

优点是公平和简单。缺点也很明显,因为未对寻道做任何优化,使平均寻道时间可能较长。

最短寻道时间优先SSTF

优先调度与当前磁头所在磁道距离最近的磁道。

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

电梯扫描算法

电梯总是保持一个方向运行,直到该方向没有请求为止,然后改变运行方向。

电梯算法(扫描算法)和电梯的运行过程类似,总是按一个方向来进行磁盘调度,直到该方向上没有未完成的磁盘请求,然后改变方向。

因为考虑了移动方向,因此所有的磁盘请求都会被满足,解决了 SSTF 的饥饿问题。

分段分页存储

页式管理与段式管理

基本原理是将各进程的虚拟空间划分为若干个长度相等的页。把内存空间按页的大小划分为片或者页面,然后把页式虚拟地址与内存地址建立一一对应的页表,并用相应的硬件地址转换机构来解决离散地址变换问题
页是信息的物理单位

段式管理的基本思想是把程序按内容或过程函数关系分成段,每段有自己的名字。
段是信息的逻辑单位
它含有一组其意义相对完整的信息 一个用户作业或者进程所包含的段对应一个二维线性虚拟空间,也就是一个二维虚拟存储器。段式管理程序以段为单位分配内存,然后通过地址映射机构把段式虚拟地址转换为实际内存物理地址。

分页是出于系统管理的需要,分段是出于用户应用的需要

页大小是系统固定的,而段大小则通常不固定。

分页是一维的,程序员只需用一个记忆符,即可表示一个地址;而分段是二维的,程序员在标识一个地址时,既要给出段名,又需给出段内地址。

通常段比页大,因而段表比页表短,可以缩短查找时间,提高访问速度

页和段都有存储保护机制。但存取权限不同:段有读、写和执行三种权限;而页只有读和写两种权限

以上是关于面试操作系统常考问题的主要内容,如果未能解决你的问题,请参考以下文章

面试常考问题:Java泛型的底层原理是什么?

5-1 面向对象基础及Python 类常考问题

面试题操作系统常见面试题合集

面试题操作系统常见面试题合集

软考问题总结

面试官问:如何理解虚拟 DOM ,一个回答让我直接出局!