操作系统面试汇总
0.1 什么是操作系统?
用户与计算机硬件之间的接口
控制和管理计算机资源的软件
0.2 计算机由什么硬件组成?
CPU
存储器
输入/输出设备
总线等
1.1 什么是进程?什么是线程?
注:
资源是指处理器CPU时间、存储器、文件、IO设备这四个
单进程,单线程:MS_DOS, 多进程,单线程:Unix, 单进程,多线程:JVM,多进程,多线程:Linux, Windows,Android,IOS.
1.2 进程和线程的区别?相比进程,线程有哪些好处?
一个进程可以有多个线程,多个线程可以并发,可以共享进程数据,拥有自己独立的栈空间和执行序列。进程与线程是不同的系统资源管理方式。进程拥有独立的地址空间,而线程没有。一个进程崩溃后,在保护模式下,不会对其他进程造成影响;而线程只是进程的一个执行路径,没有自己独立的地址空间,一旦一个线程崩溃,整个进程就会崩溃。所以,多进程的程序比多线程程序更加健壮。线程不占用系统资源,调度线程比调度进程开销更小,在线程间切换比在进程间切换效率高。对于一些要求同时进行而又共享某些变量的并发操作来说,只能用多线程,不能用多进程。使用线程有哪些好处?
创建线程比创建进程需要的时间更少终止线程比终止进程时间更少切换线程比切换进程更快线程间通信无需调用内核即可实现。同一进程的线程共享进程的数据。
(一)请分别简单说一说进程和线程以及它们的区别。
进程是具有一定功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源调度和分配的一个独立单位。
线程是进程的实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
一个进程可以有多个线程,多个线程也可以并发执行
1.4 线程同步方式有哪些?进程同步的方式有哪些?
什么是线程同步?
线程同步是指多线程通过特定的方式(如互斥量)来控制线程之间的执行顺序(同步),也可以说是在线程之间通过同步建立起执行顺序的关系,如果没有同步那线程之间是各自运行各自的。
线程同步方式有哪些?
互斥(信号)量,每个时刻只有一个线程可以访问公共资源。只有拥有互斥对象的线程才能访问公共资源,互斥对象只有一个,一个时刻只能有一个线程持有,所以保证了公共资源不会被多个线程同时访问。
信号量,允许多个线程同时访问公共资源。当时控制了访问资源的线程的最大个数。
事件 in windows(条件变量 in linux),通过通知的方式保持多线程的同步,还可以方便的实现多线程优先级的比较
临界区,任意时刻只能有一个线程进入临界区,访问临界资源。
进程同步的方式有哪些?
原子操作
信号量
管程
会合
分布式系统
(二)线程同步的方式有哪些?
互斥量:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。
信号量:它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。
事件(信号):通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作。经两位大大的指正,现已删除临界区。
(三)进程的通信方式有哪些?
windows和linux共有的进程间通信方式:
1. 消息(linux中叫做信号)
2. 共享内存
3. 邮槽
4. 管道
5. socket
主要分为:管道、系统IPC(包括消息队列、信号量、共享存储)、SOCKET
管道主要分为:普通管道PIPE 、流管道(s_pipe)、命名管道(name_pipe)
管道是一种半双工的通信方式,数据只能单项流动,并且只能在具有亲缘关系的进程间流动,进程的亲缘关系通常是父子进程
命名管道也是半双工的通信方式,它允许无亲缘关系的进程间进行通信
信号量是一个计数器,用来控制多个进程对资源的访问,它通常作为一种锁机制。
消息队列是消息的链表,存放在内核中并由消息队列标识符标识。
信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
共享内存就是映射一段能被其它进程访问的内存,这段共享内存由一个进程创建,但是多个进程可以访问。
套接字( socket ) : 套解字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
1.5 临界区?
什么是临界区?
每个进程(线程)中,访问临界资源(不可共享的资源)的那段代码称为临界区。每次只允许一个进程(线程)进入临界区,进入后不允许其他进程(线程)进入。
如何解决临界区冲突?
一次只允许一个进程(线程)进入临界区,如果有一个进程(线程)已经进入了自己的临界区,其他试图进入临界区的进程(线程)必须等待
进入临界区的进程(线程)要在有限的时间内退出临界区,以便于其他进程(线程)进入自己的临界区
如果进程(线程)无法进入自己的临界区,则应该让出CPU等资源,避免进程(线程)出现“忙等”现象。
实现临界区的方法有哪些?
软件实现
中断屏蔽(关中断,开中断)
硬件指令方法
1.6 进程有几种状态?状态之间的转换是怎么样的?
就绪状态:进程已获得除处理机以外的所需资源,等待分配处理机资源
运行状态:占用CPU资源运行,处于此状态的进程数小于等于CPU数
阻塞状态: 进程等待某种条件,在条件满足之前无法执行
(1)进程的五状态模型:
运行态:该进程正在执行。
就绪态:进程已经做好了准备,只要有机会就开始执行。
阻塞态(等待态):进程在某些事情发生前不能执行,等待阻塞进程的事件完成。
新建态:刚刚创建的进程,操作系统还没有把它加入到可执行进程组中,通常是进程控制块已经创建但是还没有加载到内存中的进程。
退出态:操作系统从可执行进程组中释放出的进程,或由于自身或某种原因停止运行。
1.7 进程创建的过程?
给新进程分配一个唯一的标识符
给进程分配内存空间
初始化进程控制块PCB
将PCB放入就绪队列中,等待分配CPU资源
1.8 什么是进程控制块PCB?PCB保存了哪些信息?
是进程存在的唯一标识
创建一个进程就会创建一个PCB,当进程撤销时,系统回收它的PCB
系统对进程的控制根据PCB进行,对进程的管理通过管理PCB实现
能实现间断性的运行方式
提供进程间通信管理所需的资源
提供进程调度所需的信息
PCB中保存了
进程的标识信息
进程的状态信息(就绪、运行、阻塞)
进程的控制信息
1.9 进程和程序的区别?
程序是计算机指令的集合,以文件的形式存放在磁盘上,是静态的文本。不使用系统资源,不能申请资源,不能被调度,不能作为运行的单位。
进程是程序的运行实体,包含了程序段、数据段、PCB(进程控制块),是程序在其地址空间中的执行活动,是系统分配资源的基本单位。使用系统资源,可以运行。
1.10 进程(线程)调度的几种算法?
FCFS(先来先服务),优先级,时间片轮转,多级反馈
时间片轮转调度算法(RR):给每个进程固定的执行时间,根据进程到达的先后顺序让进程在单位时间片内执行,执行完成后便调度下一个进程执行,时间片轮转调度不考虑进程等待时间和执行时间,属于抢占式调度。优点是兼顾长短作业;缺点是平均等待时间较长,上下文切换较费时。适用于分时系统。
先来先服务调度算法(FCFS):根据进程到达的先后顺序执行进程,不考虑等待时间和执行时间,会产生饥饿现象。属于非抢占式调度,优点是公平,实现简单;缺点是不利于短作业。
优先级调度算法(HPF):在进程等待队列中选择优先级最高的来执行。
多级反馈队列调度算法:将时间片轮转与优先级调度相结合,把进程按优先级分成不同的队列,先按优先级调度,优先级相同的,按时间片轮转。优点是兼顾长短作业,有较好的响应时间,可行性强,适用于各种作业环境。
高响应比优先调度算法:根据“响应比=(进程执行时间+进程等待时间)/ 进程执行时间”这个公式得到的响应比来进行调度。高响应比优先算法在等待时间相同的情况下,作业执行的时间越短,响应比越高,满足段任务优先,同时响应比会随着等待时间增加而变大,优先级会提高,能够避免饥饿现象。优点是兼顾长短作业,缺点是计算响应比开销大,适用于批处理系统。
1.12 进程调度和线程调度的关系?
进程和线程都有三种状态(就绪、运行、阻塞)
如果一个线程进行了系统调用,则整个进程阻塞(系统调用会使进程阻塞,而线程还是处于运行态,不会阻塞),控制权从程序转移走,但在线程角度看,此线程还在运行态。而进程已经到了阻塞态。
当线程A等待线程B的某些事件时,A被阻塞,控制权从A移到B。
1.13 线程实现的两种方式?各有什么优缺点?
用户级线程(Linux)
内核级线程(Windows)
(四)什么是缓冲区溢出?有什么危害?其原因是什么?
缓冲区溢出是指当计算机向缓冲区填充数据时超出了缓冲区本身的容量,溢出的数据覆盖在合法数据上。 危害有以下两点:
程序崩溃,导致拒绝额服务
跳转并且执行一段恶意代码
造成缓冲区溢出的主要原因是程序中没有仔细检查用户输入。
(五)什么是死锁?死锁产生的条件?
在两个或者多个并发进程中,如果每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗的讲就是两个或多个进程无限期的阻塞、相互等待的一种状态。
死锁产生的四个条件(有一个条件不成立,则不会产生死锁)
互斥条件:一个资源一次只能被一个进程使用
请求与保持条件:一个进程因请求资源而阻塞时,对已获得资源保持不放
不剥夺条件:进程获得的资源,在未完全使用完之前,不能强行剥夺
循环等待条件:若干进程之间形成一种头尾相接的环形等待资源关系
(十)说一说死锁的处理基本策略和常用方法。
解决死锁的基本方法如下:
预防死锁、避免死锁、检测死锁、解除死锁
1.预防死锁。破坏后三个条件中的一个即可(互斥是非共享设备的特性,无法更改):
破坏请求与保持条件。规定一个进程开始前,必须申请所有需要的资源。
破坏非剥夺条件。当无法得到需要的资源时,释放自己持有的资源,等需要时再重新申请。
破坏循环等待条件。将所有资源按类型线性排队,并赋予不同的编号,所有进程请求资源时,必须按照资源递增顺序,以防出现环路。如果一个进程已经分配到了R资源,那么它再申请时,只能申请排在R后面的资源,而不能申请前面的资源。
2. 死锁避免。避免死锁并不是事先采取某种限制措施破坏死锁的必要条件,而是再资源动态分配过程中,防止系统进入不安全状态,以避免发生死锁:
银行家算法
系统安全状态
安全性算法
3. 死锁的检测与解除
资源分配图
死锁定理
死锁解除
解决四多的常用策略如下:
鸵鸟策略、预防策略、避免策略、检测与解除死锁
1.17 互斥锁
互斥锁就是用互斥量(被初始化为1的信号量)来封锁,PV操作在一个线程内成对出现。互斥是为了让一次只有一个线程可以访问公共资源。互斥锁是一种很简单的线程同步方法。
1.18 同步信号量和互斥信号量
同步信号量和互斥信号量都是信号量,操作都是PV操作。
同步信号量初始化为非负数,而互斥信号量总是初始化为1.
同步信号量实现了线程间的同步,互斥信号量实现了对公共资源的互斥访问
1.19 互斥量和临界区的区别
两者都可以实现对互斥资源的互斥访问
临界区只能用于对象在同一进程里线程间的互斥访问;互斥体可以用于对象进程间或线程间的互斥访问。
临界区是非内核对象,只在用户态进行锁操作,速度快;互斥体是内核对象,在核心态进行锁操作,速度慢。
临界区和互斥体在Windows平台都下可用;Linux下只有互斥体可用。
2.1 什么是物理内存?什么是虚拟内存?区别与联系?
虚拟内存存在的意义?
既然每个进程的内存空间都是一致而且固定的,所以链接器在链接可执行文件时,可以设定内存地址,而不用去管这些数据最终实际的内存地址,这是有独立内存空间的好处
当不同的进程使用同样的代码时,比如库文件中的代码,物理内存中可以只存储一份这样的代码,不同的进程只需要把自己的虚拟内存映射过去就可以了,节省内存
在程序需要分配连续的内存空间的时候,只需要在虚拟内存空间分配连续空间,而不需要实际物理内存的连续空间,可以利用碎片。
2.2 内存分区的四种方法?
固定分区。产生内零头(内部碎片)
动态分区。产生外零头(外部碎片)
分页
分段
2.3 动态分区的三个适配算法?
最佳适配。选择与需求大小最接近的块
首次适配。从第一个开始,选择第一个满足大小的空闲块。
下次适配。从上次放置的位置开始,选择第一个满足大小的空闲块。
2.4 伙伴系统
是一种堆结构。
(七)分页和分段有什么区别?
段是信息的逻辑单位,它是根据用户的需要划分的,因此段对用户是可见的 ;页是信息的物理单位,是为了管理主存的方便而划分的,对用户是透明的。
段的大小不固定,有它所完成的功能决定;页大大小固定,由系统决定
段向用户提供二维地址空间;页向用户提供的是一维地址空间
段是信息的逻辑单位,便于存储保护和信息的共享,页的保护和共享受到限制。
2.6 malloc实现原理
可以基于伙伴系统实现,也可以使用基于链表的实现
将所有空闲内存块连成链表,每个节点记录空闲内存块的地址、大小等信息
分配内存时,找到大小合适的块,切成两份,一分给用户,一份放回空闲链表
free时,直接把内存块返回链表
解决外部碎片:将能够合并的内存块进行合并
2.7 使用mmap读写文件为什么比普通读写函数要快?
mmap函数:可以将文件映射到内存中的一段区域,普通函数读写文件:用户空间buffer内核空间buffer磁盘;mmap映射之后:用户空间buffer进程内存空间,省掉了拷贝到内核空间的时间?
3.1 I/O子系统的四个层次
分别是:用户级I/O软件、设备无关软件、设备驱动程序、中断处理程序。
3.2 磁盘IO
磁盘设备的I/O控制主要是采取 DMA方式。