面试题——操作系统

本文介绍了操作系统面试中的常见问题,涉及进程、线程、管程的定义,进程间通信方式,互斥器与临界区的区别,死锁的条件与避免策略,进程的三种基本状态,以及静态链接库与动态链接库的对比。还讨论了TCP与UDP的区别。
摘要由CSDN通过智能技术生成

例题1:试解释操作系统原理中的作业、进程、线程、管程各自的定义。

答:作业:用户在一次解题或一个事务处理过程中要求计算机系统所做工作的集合。包括用户程序、所需要的数据及控制命令。作业是由一系列有序的步骤组成的。
进程:一个程序在一个数据集合上的一次运行过程。所以一个程序在不同数据集合上运行,乃至一个程序在同样数据集合上的多次运行都是不同的进程。
线程:线程是进程中的一个实体,是被系统独立调度和执行的基本单位。
管程:管程实际上是定义了一个数据结构和在该数据结构上的能为并发进程所执行的一组操作,这组操作能同步进程和改变管程中的数据。

例题2:进程间的通信如何实现?

答:现在最常用的进程间通信的方式有信号、信号量、消息队列、共享内存。
所谓进程间通信,就是不同进程之间进行一些“接触”。这种接触有简单,也有复杂。机制不同,复杂度也不一样。通信时一个广义上的意义,不仅仅指传递一些message。它们的使用方法是基本相同的,所以只要掌握了一种使用方法,然后记住其他的使用方法就可以了。信号和信号量是不同的,它们虽然都可用来实现同步和互斥,但前者是使用信号处理器来进行的,后者是使用P,V操作来实现的。消息队列是比较高级的一种进程间通信方法,因为它真的可以在进程间传送message,连接传送一个“I seek you”都可以。
一个消息队列可以被多个进程所共享(IPC就是在这个基础上进行的);如果一个进程的消息太多,一个消息队列放不下,也可以用多于一个的消息队列(不过可能管理会比较复杂)。共享消息队列的进程所发送的消息中除了message本身外还有一个标志,这个标志可以指明该消息将由哪个进程或者哪类进程接受。每一个共享消息队列的进程针对这个队列也有各自的标志,可以用来声明自己的身份。

例题3:在Windows编程中互斥器(mutex)的作用和临界区(critical section)类似,请说一下二者间的主要区别。

答:两者的区别是mutex可以用于进程之间互斥,critical section是线程之间的互斥。

例题4、所谓死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁。

产生死锁的4个必要条件如下。
1、互斥条件:一个资源每次只能被一个进程使用。
2、请求和保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3、不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺。
4、循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
这四个条件是死锁发生的必要条件,只要死锁发生这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

避免死锁的3种预防措施:
1、采用资源静态分配策略,破坏“部分分配”条件。
2、允许进程剥夺使用其他进程占有的资源,从而破坏“不可剥夺”条件。
3、采用资源有序分配法,破坏“环路”条件。

死锁的避免不严格地限制死锁的必要条件的存在,而是系统在系统运行过程中小心地避免死锁的最终发生。避免死锁算法中最具代表性的算法是银行家算法,该算法需要检查申请者对资源的最大需求量,如果系统现存的各类资源可以满足申请者的请求,就满足申请者的请求。这样申请者就可很快完成其计算,然后释放它占用的资源,从而保证了系统中的所有进程都能完成,所以可以避免死锁的发生。

例题5:请描述进程的三种基本状态。
答:进程在运行中不断地改变其运行状态。通常,一个运行进程必须具有以下三种基本状态。
1、就绪状态:当进程已分配除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。
2、执行状态:当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。
3、阻塞状态:正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的事件可以有多种,例如,等待I/O完成,申请缓冲区不能满足、等待信号(信号)等。

例题6:请描述进程和线程的差别。
答:进程是程序的一次执行。线程可以理解为进程中执行的一段程序片段。在一个多任务环境中下面的概念可以帮助我们理解两者间的差别。
进程间是独立的,这表现在内存空间、上下文环境上;线程运行在进程空间内。一般来讲,进程无法突破进程边界存取其他进程内的存储空间;而线程由于处于进程空间内,所以同一进程所产生的线程共享同一内存空间。
同一进程中的两段代码不能同时执行,除非引入线程。
线程属于进程的,当进程退出时该进程所产生的线程都会被强制退出并清除。线程占用的资源要少于进程所占用的资源。进程和线程都可以有优先级。
进程可以通过IPC通信,线程不可以。

例题7:Windows平台的大多数程序都使用各种动态链接库(DLL)来避免重复实现功能。操作系统为每个程序加载若干个DLL,具体由程序的类型决定。当程序不指定DLL的绝对位置时,将使用默认的搜索顺序来找到它。默认情况下,操作系统所使用的搜索顺序为:(1)内存;(2)KnowDLLs;(3)清单与.local;(4)应用程序目录;(5)当前工作目录;(6)系统目录;(7)路径变量。

例题8:目前以lib为后缀的库有两种,一种为静态链接库,另一种为动态链接库的导入库。虽然静态链接库和动态链接库的导入库都是.lib文件,但是区别很大,它们实质是不一样的东西。静态库本身就包含了实际执行代码、地址符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。
静态链接库是一个或多个obj文件的打包,所以有人干脆把从obj文件生成lib的过程称为archive,即合并在一起。比如你链接一个静态库,如果其中有错,它会准确地找到是哪个obj有错,即静态lib只是壳子。当我们的应用工程在使用静态链接库的时候,静态链接库要参与编译,在生成执行文件之前的链接过程中,将静态链接库的全部指令直接接入可执行文件中,故而,在可执行文件生成之后,静态链接库.lib文件既可以弃之不用。
动态链接库(dll)是作为共享函数库的可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个.dll文件中,该dll包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。dll还有助于共享数据和资源。多个应用程序可同时访问内存中单个dll副本的内容。使用动态链接代替静态链接有若干优点。dll节省内存,减少交换操作,节省磁盘空间,更易于升级(不需要重重链接和重编译),提供售后支持。
静态链接库和动态链接库都是共享代码的方式,如果采用静态链接库,lib中的指令都全部被直接包含在最终生成的exe文件中了。但是若使用dll(即动态链接库),该dll不必被包含在最终exe文件中,exe文件执行时可以“动态”地引用和卸载这个与exe独立的dll文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以包含其他的动态或静态链接库。动态链接库与定位dll函数的可执行代码所需的信息。在静态链接库的使用中,链接器从静态链接库获取所有被引用的函数,并将库同代码一起放到可执行文件中。

例9:TCP和UDP有什么区别?
答:TCP是传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须现在双方之间建立一个TCP链接,之后才能传输数据。TCP提供超时重发、丢弃重复数据、检验数据、流量控制等功能,保证数据能从一端传到另一端。
UDP是用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
参考资料:《程序员面试宝典》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值