操作系统常见问题
简单记录操作系统中的常见概念和原理
参考:
进程和线程
- 进程:对运行时程序的封装,是系统进行资源调度和分配的基本单位,实现操作系统的并发
- 线程:线城是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的实时性,实现程序内部的并发
- 关系:一个程序至少有一个进程,一个进程至少有一个线程,线程依赖于进程
- 进程拥有独立的内存单位,而多个线程共享进程的内存
进程间通信的方式
- 管道:管道可用于具有亲缘关系的父子进程间的通信
- 信号:用于通知接收进程某个事件已经发生
- 消息队列:消息的链接表,有写权限的进程可以向队列中添加信息,有读权限的进程可以从队列里读
- 共享内存:多个进程访问同一内存空间,需要依靠同步操作
- 套接字:用于网络中不同机器间的进程通信
线程的同步方式
- 互斥量:只有拥有互斥对象的线程才有访问公共资源的权限
- 信号量:允许同一时刻多个线程访问同一资源,但控制同一时刻访问此资源的最大线程数量
- 信号,Wait/Notify:通过通知操作的方式来保持多线程同步
死锁
- 定义:每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁
- 死锁产生的必要条件
- 互斥:至少一个资源属于非共享模式
- 占有等待:一个进程必须占有至少一个资源,并等待另一个资源,而该资源为其他进程所占有
- 非抢占:进程不能被抢占,即资源只能被进程在完成任务后自愿释放
- 循环等待:若干进程之间形成一种头尾相接的环形等待资源关系
- 死锁预防、避免、接触
- 死锁的预防:打破死锁的四个产生条件之一
- 死锁的避免:动态地检测资源分配状态,以确保循环等待条件不成立,确保系统处于安全状态
- 死锁的解除:进程结束和资源抢占
进程的状态
- 就绪状态:进程已获得除处理机以外的所需资源,等待分配处理机资源
- 运行状态:占用处理机资源运行,处于此状态的进程数小于等于CPU数
- 阻塞状态: 进程等待某种条件,在条件满足之前无法执行
线程的状态
在Java虚拟机中,线程从最初的创建到最终的消亡,要经历5个状态:创建(new)、就绪(runnable/start)、运行(running)、阻塞(blocked)、和 死亡(dead)。
- 死亡:包含自然终止:正常运行完;异常终止:调用stop方法
- 阻塞:调用sleep;正在等待:wait,等待notify;被另一个阻塞:调用suspend
分页和分段
- 段式存储管理:符合用户视角的内存分配管理方案。在段式存储管理中,将程序的地址空间划分为若干段(segment),如代码段,数据段,堆栈段;这样每个进程有一个二维地址空间,相互独立,互不干扰。段式管理的优点是:没有内碎片(因为段大小可变,改变段大小来消除内碎片)。但段换入换出时,会产生外碎片
- 页式存储管理:一种用户视角内存与物理内存相分离的内存分配管理方案。在页式存储管理中,将程序的逻辑地址划分为固定大小的页(page),而物理内存划分为同样大小的帧,程序加载时,可以将任意一页放入内存中任意一个帧,这些帧不必连续,从而实现了离散分离。页式存储管理的优点是:没有外碎片(因为页的大小固定),但会产生内碎片(一个页可能填充不满)。
- 区别
- 目的:分页是信息的物理单位;分段是信息的逻辑单位
- 大小:页的大小固定有系统决定,段的长度由功能决定
- 内存碎片:分页没有外碎片,有内碎片;分段没有内碎片,但有外碎片
进程调度的策略
- FCFS(先来先服务,队列实现,非抢占的):先请求CPU的进程先分配到CPU
- SJF(最短作业优先调度算法):平均等待时间最短,但难以知道下一个CPU区间长度
- 优先级调度算法(可以是抢占的,也可以是非抢占的):优先级越高越先分配到CPU,相同优先级先到先服务
- 时间片轮转调度算法(可抢占的):队列中没有进程被分配超过一个时间片的CPU时间,除非它是唯一可运行的进程。如果进程的CPU区间超过了一个时间片,那么该进程就被抢占并放回就绪队列。
- 多级队列调度算法:将就绪队列分成多个独立的队列,每个队列都有自己的调度算法
- 多级反馈队列调度算法:与多级队列调度算法相比,其允许进程在队列之间移动:若进程使用过多CPU时间,那么它会被转移到更低的优先级队列;在较低优先级队列等待时间过长的进程会被转移到更高优先级队列,以防止饥饿发生。
进程同步机制
原子操作、信号量机制、自旋锁管程
虚拟内存
- 定义:虚拟内存允许执行进程不必完全在内存中。虚拟内存的基本思想是:每个进程拥有独立的地址空间,这个空间被分为大小相等的多个块,称为页(Page),每个页都是一段连续的地址。这些页被映射到物理内存,但并不是所有的页都必须在内存中才能运行程序。当程序引用到一部分在物理内存中的地址空间时,由硬件立刻进行必要的映射;当程序引用到一部分不在物理内存中的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的命令。这样,对于进程而言,逻辑上似乎有很大的内存空间,实际上其中一部分对应物理内存上的一块(称为帧,通常页和帧大小相等),还有一些没加载在内存中的对应在硬盘上。
- 页面置换算法
- FIFO先进先出算法
- LRU(Least recently use)最近最少使用算法:根据使用时间到现在的长短来判断
- LFU(Least frequently use)最少使用次数算法:根据使用次数来判断
- OPT(Optimal replacement)最优置换算法:从主存中移出永远不再需要的页面;如无这样的页面存在,则选择最长时间不需要访问的页面。于所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率
- 优点:在内存中可以保留多个进程,系统并发度提高
颠簸
- 定义:频繁的页调度行为,具体来讲,进程发生缺页中断,这时,必须置换某一页。然而,其他所有的页都在使用,它置换一个页,但又立刻再次需要这个页。因此,会不断产生缺页中断,导致整个系统的效率急剧下降,这种现象称为颠簸
- 解决办法:终止进程,增加物理内存,降低多道程序数量
局部性原理
- 时间局部性:最近被访问的页在不久的将来还会被访问
- 空间局部性:内存中被访问的页周围的页也很可能被访问