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

目录

1. 进程与线程的区别?

2. 进程的状态及其转换

3. 进程的同步与互斥

4. 进程间的通信方式有哪些?

5. 作业(进程)的调度算法有哪些?

6. 死锁产生的原因,死锁产生的必要条件是什么,如何预防死锁,如何避免死锁?


1. 进程与线程的区别?

  • 根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位。
  • 开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器,线程之间切换的开销小。
  • 所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)。
  • 内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。
  • 包含关系:一个进程最少由一条线程组成。

2. 进程的状态及其转换

操作系统原理常见面试题总结_第1张图片

3. 进程的同步与互斥

互斥:是指某一资源同时只允许一个访问者对其访问,具有唯一性和排他性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。

同步:是指在互斥的基础上(大多数情况),通过其他机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。

简单的说:同步体现的是一种协作性,呼哧体现的是一种排他性。

4. 进程间的通信方式有哪些?

  • 管道:管道是UNIX系统IPC的最古老的形式,所有的UNIX系统都提供此种通信机制。
    • 局限性:(1)半双工,数据只能在一个方向流动,现在有些系统可以支持全双工管道,但是为了最佳的可移植性,应认为系统不支持全双工管道;(2)管道只能在具有公共祖先之间的两个进程之间使用。

  • 命名管道FIFO:未命名的管道只能在两个相关的进程之间通信,通过命名管道FIFO,不相关的进程也能交换数据。FIFO不同于管道之处在于它提供一个路径与之关联,以FIFO的文件形式存在于系统中。
  • 消息队列:
    • 消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识。
    • 消息队列允许一个或多个进程向它写入与读取消息。
    • 管道和命名管道的通信数据都是先进先出原则,消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取,比FIFO更有优势。
  • 共享内存
    • 共享内存允许一个或多个进程共享一个给定的存储区,因为数据不需要在客户端进程与服务器进程之间进行复制,所以这是最快的一种IPC,对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次:一次是从输入文件到共享内存区,另一次是从共享内存区到输出文件。
    • 不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。
    • 特点:速度快、效率高;需要同步机制。
    • 操作流程:(1)创建/打开共享内存 (2)映射共享内存,即把指定的共享内存映射到进程的地址空间用于访问 (3)撤销共享内存映射 (4)删除共享内存
  • 信号量:与IPC结构不同,它是一个计数器。信号量用于实现进程间的同步与互斥,而不是存储进程间通信数据。
    • 特点:(1)信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。 (2)信号量基于操作系统的PV操作,程序对信号量的操作都是原子操作。 (3)每次对信号量的PV操作不仅限于对信号量的值加1或减1,而且可以加减任意正整数。 (4)支持信号量组。
  • 套接字:使用socket进行通信的进程可以是同一台计算机的进程,也可以是通过网络连接起来的不同的计算机上的进程。socket详解

5. 作业(进程)的调度算法有哪些?

  1. 先来先服务(FCFS,First-Come-Frist-Served):此算法的原则是按照作业到达后备作业队列(或进程进入就绪队列)的先后次序来选择作业(或进程)。
  2. 短作业优先(SJF,Shortest Process Next):这种调度算法主要用于作业调度,它从作业后备队列中挑选所需运行时间(估计值)最短的作业进入主存运行。
  3. 时间片轮转调度算法(RR,Round-Robin):当某个进程执行的时间片用完时,调度程序便停止该进程的执行,并将它送入就绪队列的末尾,等待分配下一时间片再执行。然后把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。这样就可以保证就绪队列中的所有进程,在一给定的时间内,均能获得时间片处理机执行时间。
  4. 高响应比优先(HRRN,Highest Response Ratio Next):按照高响应比((已等待时间+要求运行时间)/ 要求运行时间)优先的原则,在每次选择作业投入运行时,先计算此时后备作业队列中每个作业的响应比RP然后选择其值最大的作业投入运行。
  5.  优先权(Priority)调度算法: 按照进程的优先权大小来调度,使高优先权进程得到优先处理的调度策略称为优先权调度算法。注意:优先数越多,优先权越小。
  6. 多级队列调度算法:多队列调度是根据作业的性质和类型的不同,将就绪队列再分为若干个子队列,所有的作业(或进程)按其性质排入相应的队列中,而不同的就绪队列采用不同的调度算法。

6. 死锁产生的原因,死锁产生的必要条件是什么,如何预防死锁,如何避免死锁?

死锁产生的原因:资源竞争、进程推进顺序不当。

死锁产生的必要条件:

  • 互斥:某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程,其他进程就不能再访问,知道该进程访问结束。
  • 不可剥夺:进程所获得的资源在未使用完毕之前,不能被其他进程强行剥夺,而只能由获得该资源的进程资源释放。
  • 占有且等待:一个进程本身占有资源(一种或多种),同时还有资源未得到满足,正在等待其他进程释放该资源。
  • 循环等待:存在一个进程链,使得每一个进程都占有下一个进程所需的至少一种资源。

预防死锁:破坏产生死锁的四个 必要条件之一即可。

死锁的避免:银行家算法,该方法允许进程动态地申请资源,系统在进行资源分配之前,先计算资源分配的安全性。若此次分配不会导致系统从安全状态向不安全状态转换,便可将资源分配给进程;否则不分配资源,进程必须阻塞等待。从而避免发生死锁。

死锁的解除:

  1. 强制性地从系统中撤销一个或多个死锁的进程以断开循环等待链,并收回分配给终止进程的全部资源功剩下的进程使用。
  2. 使用一个有效的挂起和解除机构来挂起一些死锁的进程,其实质是从被挂起的进程那里抢占资源以解除死锁。

你可能感兴趣的:(操作系统)