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

Posted LL.LEBRON

tags:

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

💪备战实习,会定期的总结常考的面试题,大家一起加油! 🎯 🎯 🎯

😁往期文章:

😀参考文章:

  • https://blog.csdn.net/qq_45966440/category_11191690.html?spm=1001.2014.3001.5515
  • https://javaguide.cn/cs-basics/operating-system/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%B8%B8%E8%A7%81%E9%9D%A2%E8%AF%95%E9%A2%98&%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93/
  • https://blog.csdn.net/weixin_43591980/category_10638797.html?spm=1001.2014.3001.5515

😳注意:

如果本文中有错误的地方,欢迎评论区指正!🍭

文章目录

1.说说什么是操作系统?

  • 操作系统(Operating System,简称 OS)是管理计算机硬件与软件资源的程序,是计算机的基石。
  • 操作系统本质上是一个运行在计算机上的软件程序 ,用于管理计算机硬件和软件资源。 举例:运行在你电脑上的所有应用程序都通过操作系统来调用系统内存以及磁盘等等硬件。
  • 操作系统存在屏蔽了硬件层的复杂性。 操作系统就像是硬件使用的负责人,统筹着各种相关事项。
  • 操作系统的内核(Kernel)是操作系统的核心部分,它负责系统的内存管理,硬件设备的管理,文件系统的管理以及应用程序的管理。 内核是连接应用程序和硬件的桥梁,决定着系统的性能和稳定性。

2.说一下用户态和系统态是什么?

根据进程访问资源的特点,我们可以把进程在系统上的运行分为两个级别:

  1. 用户态:用户态运行的进程可以直接读取用户程序的数据。
  2. 系统态:可以简单的理解系统态运行的进程或程序几乎可以访问计算机的任何资源,不受限制。

👨‍💻面试官追问:为什么要划分用户态和系统态?

一个最主要原因是要把用户程序和系统程序区分开,以利于程序的共享和保护。显然,这也是以增加系统复杂度和系统开销为代价的

3.简单说下你对并发和并行的理解?

  • 并发:同一时间段,多个任务都在执行 (单位时间内不一定同时执行)
  • 并行: 单位时间内,多个任务同时执行

打个比方:

并发(concurrent)是同一时间应对(dealing with)多件事情的能力
并行(parallel)是同一时间动手做(doing)多件事情的能力。

4.说说进程和线程的概念?

  • 进程:进程是系统进行资源分配和调度的一个独立单位,是系统中的并发执行的单位。
  • 线程:线程是进程的一个实体,也是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,有时又被称为轻权进程或轻量级进程。

👨‍💻面试官追问:说说进程和线程的区别?

  1. 进程是资源分配的最小单位,而线程是CPU调度的最小单位
  2. 线程和进程最大的不同在于基本上各进程是独立的而各线程则不一定,因为同一进程中的线程极有可能会相互影响。
  3. 线程更轻量,线程上下文切换成本一般比进程上下文切换低。线程也被称为轻量级进程。
  4. 不同进程地址空间相互独立,同一进程内的线程共享同一地址空间。一个进程的线程在另一个进程内是不可见的
  5. 进程间通信较为复杂。线程通信相对简单,因为它们共享进程内的内存。一个例子是多个线程可以访问同一个共享变量。
    • 同一台计算机的进程通信称为IPC(Inter-process communication).
    • 不同计算机之间的进程通信,需要通过网络,并遵守共同的协议,如HTTP

👨‍💻面试官追问:为什么有了进程,还需要线程?

进程可以使多个程序并发执行,以提高资源的利用率和系统的吞吐量,但是其带来了一些缺点

  1. 进程在同—时间只能干一件事情
  2. 进程在执行的过程中如果阻塞,整个进程就会被挂起,即使进程中有些工作不依赖与等待的资源,仍然不会执行

基于以上的缺点,操作系统引入了比进程粒度更小的线程,作为并发执行的基本单位,从而减少程序在并发执行时所付出的时间和空间开销,提高并发性能

5.说说操作系统中进程的状态转换?

  • 创建态:进程正在被创建, 操作系统为进程分配资源,初始化PCB

  • 就绪态:已经具备运行条件,但由于没有空闲CPU,而暂时不能运行。

  • 运行态:占有CPU,并在CPU上运行。

  • 阻塞态:又称等待态。因等待某一事件而暂时不能运行。

  • 终止态:进程正从系统中撤销,操作系统会回收进程拥有的资源,撤销PCB

状态转换图:

6.说一下进程间的通信方式有哪些?

进程间通信IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。

管道

管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

命名管道

匿名管道由于没有名字,只能用于亲缘关系的进程间通信。为了克服这个缺点,提出了命名管道。命名管道严格遵循先进先出(first in first out)。命名管道以磁盘文件的方式存在,可以实现本机任意两个进程通信。

消息队列

  • 消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符ID来标识
  • 消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级
  • 消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除
  • 消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。

信号量

信号量是一个计数器,可以用来控制多个进程对共享资源的访问。通常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。

共享内存

  • 共享内存(Shared Memory) ,指两个或多个进程共享一个给定的存储区
  • 共享内存是最快的一种IPC,因为进程是直接对内存进行存取。

👨‍💻面试官追问:那你在说说线程间的同步的方式有哪些呢?

  1. 互斥量(Mutex)

    采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。比如 Java 中的 synchronized 关键词和各种 Lock 都是这种机制

  2. 信号量(Semphares)

    它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量

  3. 事件(Event)

    Wait/Notify通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作

7.说说你对同步、异步、阻塞、非阻塞的理解?

  • 同步

    同调用者执行一个操作之后,等待结果,结果到达之后才继续执行后续的操作。如果被调用者没有响应那会一直不返回

  • 异步

    调用者执行一个操作之后,不等待结果可以去执行其他的操作,而操作执行完成会发出完成通知给调用者,然后再继续执行刚才的操作

  • 阻塞

    阻塞是线程在发出请求,在得到消息之前,会一直挂起,只有得到结果之后,才会返回

  • 非阻塞

    非阻塞是线程在发出请求,当前线程不会挂起,而是返回去接着做别的事情,但是自己会主动回来check 下被调用者对请求的处理情况

8.说说你了解的进程调度算法有哪些?

  1. 先到先服务(FCFS)调度算法

    从就绪队列中选择一个最先进入该队列的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度

  2. 短作业优先(SJF)的调度算法

    从就绪队列中选出一个估计运行时间最短的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度

  3. 时间片轮转调度算法

    时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法,又称 RR(Round robin)调度。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间

  4. 多级反馈队列调度算法

    前面介绍的几种进程调度的算法都有一定的局限性。如短进程优先的调度算法,仅照顾了短进程而忽略了长进程 。多级反馈队列调度算法既能使高优先级的作业得到响应又能使短作业(进程)迅速完成。,因而它是目前被公认的一种较好的进程调度算法,UNIX 操作系统采取的便是这种调度算法

  5. 优先级调度

    为每个流程分配优先级,首先执行具有最高优先级的进程,依此类推。具有相同优先级的进程以先到先服务(FCFS)调度方式执行。可以根据内存要求,时间要求或任何其他资源要求来确定优先级

9.说说什么是死锁?

死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。比如有一个线程A,已经持有了锁A,但是试图获取锁B,线程B持有锁B,而试图获取锁A,这种情况下就会产生死锁。

👨‍💻面试官追问:说一下死锁产生的原因有哪些?

  1. 对系统资源的竞争。各进程对不可剥夺的资源(如打印机)的竞争可能引起死锁,对可剥夺的资源(CPU)的竞争是不会引起死锁的。
  2. 进程推进顺序非法。请求和释放资源的顺序不当,也同样会导致死锁。例如,并发执行的进程P1、P2分别申请并占有了资源R1、R2,之后进程p1又紧接着申请资源R2,而进程p2又申请资源R1,两者会因为申请的资源被对方占有而阻塞,从而发生死锁。
  3. 信号量的使用不当也会造成死锁。如生产者-消费者问题中,如果实现互斥的P操作在实现同步的P操作之前,就有可能导致死锁。(可以把互斥信号量、同步信号量也看做是一种抽象的系统资源)。

总之,对不可剥夺资源的不合理分配,可能导致死锁。

👨‍💻面试官追问:说说死锁产生的几个必要条件?

  • 互斥条件

    资源必须处于非共享模式,即一次只有一个进程可以使用。如果另一进程申请该资源,那么必须等待直到该资源被释放为止。

  • 请求与保持条件

    一个进程因请求资源而阻塞时,对已获得的资源保持不放。

  • 不剥夺条件

    线程已获得的资源在未使用完之前不能被其他线程强行剥夺,只有自己使用完毕后才释放资源。

  • 循环等待条件

    若干进程之间形成一种头尾相接的循环等待资源关系。

👨‍💻面试官追问:知道怎么预防死锁吗?

  1. 破坏互斥条件

    将互斥使用的资源改造为允许共享使用的资源

  2. 破坏请保持条件

    只要有一个资源得不到分配,也不给这个进程分配其他的资源

  3. 破坏不可剥夺条件

    当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源

  4. 破坏环路等待条件

    系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反

👨‍💻面试官追问:怎么解除死锁?

  1. 资源剥夺法

    挂起(暂时放到外存上)某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但是应防止被挂起的进程长时间得不到资源而饥饿

  2. 撤销进程法

    强制撤销部分、甚至全部死锁进程,并剥夺这些进程的资源。这种方式的优点是实现简单,但所付出的代价可能会很大。因为有些进程可能已经运行了很长时间,已经接近结束了,一旦被终止可谓功亏一篑,以后还得从头再来

  3. 进程回退法

    让一个或多个死锁进程回退到足以避免死锁的地步。这就要求系统要记录进程的历史信息,设置还原点

10.操作系统的内存管理主要是做什么?

操作系统的内存管理主要负责内存的分配与回收,另外地址转换也就是将逻辑地址转换成相应的物理地址等功能也是操作系统内存管理做的事情。

11.说说常见的几种内存管理机制?

  1. 块式管理

    远古时代的计算机操系统的内存管理方式。将内存分为几个固定大小的块,每个块中只包含一个进程。如果程序运行需要内存的话,操作系统就分配给它一块,如果程序运行只需要很小的空间的话,分配的这块内存很大一部分几乎被浪费了。这些在每个块中未被利用的空间,我们称之为碎片。

  2. 页式管理

    把主存分为大小相等且固定的一页一页的形式,页较小,相对相比于块式管理的划分力度更大,提高了内存利用率,减少了碎片**。页式管理通过页表对应逻辑地址和物理地址。**

  3. 段式管理

    页式管理虽然提高了内存利用率,但是页式管理其中的页实际并无任何实际意义。 段式管理把主存分为一段段的,段是有实际意义的,每个段定义了一组逻辑信息,例如,有主程序段 MAIN、子程序段 X、数据段 D 及栈段 S 等。 段式管理通过段表对应逻辑地址和物理地址。

  4. 段页式管理机制

    段页式管理机制结合了段式管理和页式管理的优点简单来说段页式管理机制就是把主存先分成若干段,每个段又分成若干页,也就是说段页式管理机制中段与段之间以及段的内部的都是离散的。

12.说一下分页和分段的具体区别?

  1. 段是信息的逻辑单位,它是根据用户的需要划分的,因此段对用户是可见的。页是信息的物理单位,是为了管理主存的方便而划分的,对用户是透明的

  2. 段的大小不固定,有它所完成的功能决定。页的大小固定,由系统决定

  3. 段向用户提供二维地址空间页向用户提供的是一维地址空间

  4. 段是信息的逻辑单位,便于存储保护和信息的共享页的保护和共享受到限制

13.什么是缓冲区溢出?

  • 缓冲区为暂时置放输出或输入资料的内存。
  • 缓冲区溢出是指当计算机向缓冲区填充数据时超出了缓冲区本身的容量,溢出的数据覆盖在合法数据上。
  • 造成缓冲区溢出的主要原因是程序中没有仔细检查用户输入是否合理。
  • 计算机中,缓冲区溢出会造成的危害主要有以下两点:
    1. 程序崩溃导致拒绝服务
    2. 跳转并且执行一段恶意代码。

14.聊聊物理地址、逻辑地址、虚拟内存这三个有什么区别?

  1. 物理地址

    它是地址转换的最终地址,进程在运行时执行指令和访问数据最后都要通过物理地址从主存中存取,是内存单元真正的地址。

  2. 逻辑地址

    是指计算机用户看到的地址。逻辑地址并不一定是元素存储的真实地址,即数组元素的物理地址(在内存条中所处的位置),并非是连续的,只是操作系统通过地址映射,将逻辑地址映射成连续的,这样更符合人们的直观思维。

  3. 虚拟内存

    是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。

15.为什么要有虚拟地址空间呢?

因为早期的计算机运行方式是直接将程序运行在物理内存上。这就存在三个问题:

  1. 地址空间不隔离:所有进程都直接访问物理地址,程序使用的物理空间不是隔离的
  2. 运行效率低:监控程序直接将整个程序装入内存进行执行
  3. 运行地址不确定:因为每次执行装入的物理地址是不确定的

而通过虚拟地址访问内存有以下优势:

  • 程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区。
  • 程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。当物理内存的供应量变小时,内存管理器会将物理内存页(通常大小为 4 KB)保存到磁盘文件。数据或代码页会根据需要在物理内存与磁盘之间移动。
  • 不同进程使用的虚拟地址彼此隔离。一个进程中的代码无法更改正在由另一进程或操作系统使用的物理内存

16.说说什么是虚拟内存?

虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换

与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更容易,对真正的物理内存(例如 RAM)的使用也更有效率。

17.说说虚拟内存技术实现的几种方式?

一共有三种:

  1. 请求分页存储管理

    • 在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。(操作系统要提供请求调页功能,将缺失页面从外存调入内存)
    • 若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到内存。(操作系统要提供页面置换的功能,将暂时用不到的页面换出外存)
  2. 请求分段存储管理

    1. 建立在分段存储管理之上,增加了请求调段功能、分段置换功能。
    2. 请求分段储存管理方式就如同请求分页储存管理方式一样,在作业开始运行之前,仅装入当前要执行的部分段即可运行;在执行过程中,可使用请求调入中断动态装入要访问但又不在内存的程序段;当内存空间已满,而又需要装入新的段时,根据置换功能适当调出某个段,以便腾出空间而装入新的段。
  3. 请求段页式存储管理

    1. 请求段页式存储管理是建立在段页式存储管理基础上的一种段页式虚拟存储管理。
    2. 当进程运行过程中,访问到不在内存的页时,若该页所在的段在内存,则只产生缺页中断,将所缺的页调入内存;若该页所在的段不在内存,则先产生缺段中断再产生缺页中断,将所缺的页调入内存。若进程需要访问的页已在内存,则对页的管理与段页式存储管理相同。

18.说说页面置换算法有哪些?

  1. 最佳页面置换算法

    最佳置换算法所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,但由于人们目前无法预知进程在内存下的若干页面中哪个是未来最长时间内不再被访问的,因而该算法无法实现。一般作为衡量其他置换算法的方法。

  2. 先进先出页面置换算法

    总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面进行淘汰。

  3. 最近最久未使用页面置换算法

    LRU算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 T,当须淘汰一个页面时,选择现有页面中其 T 值最大的,即最近最久未使用的页面予以淘汰。

  4. 最少使用页面置换算法

    该置换算法选择在之前时期使用最少的页面作为淘汰页。

19.谈谈你对动态链接库和静态链接库的理解?

  • 静态链接

    就是在编译链接时直接将需要的执行代码拷贝到调用处,优点就是在程序发布的时候就不需要的依赖库,也就是不再需要带着库块发布,程序可以独立执行。缺点是体积可能会相对大一些。

  • 动态链接

    就是在编译的时候不直接拷贝可执行代码,而是通过记录一系列符号和参数,在程序运行或加载时将这些信息传递给操作系统,操作系统负责将需要的动态库加载到内存中,然后程序在运行到指定的代码时,去共享执行内存中已经加载的动态库可执行代码,最终达到运行时连接的目的。优点是多个程序可以共享同一段代码,而不需要在磁盘上存储多个拷贝,缺点是由于是运行时加载,可能会影响程序的前期执行性能

20.什么是生产者消费者模型?

  • 对于生产者

    在操作系统中,生产者生产一条数据,首先查看缓冲区能否放入数据,有没有空的位置,如果有往下执行,否则说明缓冲区全满了,消费者还没有及时的来消费数据。这时候生产者会进入阻塞等待(会唤醒消费者去消费数据)。
    同样的,假设多个生产者都已经申请到执行权时,此时只能有一个生产者可以进入生产状态,所以其他几个生产者又要被阻塞一次。

  • 对于消费者

    消费者消费一条数据时,首先查看缓冲区是否有数据单元,如果有执行消费,否则消费者进入阻塞等待(会唤醒生产者去生产数据)。

21.局部性原理知道吗?

局部性原理表现在两个方面:

  1. 时间局部性

    如果执行了程序中的某条指令,那么不久后这条指令很有可能再次执行;如果某个数据被访问过,不久之后该数据很可能再次被访问。(因为程序中存在大量的循环)

  2. 空间局部性

    一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问。(因为很多数据在内存中都是连续存放的,并且程序的指令也是顺序地在内存中存放的)

👨‍💻面试题追问:局部性原理应用在哪里?

高速缓存技术就是,将近期会频繁访问到的数据放到更高速的存储器中,暂时用不到的数据放到更低速存储器中。

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

面试题MySQL常见面试题合集

面试题操作系统常见面试题总结

面试题Java基础篇-常见面试题总结p3

程序员面试题合集

Java集合面试题看这篇就够了

Java集合面试题看这篇就够了