操作系统常见⾯试题总结
总结⼀下算法岗⾯试过程中可能遇到的操作系统基础知识⽅便复习。
1、请分别简单说⼀说进程和线程以及它们的区别。
进程是具有⼀定功能的程序关于某个数据集合上的⼀次运⾏活动,进程是系统进⾏资源调度和分配的⼀个独⽴单位。
线程是进程的实体,是CPU调度和分派的基本单位,它是⽐进程更⼩的能独⽴运⾏的基本单位。
⼀个进程可以有多个线程,多个线程也可以并发执⾏。
2、进程间的通信⽅式有哪些?
进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。
IPC的⽅式通常有管道(包括⽆名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams⽀持不同主机上的两个进程IPC。
管道主要分为:普通管道PIPE 、流管道(s_pipe)、命名管道(name_pipe)
管道是⼀种半双⼯的通信⽅式,数据只能单项流动,并且只能在具有亲缘关系的进程间流动,进程的亲缘关系通常是⽗⼦进程
命名管道也是半双⼯的通信⽅式,它允许⽆亲缘关系的进程间进⾏通信
信号量是⼀个计数器,⽤来控制多个进程对资源的访问,它通常作为⼀种锁机制。
消息队列是消息的链表,存放在内核中并由消息队列标识符标识。
信号是⼀种⽐较复杂的通信⽅式,⽤于通知接收进程某个事件已经发⽣。
共享内存就是映射⼀段能被其它进程访问的内存,这段共享内存由⼀个进程创建,但是多个进程可以访问。
3、进程的状态有哪些?
就绪状态:进程已获得除处理机以外的所需资源,等待分配处理机资源
运⾏状态:占⽤处理机资源运⾏,处于此状态的进程数⼩于等于CPU数
阻塞状态: 进程等待某种条件,在条件满⾜之前⽆法执⾏
4、操作系统常⽤的进程调度算法有哪些?
(1)先来先服务和段作业优先算法(a.先来先服务调度算法;b。短作业(进程)优先调度算法)
(2)⾼优先权优先调度算法(a.⾮抢占式优先权算法;b.抢占式优先权调度算法;c.⾼响应⽐优先调度算法)
(3)基于时间⽚的轮转调度算法(a.时间⽚轮转法;b.多级反馈队列调度算法)
一个线程可以包含多个进程
详见:
5、线程同步的⽅式有哪些?
线程同步的概念:所谓同步,就是并发的线程在⼀些关键点上可能需要互相等待与互通信息,这种相互制约的等待与互通信息称为进程同步。
互斥量:采⽤互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有⼀个,所以可以保证公共资源不会被多个线程同时访问。
信号量:它允许同⼀时刻多个线程访问同⼀资源,但是需要控制同⼀时刻访问此资源的最⼤线程数量。
事件(信号):通过通知操作的⽅式来保持多线程同步,还可以⽅便的实现多线程优先级的⽐较操作。
6、临界资源与临界区的概念。
临界资源:临界资源是⼀次仅允许⼀个进程使⽤的共享资源。各进程采取互斥的⽅式,实现共享的资源称作临界资源。属于临界资源的硬件有,打印机,磁带机等;软件有消息队列,变量,数组,缓冲区等。诸进程间采取互斥⽅式,实现对这种资源的共享。
临界区:每个进程中访问临界资源的那段代码称为临界区(criticalsection),每次只允许⼀个进程进⼊临界区,进⼊后,不允许其他进程进⼊。不论是硬件临界资源还是软件临界资源,多个进程必须互斥的对它进⾏访问。多个进程涉及到同⼀个临界资源的的临界区称为相关临界区。使⽤临界区时,⼀般不允许其运⾏时间过长,只要运⾏在临界区的线程还没有离开,其他所有进⼊此临界区的线程都会被挂起⽽进⼊等待状态,并在⼀定程度上影响程序的运⾏性能。
7、死锁的概念,死锁产⽣的条件,死锁的避免,死锁的预防。
死锁的概念:
在两个或者多个并发进程中,如果每个进程持有某种资源⽽⼜等待其它进程释放它或它们现在保持着
的资源,在未改变这种状态之前都不能向前推进,称这⼀组进程产⽣了死锁。通俗的讲就是两个或多个进程⽆限期的阻塞、相互等待的⼀种状态。
死锁产⽣的条件:
互斥条件:⼀个资源⼀次只能被⼀个进程使⽤
请求与保持(占有并申请)条件:⼀个进程因请求资源⽽阻塞时,对已获得资源保持不放
不剥夺条件:进程获得的资源,在未完全使⽤完之前,不能强⾏剥夺。
循环等待条件:若⼲进程之间形成⼀种头尾相接的环形等待资源关系。
死锁的避免:
死锁避免的基本思想:系统对进程发出的每⼀个系统能够满⾜的资源申请进⾏动态检查,并根据检查结果决定是否分配资源,如果分配后系统可能发⽣死锁,则不予分配,否则予以分配,这是⼀种保证系统不进⼊死锁状态的动态策略。
如果操作系统能保证所有进程在有限时间内得到需要的全部资源,则系统处于安全状态否则系统是不安全的。
典型算法:银⾏家算法
死锁的预防:
我们可以通过破坏死锁产⽣的4个必要条件来 预防死锁,由于资源互斥是资源使⽤的固有特性是⽆法改变的。
破坏“不可剥夺”条件:⼀个进程不能获得所需要的全部资源时便处于等待状态,等待期间他占有的资源将被隐式的释放重新加⼊到 系统的资源列表中,可以被其他的进程使⽤,⽽等待的进程只有重新获得⾃⼰原有的资源以及新申请的资源才可以重新启动,执⾏。
破坏”请求与保持条件“:第⼀种⽅法静态分配即每个进程在开始执⾏时就申请他所需要的全部资源。第⼆种是动态分配即每个进程在申请所需要的资源时他本⾝不占⽤系统资源。
破坏“循环等待”条件:采⽤资源有序分配其基本思想是将系统中的所有资源顺序编号,将紧缺的,稀少的采⽤较⼤的编号,在申请资源时必须按照编号的顺序进⾏,⼀个进程只有获得较⼩编号的进程才能申请较⼤编号的进程。
8、分段和分页的概念:
段是信息的逻辑单位,它是根据⽤户的需要划分的,因此段对⽤户是可见的 ;页是信息的物理单位,是为了管理主存的⽅便⽽划分的,对⽤户是透明的。
段的⼤⼩不固定,有它所完成的功能决定;页⼤⼤⼩固定,由系统决定(⼀般为4k)
段向⽤户提供⼆维地址空间;页向⽤户提供的是⼀维地址空间
段是信息的逻辑单位,便于存储保护和信息的共享,页的保护和共享受到限制。
分页存储管理:⽤户程序的地址空间被划分成若⼲固定⼤⼩的区域,称为“页”,相应地,内存空间分成若⼲个物理块,页和块的⼤⼩相等。可将⽤户程序的任⼀页放在内存的任⼀块中,实现了离散分配。
分段存储管理:将⽤户程序地址空间分成若⼲个⼤⼩不等的段,每段可以定义⼀组相对完整的逻辑信息。存储分配时,以段为单位,段与段在内存中可以不相邻接,也实现了离散分配。
段页式存储管理:
分页系统能有效地提⾼内存的利⽤率,⽽分段系统能反映程序的逻辑结构,便于段的共享与保护,将分页与分段两种存储⽅式结合起来,就形成了段页式存储管理⽅式。
在段页式存储管理系统中,作业的地址空间⾸先被分成若⼲个逻辑分段,每段都有⾃⼰的段号,然后再将每段分成若⼲个⼤⼩相等的页。对于主存空间也分成⼤⼩相等的页,主存的分配以页为单位。
段页式系统中,作业的地址结构包含三部分的内容:段号      页号      页内位移量
程序员按照分段系统的地址结构将地址分为段号与段内位移量,地址变换机构将段内位移量分解为页号和页内位移量。
为实现段页式存储管理,系统应为每个进程设置⼀个段表,包括每段的段号,该段的页表始址和页表长度。每个段有⾃⼰的页表,记录段中的每⼀页的页号和存放在主存中的物理块号。
9、页⾯置换算法有哪些?
最佳置换算法(OPT)(理想置换算法):从主存中移出永远不再需要的页⾯;如⽆这样的页⾯存在,则选择最长时间不需要访问的页⾯。于所选择的被淘汰页⾯将是以后永不使⽤的,或者是在最长时间内不再被访问的页⾯,这样可以保证获得最低的缺页率。
先进先出置换算法(FIFO):是最简单的页⾯置换算法。这种算法的基本思想是:当需要淘汰⼀个页⾯时,总是选择驻留主存时间最长的页⾯进⾏淘汰,即先进⼊主存的页⾯先淘汰。其理由是:最早调⼊主存的页⾯不再被使⽤的可能性最⼤。
最近最久未使⽤(LRU)算法:这种算法的基本思想是:利⽤局部性原理,根据⼀个作业在执⾏过程中过去的页⾯访问历史来推测未来的⾏为。它认为过去⼀段时间⾥不曾被访问过的页⾯,在最近的将来可能也不会再被访问。所以,这种算法的实质是:当需要淘汰⼀个页⾯时,总是选择在最近⼀段时间内最久不⽤的页⾯予以淘汰。
时钟(CLOCK)置换算法:LRU算法的性能接近于OPT,但是实现起来⽐较困难,且开销⼤;FIFO算法实现简单,但性能差。所以操作系统的设计者尝试了很多算法,试图⽤⽐较⼩的开销接近LRU的性能,这类算法都是CLOCK算法的变体。
简单的CLOCK算法是给每⼀帧关联⼀个附加位,称为使⽤位。当某⼀页⾸次装⼊主存时,该帧的使⽤位设置为1;当该页随后再被访问到时,它的使⽤位也被置为1。对于页替换算法,⽤于替换的候选帧集合看做⼀个循环缓冲区,并且有⼀个指针与之相关联。当某⼀页被替换时,该指针被设置成指向缓冲区中的下⼀帧。当需要替换⼀页时,操作系统扫描缓冲区,以查使⽤位被置为0的⼀帧。每当遇到⼀个使⽤位为1的帧时,操作系统就将该位重新置为0;如果在这个过程开始时,缓冲区中所有帧的使⽤位均为0,则选择遇到的第⼀个帧替换;如果所有帧的使⽤位均为1,则指针在缓冲区中完整地循环⼀周,把所有使⽤位都置为0,并且停留在最初的位置上,替换该帧中的页。由于该算法循环地检查各页⾯的情况,故称为CLOCK算法,⼜称为最近未⽤(Not Recently Used, NRU)算法。
10、中断和系统调⽤
所谓的中断就是在计算机执⾏程序的过程中,由于出现了某些特殊事情,使得CPU暂停对程序的执⾏,转⽽去执⾏处理这⼀事件的程序。等这些特殊事情处理完之后再回去执⾏之前的程序。
中断⼀般分为三类:
由计算机硬件异常或故障引起的中断,称为内部异常中断;
由程序中执⾏了引起中断的指令⽽造成的中断,称为软中断(这也是和我们将要说明的系统调⽤相关的中断);
由外部设备请求引起的中断,称为外部中断。
简单来说,对中断的理解就是对⼀些特殊事情的处理。
中断处理程序:当中断发⽣的时候,系统需要去对中断进⾏处理,对这些中断的处理是由操作系统内核中的特定函数进⾏的,这些处理中断的特定的函数就是我们所说的中断处理程序了。
中断的优先级:
中断的优先级说明的是当⼀个中断正在被处理的时候,处理器能接受的中断的级别。中断的优先级也
表明了中断需要被处理的紧急程度。每个中断都有⼀个对应的优先级,当处理器在处理某⼀中断的时候,只有⽐这个中断优先级⾼的中断可以被处理器接受并且被处理。优先级⽐这个当前正在被处理的中断优先级要低的中断将会被忽略。
典型的中断优先级如下所⽰:
机器错误 > 时钟 > 磁盘 > ⽹络设备 > 终端 > 软件中断
当发⽣软件中断时,其他所有的中断都可能发⽣并被处理;但当发⽣磁盘中断时,就只有时钟中断和机器错误中断能被处理了。
系统调⽤相关概念:
进程的执⾏在系统上的两个级别:⽤户级和核⼼级,也称为⽤户态和系统态(user mode and kernel mode)。
程序的执⾏⼀般是在⽤户态下执⾏的,但当程序需要使⽤操作系统提供的服务时,⽐如说打开某⼀设备、创建⽂件、读写⽂件等,就需要向操作系统发出调⽤服务的请求,这就是系统调⽤。
Linux系统有专门的函数库来提供这些请求操作系统服务的⼊⼝,这个函数库中包含了操作系统所提供
的对外服务的接⼝。当进程发出系统调⽤之后,它所处的运⾏状态就会由⽤户态变成核⼼态。但这个时候,进程本⾝其实并没有做什么事情,这个时候是由内核在做相应的操作,去完成进程所提出的这些请求。
系统调⽤和中断的关系就在于,当进程发出系统调⽤申请的时候,会产⽣⼀个软件中断。产⽣这个软件中断以后,系统会去对这个软中断进⾏处理,这个时候进程就处于核⼼态了。
那么⽤户态和核⼼态之间的区别是什么呢?
⽤户态的进程能存取它们⾃⼰的指令和数据,但不能存取内核指令和数据(或其他进程的指令和数据)。然⽽,核⼼态下的进程能够存取内核和⽤户地址
某些机器指令是特权指令,在⽤户态下执⾏特权指令会引起错误
对此要理解的⼀个是,在系统中内核并不是作为⼀个与⽤户进程平⾏的估计的进程的集合,内核是为⽤户进程运⾏的。
11、异步,同步,阻塞
同步和异步:
同步: 当⼀个同步调⽤发出去后,调⽤者要⼀直等待调⽤结果的通知后,才能进⾏后续的执⾏。
异步:当⼀个异步调⽤发出去后,调⽤者不能⽴即得到调⽤结果的返回。
异步调⽤,要想获得结果,⼀般有两种⽅式:
主动轮询异步调⽤的结果;
被调⽤⽅通过callback来通知调⽤⽅调⽤结果。
阻塞与⾮阻塞:
阻塞与⾮阻塞的重点在于进/线程等待消息时候的⾏为,也就是在等待消息的时候,当前进/线程是挂起状态,还是⾮挂起状态。阻塞调⽤在发出去后,在消息返回之前,当前进/线程会被挂起,直到有消息返回,当前进/线程才会被激活.
⾮阻塞调⽤在发出去后,不会阻塞当前进/线程,⽽会⽴即返回。
总结来说,就是同步与异步,重点在于消息通知的⽅式;阻塞与⾮阻塞,重点在于等消息时候的⾏为。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。