面试常见问题——操作系统(一)
目录:
- 常见问题
- 动态链接库和静态链接库的优缺点对比
- 轮询任务调度和可抢占式调度的区别
- 进程间通信机制
- 线程与进程的区别和联系、线程是否有相同的堆栈、DLL是否具有独立的堆栈
- 程序应该使用线程的场景
- 多线程程序的优缺点、多进程程序的优缺点、与多线程相比的区别
- 死锁的概念和原因,解决办法
- 临界区和临界资源,临界区互斥实现
- 操作系统管目态如何切换、系统调用、管目态区别
- 硬链接与软链接
- 段页式虚拟存储管理方案的特点
一、常见问题:
1、动态链接库和静态链接库的优缺点对比
- 库:把一些常用函数的目标文件打包在一起,提供相应函数的接口,便于程序员使用。
- 动态链接库(Dynamic Link Library,DLL):
- 定义:把调用的函数所在文件模块和调用函数在文件中的位置等信息链接入目标程序,DLL文件不必包含在最终的EXE文件中,在EXE文件运行时才载入内存,在编译过程中仅简单地引用,其代码体积小。使用方式包括:
- 动态加载(运行时动态链接):在被使用时才被应用程序加载
- 静态加载(载入时动态链接):在应用程序启动时加载
- 优点:
- 节省内存,减少页面交换。多个应用程序启动时,只需将动态库加载到内存一次
- 不同的模块放在不同的动态链接库中,具有很强的可维护性和可扩展性
- 不同编程语言编写的程序只要按照函数调用约定就可以调用同一个DLL函数
- 适用于大规模开发,耦合度小,便于开发和测试
- 缺点:
- 不能解决引用计数
- 使用动态链接的应用程序不是自完备的,它依赖的DLL模块也要存在
- 可能造成DLL地狱(DLL HELL),指在Windows系统中,因为动态链接库的版本或兼容性的问题而造成程序无法正常运行的情况。
- 在Windows操作系统中动态链接库的后缀为.dll,在Linux操作系统中动态链接库的后缀为.so
- 定义:把调用的函数所在文件模块和调用函数在文件中的位置等信息链接入目标程序,DLL文件不必包含在最终的EXE文件中,在EXE文件运行时才载入内存,在编译过程中仅简单地引用,其代码体积小。使用方式包括:
- 静态链接库(Static Link Library,LIB):
- 定义:LIB文件中的指令全部被直接包含在最终生成的exe文件中,函数和数据被编译进一个二进制文件中,代码在编译中已经被载入可执行程序,其体积较大。
- 优点:
- 代码装载速度快,因为在编译时只把需要的那部分内容链接进去,执行速度比动态链接库略快
- 只需保证在开发者的计算机中有正确的.lib文件即可,以二进制形式发布无须考虑版本问题,可避免DLL地狱
- 缺点:
- 如果一个静态链接库被多个应用程序使用,则会被加载多次,造成浪费。
- 可执行文件体积大,包含相同的公共代码,造成浪费
- 函数可以定义在程序自身、静态库、动态库。当出现同名函数时:
- 程序和静态库定义了同名函数,链接时会报重定义错误。
- 程序和动态库定义了同名函数,会覆盖动态库中定义的函数。
- 动态库中定义的同名函数,先链接覆盖后链接的函数。
2、轮询任务调度和可抢占式调度的区别
- 轮询任务调度::
- 定义:轮询调度的原理是每一次把来自用户的请求轮流的分配给内部服务器,从1开始,直到N(内部服务器的个数),然后重新开始循环。只有当前任务主动放弃CPU控制权的情况下(比如任务挂起),才允许其他任务(包括高优先级的任务)控制CPU。
- 无状态调度(无需记录进程的运行状态)
- 对长作业