0%

操作系统相关面试

有过面试经历的人都知道操作系统是面试官必问的几大类型题目之一. 本文对面试/笔试过程中经常会被问到的一些关于操作系统问题进行了梳理和总结。 不是很全,后面遇到后会慢慢补充。

1.说明进程和线程以及它们的区别

进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。
线程:是进程的一个执行单元,是内核调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。
区别:
  1.同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。
  2.同一进程的线程共享本进程的资源(内存/IO/CPU等),而进程之间资源是独立的。
  3.进程可以独立执行,而进程不可以,必须依托进程存在
  4.线程是OS的基本调度单位,而进程不是

2.线程之间同步方式

  1.互斥量(锁):只有拥有互斥对象的线程才有访问公共资源的权限,可以保证公共资源不会被多个线程同时访问
  2.信号量:信号量也是内核对象。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目
  3.事件(信号):通过通知操作的方式来保持多线程的同步,还可以方便的实现多线程的优先级比较的操作

3.进程之间同步方式

  1.管道:有命名管道和非命名管道之分,非命名管道只能用于父子进程通讯,命名管道可用于非父子进程,命名管道就是FIFO,管道是先进先出的通讯方式
  2.消息队列:用于进程之间的通讯,首先在一个进程中创建一个消息队列,然后再往消息队列中写数据,而另一个进程则从那个消息队列读取数据。消息队列是用文件的方式建立的,只有把消息读取后,消息才会消失
  3.信号量:不能传递复杂消息,只能用来同步
  4.共享内存:只要创建一个共享内存区,其它进程就能访问到这个共享内存区中的数据(读写)

4.ThreadLocal机制

  Threadlocal就从另一个角度来解决多线程的并发访问,Threadlocal会为每一个线程维护和绑定变量副本,从而隔离了多个线程的数据共享,每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。
  ThreadLocal并不能替代同步机制,两者面向的问题领域不同。同步机制是为了同步多个线程对相同资源的并发访问,是为了多个线程之间进行通信;而ThreadLocal是隔离多个线程的数据共享,从根本上就不在多个线程之间共享资源,这样当然不需要对多个线程进行同步了。

5.死锁

  死锁是指多个进程在运行过程中,因为争夺资源而造成的一种僵局,如果没有外力推进,处于僵局中的进程就无法继续执行。

死锁原因:

  • 竞争资源:请求同一有限资源的进程数多于可用资源数
  • 进程推进顺序非法:进程执行中,请求和释放资源顺序不合理,如资源等待链

死锁产生的必要条件:

  • 互斥条件:进程对所分配的资源进行排他性的使用
  • 请求和保持条件:进程被阻塞的时候并不释放锁申请到的资源
  • 不可剥夺条件:进程对于已经申请到的资源在使用完成之前不可以被剥夺
  • 环路等待条件:发生死锁的时候存在的一个 进程-资源 环形等待链

死锁处理:

  • 预防死锁:破坏产生死锁的4个必要条件中的一个或者多个;实现起来比较简单,但是如果限制过于严格会降低系统资源利用率以及吞吐量
  • 避免死锁:在资源的动态分配中,防止系统进入不安全状态(可能产生死锁的状态)-如银行家算法
  • 检测死锁:允许系统运行过程中产生死锁,在死锁发生之后,采用一定的算法进行检测,并确定与死锁相关的资源和进程,采取相关方法清除检测到的死锁。实现难度大
  • 解除死锁:与死锁检测配合,将系统从死锁中解脱出来(撤销进程或者剥夺资源)。对检测到的和死锁相关的进程以及资源,通过撤销或者挂起的方式,释放一些资源并将其分配给处于阻塞状态的进程,使其转变为就绪态。实现难度大同

6.内存段页式管理

1.虚地址的构成

  一个进程中所包含的具有独立逻辑功能的程序或数据仍被划分为段,并有各自的段号s。这反映相继承了段式管理的特征。其次,对于段s中的程序或数据,则按照一定的大小将其划分为不同的页。和页式系统一样,最后不足一页的部分仍占一页。这反映了段页式管理中的页式特征。从而,段页式管理时的进程的虚拟地址空间中的虚拟地址由三部分组成:即段号s,页号P和页内相对地址d。虚拟空间的最小单位是页而不是段,从而内存可用区也就被划分成为着干个大小相等的页面,且每段所拥有的程序和数据在内存中可以分开存放。分段的大小也不再受内存可用区的限制。

2.段表和页表

  为了实现段页式管理,系统必须为每个作业或进程建立一张段表以管理内存分配与释放、缺段处理、存储保护相地址变换等。另外,由于一个段又被划分成了若干页,每个段又必须建立一张页表以把段中的虚页变换成内存中的实际页面。显然,与页式管理时相同,页表中也要有相应的实现缺页中断处理和页面保护等功能的表项。另外,由于在段页式管理中,页表不再是属于进程而是属于某个段,因此,段表中应有专项指出该段所对应页表的页表始址和页表长度。

3.动态地址变换过程

  在一般使用段页式存储管理方式的计算机系统中,都在内存中辟出一块固定的区域存放进程的段表和页表。因此,在段页式管理系统中,要对内存中指令或数据进行一次存取的话,至少需要访问三次以上的内存:
第一次是由段表地址寄存器得段表始址后访问段表,由此取出对应段的页表在内存中的地址。
第二次则是访问页表得到所要访问的物理地址。
第三次才能访问真正需要访问的物理单元。