操作系统面试题目选汇
操作系统面试例题主要包括:进程、线程、内存管理、垃圾回收和缓存等诸多方面
进程
Q1:解释操作系统原理中的作业、进程、线程、管程各自的定义。
A:作业:用户在一次解题或一个事务处理过程中要求计算机系统所工作的集合,包括-用户程序、所需要的数据及控制命令等。作业是由一系列有序的步骤组成的。
进程:一个程序在一个数据集合上的一次运行过程。所以一个程序在不同数据集合上运行,乃至一个程序在同样数据集合上的多次运行都是不同进程。
线程:线程是进程中的一个实体,是被系统独立调度和执行的基本单位。
管程:管程实际上是定义了一个数据结构和在该数据结构上的能为并发进程所执行的一组操作,这组操作能同步进程和改变管程中的数据。
Q2:进程间的通信如何实现
A:常用的进程间通信的方式有:信号、信号量、消息队列、共享内存(详见本人的另一篇博文)
所谓“进程通信”-就是不同进程之间进行一些“接触”。这些接触有简单,也有复杂。机制不同,复杂度也不同。通信是一个广义上的意义,不仅仅指传递一些message。它们的使用方法是基本相同的,所以只要掌握了一种使用方法,然后记住其他的使用方法即可。
信号和信号量是不同的,它们虽然都可用来实现同步和互斥,但前者是使用信号处理器来进行的,后者是使用P、V操作来实现的。
消息队列是比较高级的一种进程间通信的方法,因为它真的可以在进程间传送message,连传送一个“I seek U”都可以。一个消息队列可以被多个进程所共享(IPC就是在这个基础上进行的);如果一个进程的消息太多,一个消息队列放不下,也可以用多于一个的消息队列(不过管理会更加复杂)。共享消息队列的进程所发送的消息除了message本身外还有一个标志,这个标志可以指明该消息将由哪个进程或者是哪类进程接受。每一个共享消息队列的进程针对这个队列也有自己的标志,可以用来声明自己的身份。
Q3:在Windows编程中互斥器(mutex)的作用和临界区(critical section)类似,请说一下二者间的主要区别。
A:两者的区别是mutex可以用于进程之间互斥,critical section是线程之间的互斥。
Q4:什么是死锁?产生死锁的必要条件?如何避免死锁的产生?
A:死锁(deadlocks):指2个或者2个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁。
产生死锁的4个必要条件:
i. 互斥条件:一个资源每次只能被一个进程使用;
ii. 强求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放;
iii. 不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺;
iv. 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
3种预防措施:
a. 采用资源静态分配策略,破坏“部分分配”条件;
b. 允许进程剥夺使用其他进程占有的资源,从而破坏“不可剥夺”条件;
c. 采用资源有序分配法,破坏“环路”条件。
线程
Q1:请描述进程和线程的差别。
A:进程是程序的一次执行。线程可以理解为进程执行的一段程序片段。
在一个多任务环境中下面的概念可以帮助我们理解两者的差别:
进程间是独立的,这表现在内存空间、上下文环境上;线程运行在进程空间内。
一般来讲,进程无法突破进程边界存取其他进程内的存储空间;而线程由于处于进程空间内,所以同一进程所产生的线程共享同一内存空间。
同一进程中的两段代码不能同时执行,除非引入线程。
线程是属于进程的,当进程退出时该进程所产生的线程都会被强制退出并清除。线程占用的资源少于进程占用的资源。线程和进程都可以有优先级。
Q2:DLL文件是什么?它有几种调用方式?
A:DLL(Dynamic Linkable Library)是一种不能单独运行的文件,它允许程序共享执行特殊任务所必需的代码和其他资源。一般来说,DLL是一种磁盘文件,以.dll、.DRV、.FON、.SYS和.EXE为扩展名的系统文件都可以是DLL。它由全局数据、服务函数和资源组成,在运行时被系统加载到调用进程的虚拟空间中,成为调用进程的一部分。
调用方式有2种:
1) 静态:由编译系统完成对DLL的加载和应用程序结束时DLL卸载的编码。如:还有其他程序使用该DLL,则Windows对DLL的应用记录减1,直到所有相关程序都结束对该DLL的使用时才释放它,此方式简单实用,但不够灵活。只能满足一般要求。
2) 动态:由编程者用API函数加载和卸载DLL来达到调用DLL的目的。使用上较复杂,但能更加有效地使用内存,是编制大型应用程序时的重要方式。
内存管理:
Q1:垃圾回收的优点与原理是什么?并考虑2种回收机制。
A:Java中最显著的特点就是引入了垃圾回收机制,使C++程序员最头疼的内存管理的问题迎刃而解。由于有垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。
优点:垃圾回收可以有效地防止内存泄露,有效地使用可以使用的内存。
原理:垃圾回收器通常作为一个单独的低级别的线程运行,在不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不用实时地调用垃圾回收器对某个对象或所有对象进行垃圾回收。
垃圾回收机制有3种:分代复制垃圾回收、标记垃圾回收和增量垃圾回收。
Q2:CPU中的缓存和操作系统中的缓存分别是什么?
A:CPU中的缓存--高速缓冲存储器(Cache)
Cache是位于CPU与内存之间的临时存储器,它的容量比内存小但交换速度快。在Cache中的数据是内存中的一小部分,但这一小部分是短时间内CPU即将访问的。当CPU调用大量数据时,就可避开内存直接从Cache中调用,从而加快读取速度。
操作系统中的缓存--快表
在操作系统中,为提高系统的存取速度,在地址映射机制中增加一个小容量的联想寄存器(相联存储器),即快表,用来存放当前访问最频繁的少数活动页面的页号。当某用户需要存取数据时,根据数据所在的逻辑页号在快表中找到其对应的内存块页号,在联系页内地址,形成物理地址。如果在快表中没有相应的逻辑页号,则地址映射仍可以通过内存中的页表进行,得到空闲块号后需将该块号填入快表的空闲块中。如果快表中没有空闲块,则根据淘汰算法淘汰某一行,再填入新的页号和块号。
快表查找内存块的物理地址消耗的时间大大降低了,使得系统效率得到了极大提高。如:Linux使用页面Cache的目的是加快对磁盘上的文件的访问。内存映射文件以每次一页的方式读出并将这些页面存储在页面的Cache中。
总结:
操作系统有关的问题还有很多,在这里只是涉及些经常会碰到的面试题,属于比较浅显的问题,希望自己能够由浅入深,慢慢搞懂!