操作系统常见面试题总结
进程和线程
- 进程是对运行时程序的封装,是系统进行资源调度和分配的基本单位,实现了操作系统的并发
- 线程是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发
- 一个程序至少一个进程,一个进程至少一个线程,线程依赖于进程而存在
- 进程拥有独立的内存单元,而线程共享进程的内存单元
进程间通讯的几种方式
- 管道以及命名管道:管道用于具有父子关系的进程通信,有名管道无论两个进程间有没有关系,都可以通信
- 信号:用于通知接收进程某个事情已经发生
- 消息队列:消息的链接表,克服了上面两种方式中信号量有限的缺点,对消息队列具有写权限的进程可以按照一定的规则向消息队列中添加消息,对消息队列具有读权限的进程可以从消息队列中读取信息
- 共享内存:进程间最有用的通信方式,需要同步方式,比如互斥锁和信号量等
- 信号量:进程间或同一进程不同线程间同步和互斥的手段
- 套接字:应用于网络中的一般进程间的通信方式
线程同步的方式
- 互斥量(Synchronized/Lock):互斥对象机制
- 信号量:运行同一时刻同一线程访问同一资源,但是要控制同一时刻访问此资源的最大线程数量
- 时间(信号)(Wait/Notify):通过通知操作来保持多线程同步,还可以方便的实现多线程优先级的比较操作
死锁
死锁产生的四个必要条件
- 互斥
- 占用并等待
- 非抢占:不能抢占,只能自愿释放
- 循环等待
死锁的基本处理策略
- 死锁预防:打破死锁四个必要条件中的一个就可以了
- 打破互斥条件:允许进程同时访问某些资源,但是某些资源因为自身属性问题,不能被同时访问,所以这种方法实用性不大
- 打破占用并等待条件:可以实行资源先分配策略(进程在运行前一次性向系统申请它需要的全部资源,若所需全部资源得不到满足,则不分配任何资源,此进程暂不运行,只有当系统能满足当前线程所需全部资源时,才一次性将所需资源全部分配给该进程)或者只允许进程在没有占用资源时间才允许申请资源(一个进程可以申请一些资源并使用他们,但是在当前进程申请更多资源之前,它必须全部释放当前所占用的资源,但是这种策略也存在一些缺点:很多情况下,无法预知一个进程所需要的全部资源,因为进程是动态运行的,不可预知,同时会降低资源的利用效率,降低进程的并发性
- 打破非抢占条件:允许某个进程在资源得不到满足时强行从其他进程那里获取资源,实现起来困难,会降低系统性能
- 打破循环等待条件:实行资源有序分配策略,对所有资源排序编号,所有进程对资源的请求必须严格按照资源序号递增的顺序提出,即只有占用了小号资源才能占用大号资源,这样就不产生回环路,预防死锁
- 死锁避免
动态的检测资源分配状态,以确保循环等待条件不成立,从而确保系统处于安全状态
安全状态:存在安全序列,使得系统处于安全状态
比如银行家算法和资源分配图算法