操作系统面试知识点总结
一.操作系统概述
1. 操作系统的四个特性
并发:同一段时间内多个程序执行(注意区别并行和并发,前者是同一时刻的多个事件,后者是同一时间段内的多个事件)
共享:系统中的资源可以被内存中多个并发执行的进线程共同使用
虚拟:通过时分复用(如多道程序技术,分时系统)以及空分复用(如虚拟内存)技术实现把一个物理实体虚拟为多个
异步:系统中的进程是以走走停停的方式执行的,且以一种不可预知的速度推进
2.操作系统的主要功能
处理机管理:处理机分配都是以进程为单位,所以处理机管理也被看做是进程管理。包括进程控制,进程同步,进程通信和调度(作业调度和进程调度)
存储器管理(或者内存管理):内存分配,内存保护,地址映射,内存扩充
设备管理:管理所有外围设备,包括完成用户的IO请求;为用户进程分配IO设备;提高IO设备利用率;提高IO速度;方便IO的使用
文件管理:管理用户文件和系统文件,方便使用同时保证安全性。包括:文件存储空间管理,目录管理,文件读写管理以及文件共享和保护
提供用户接口:程序接口(如API)和用户接口(如GUI)
二.进程和线程
3.进程的状态与转换
进程的三种基本状态:就绪(Ready)状态,执行(Running)状态,阻塞(Block)状态 (引入的两种常见的状态:创建状态,终止状态)
运行状态:进程正在处理机上运行。在单处理机环境下,每一时刻最多只有一个进程处于运行状态。
就绪状态:进程已处于准备运行的状态,即进程获得了除处理机之外的一切所需资源,一旦得到处理机即可运行。
阻塞状态,又称等待状态:进程正在等待某一事件而暂停运行,如等待某资源为可用(不包括处理机)或等待输入/输出完成。即使处理机空闲,该进程也不能运行。
4.进程同步的几种机制
同步机制需要遵循的原则:
1.空闲让进,2.忙则等待,3.有限等待,4.让权等待
经典的进程同步问题:生产者-消费者问题;哲学家进餐问题;读者-写者问题
进程同步的机制:硬件同步机制、信号量机制、管程机制
硬件同步机制:关中断
利用Test-and-Set指令实现互斥(Test-and-Set TS指令:”测试并建立“)
利用Swap指令实现进程互斥(该指令称为对换指令,用于交换两个字的内容)
信号量(Semaphores)机制
管程机制
5.进程的通信方式有哪些?
主要分为:管道、系统IPC(包括消息队列、信号量、共享存储器)、SOCKET、远程过程(函数)调用RPC
管道主要分为:普通管道PIPE 、流管道(s_pipe)、命名管道(name_pipe)
6.请分别简单说一说进程和线程以及它们的区别
- 进程是具有一定功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源调度和分派的一个独立单位。
- 线程是进程的实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,线程是轻量级的进程。
- 一个进程可以有多个线程,多个线程也可以并发执行
7.线程同步的方式有哪些?
线程同步的方式:
- 临界区:通过对多线程的串行化来访问公共资源或者一段代码,速度快,适合控制数据访问
- 互斥量:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以可以保证公共资源不会同时被多个线程访问
- 信号量:它允许多个线程同一时刻访问同一资源,但是需要限制同一时刻访问此资源的最大线程数目。信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中PV操作相似。
- 事件(信号):通过通知操作的方式来保持多线程的同步,还可以方便的实现多线程的优先级比较的操作
三.处理机调度与死锁
8.用户态和核心态
当程序运行在3级特权级上时,就可以称之为运行在用户态,因为这是最低特权级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态;
反之,当程序运行在级特权级上时,就可以称之为运行在内核态。
用户态切换到内核态的3种方式:系统调用,异常,外围设备的中断
9.处理机调度的层次
高级调度(长程调度或作业调度):调度对象是作业,主要用于多道批处理系统中,而在分时和实时系统中不设置高级调度
低级调度(进程调度或短程调度):调度对象是进程,在多道批处理,分时和实时三种类型的OS中,都必须配置这级调度
中级调度:内存调度,引入中级调度的主要目的是,提高内存利用率和系统吞吐量,中级调度实际上就是存储器管理中的对换功能
10.死锁
死锁的定义:所谓死锁就是一个进程集合中的多个进程因为竞争资源,而造成的互相等待现象。
死锁的原因:系统资源不足;多个进程的推进顺序不合理
死锁的必要条件:
- 互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。
- 请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。
- 不可抢占条件(No pre-emption):进程对于已经申请到的资源在使用完成之前不可以被抢占
- 环路等待条件:发生死锁的时候存在的一个 进程-资源 环形等待链
死锁处理:
-
预防死锁:破坏产生死锁的4个必要条件中的一个或者多个;实现起来比较简单,但是如果限制过于严格会降低系统资源利用率以及吞吐量
-
避免死锁:在资源的动态分配中,防止系统进入不安全状态(可能产生死锁的状态)-如银行家算法
-
检测死锁:允许系统运行过程中产生死锁,在死锁发生之后,采用一定的算法进行检测,并确定与死锁相关的资源和进程,采取相关方法清除检测到的死锁。实现难度大
-
解除死锁:与死锁检测配合,将系统从死锁中解脱出来(撤销进程或者剥夺资源)。对检测到的和死锁相关的进程以及资源,通过撤销或者挂起的方式,释放一些资源并将其分配给处于阻塞状态的进程,使其转变为就绪态。实现难度大
11.进程调度算法 操作系统中进程调度策略有哪几种?
FCFS(先来先服务),优先级,时间片轮转,多级反馈
先来先服务调度算法FCFS:既可以作为作业调度算法也可以作为进程调度算法;按作业或者进程到达的先后顺序依次调度;因此对于长作业比较有利;
短作业优先调度算法SJF:作业调度算法,算法从就绪队列中选择估计时间最短的作业进行处理,直到得出结果或者无法继续执行;缺点:不利于长作业;未考虑作业的重要性;运行时间是预估的,并不靠谱 ;
优先级调度算法PSA:基于作业的紧迫程度,由外部赋予作业相应的优先级,调度算法是根据该优先级进行调度的
高相应比优先调度算法HRNN:响应比=(等待时间+要求服务时间)/要求服务时间=响应时间/要求服务时间
时间片轮转调度RR:按到达的先后对进程放入队列中,然后给队首进程分配CPU时间片,时间片用完之后计时器发出中断,暂停当前进程并将其放到队列尾部,循环 ;
多级反馈队列调度算法:目前公认较好的调度算法;设置多个就绪队列并为每个队列设置不同的优先级,第一个队列优先级最高,其余依次递减。优先级越高的队列分配的时间片越短,进程到达之后按FCFS放入第一个队列,如果调度执行后没有完成,那么放到第二个队列尾部等待调度,如果第二次调度仍然没有完成,放入第三队列尾部…。只有当前一个队列为空的时候才会去调度下一个队列的进程。
四.存储器管理
12.内存连续分配
连续分配方式:单一连续分配:单道程序环境下
固定分区分配:多道程序系统,每个分区的大小是固定的
动态分区分配
动态可重定位分区分配 算法四种方式
主要是指动态分区分配时所采用的几种算法。
动态分区分配又称为可变分区分配,它是动态划分内存的分区方法。这种分区方法不预先将内存划分,而是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。因此系统中分区的大小和数目是可变的。
首次适应(First Fit)算法:空闲分区以地址递增的次序链接。分配内存时顺序查找,找到大小能满足要求的第一个空闲分区。
最佳适应(Best Fit)算法:空闲分区按容量递增形成分区链,找到第一个能满足要求的空闲分区。
最坏适应(Worst Fit)算法:又称最大适应(Largest Fit)算法,空闲分区以容量递减的次序链接。找到第一个能满足要求的空闲分区,也就是挑选出最大的分区。
基于索引搜索的动态分区分配算法
快速适应(quick fit)算法:又称为分类搜索法,是将空闲分区根据其容量大小进行分类,对于每一类具有相同容量的所有空闲分区,单独设立一个空闲分区链表
这样系统中存在多个空闲分区链表
伙伴系统(buddy system)
哈希算法:构造一张以空闲分区大小为关键字的哈希表,该表的每一个表项记录了一个对应的空闲分区链表表头指针
13.基本分页存储管理方式
离散分配方式:将一个进程直接分散地装入到许多不相邻接的分区中,便可充分利用内存空间
离散分配分为三种:分页存储管理方式、分段存储管理方式、段页式存储管理方式
分页存储管理方式:将用户程序的地址空间分为若干个固定大小的区域,称为”页“或”页面“。相应的,也将内存空间分为若干个物理块或页框(frame),页和块的大小相同。这样就可以将用户程序的任一页放入任一物 理块中,实现了离散分配。
把主存空间划分为大小相等且固定的块,块相对较小,作为主存的基本单位。每个进程也以块为单位进行划分,进程在执行时,以块为单位逐个申请主存中的块空间。
因为程序数据存储在不同的页面中,而页面又离散的分布在内存中,因此需要一个页表来记录逻辑地址和实际存储地址之间的映射关系,以实现从页号到物理块号的映射。
由于页表也是存储在内存中的,因此和不适用分页管理的存储方式相比,访问分页系统中内存数据需要两次的内存访问(一次是从内存中访问页表,从中找到指定的物理块号,加上页内偏移得到实际物理地址;第二次就是根据第一次得到的物理地址访问内存取出数据)。
为了减少两次访问内存导致的效率影响,分页管理中引入了快表机制,包含快表机制的内存管理中,当要访问内存数据的时候,首先将页号在快表中查询,如果查找到说明要访问的页表项在快表中,那么直接从快表中读取相应的物理块号;如果没有找到,那么访问内存中的页表,从页表中得到物理地址,同时将页表中的该映射表项添加到快表中(可能存在快表换出算法)。
在某些计算机中如果内存的逻辑地址很大,将会导致程序的页表项会很多,而页表在内存中是连续存放的,所以相应的就需要较大的连续内存空间。为了解决这个问题,可以采用两级页表或者多级页表的方法,其中外层页表一次性调入内存且连续存放,内层页表离散存放。相应的访问内存页表的时候需要一次地址变换,访问逻辑地址对应的物理地址的时候也需要一次地址变换,而且一共需要访问内存3次才可以读取一次数据。
14.基本分段存储管理方式
分页是为了提高内存利用率,而分段是为了满足程序员在编写代码的时候的一些逻辑需求(比如数据共享,数据保护,动态链接等)。
分段内存管理当中,地址是二维的,一维是段号,一维是段内地址;其中每个段的长度是不一样的,而且每个段内部都是从0开始编址的。由于分段管理中,每个段内部是连续内存分配,但是段和段之间是离散分配的,因此也存在一个逻辑地址到物理地址的映射关系,相应的就是段表机制。段表中的每一个表项记录了该段在内存中的起始地址和该段的长度。段表可以放在内存中也可以放在寄存器中。
访问内存的时候根据段号和段表项的长度计算当前访问段在段表中的位置,然后访问段表,得到该段的物理地址,根据该物理地址以及段内偏移量就可以得到需要访问的内存。由于也是两次内存访问,所以分段管理中同样引入了联想寄存器。
分段分页方式的比较
页是信息的物理单位,是出于系统内存利用率的角度提出的离散分配机制;段是信息的逻辑单位,每个段含有一组意义完整的信息,是出于用户角度提出的内存管理机制
页的大小是固定的,由系统决定;段的大小是不确定的,由用户决定
五.虚拟存储器
15.虚拟内存
如果存在一个程序,所需内存空间超过了计算机可以提供的实际内存,那么由于该程序无法装入内存所以也就无法运行。单纯的增加物理内存只能解决一部分问题,但是仍然会出现无法装入单个或者无法同时装入多个程序的问题。但是可以从逻辑的角度扩充内存容量,即可解决上述两种问题。
基于局部性原理,在程序装入时,可以将程序的一部分装入内存,而将其余部分留在外存,就可以启动程序执行。在程序执行过程中,当所访问的信息不在内存时,由操作系统将所需要的部分调入内存,然后继续执行程序。另一方面,操作系统将内存中暂时不使用的内容换出到外存上,从而腾出空间存放将要调入内存的信息。这样,系统好像为用户提供了一个比实际内存大得多的存储器,称为虚拟存储器。
虚拟存储器的特征:
- 多次性:一个作业可以分多次被调入内存。多次性是虚拟存储特有的属性
- 对换性:作业运行过程中存在换进换出的过程(换出暂时不用的数据换入需要的数据)
- 虚拟性:虚拟性体现在其从逻辑上扩充了内存的容量(可以运行实际内存需求比物理内存大的应用程序)。虚拟性是虚拟存储器的最重要特征也是其最终目标。虚拟性建立在多次性和对换性的基础上行,多次性和对换性又建立在离散分配的基础上
虚拟存储器的实现方法:分页请求系统,请求分段系统
16.页面置换算法(服务于分页请求系统)
最佳(Optimal)置换算法:只具有理论意义的算法,用来评价其他页面置换算法。置换策略是将当前页面中在未来最长时间内不会被访问的页置换出去。
先进先出(FIFO)置换算法:简单粗暴的一种置换算法,没有考虑页面访问频率信息。每次淘汰最早调入的页面。
最近最久未使用LRU(Least Recently Used)置换算法:算法赋予每个页面一个访问字段,用来记录上次页面被访问到现在所经历的时间t,每次置换的时候把t值最大的页面置换出去(实现方面可以采用寄存器或者栈的方式实现)。
最少使用LFU(Least Frequently Used)置换算法:设置寄存器记录页面被访问次数,每次置换的时候置换当前访问次数最少的。
改进型Clock算法:在Clock算法的基础上添加一个修改位,替换时根究访问位和修改位综合判断。优先替换访问位和修改位都是0的页面,其次是访问位为0修改位为1的页面。
页面缓冲算法(Page Buffering Algorithm,PBA)