本文是我2021年考研时准备的复试面试题,现在拿出来给大家分享一下
觉得好的点个赞哦,毕竟当初我也是整理了好久,改了好几次版本呢
祝大家都上岸!!!!
进程是对运行时程序的封装,是系统资源调度和分配的的基本单位
线程是进程的子任务,是CPU调度和分派的基本单位
(1)一个线程只能属于一个进程,而一个进程可以有多个线程。
(2)进程在执行过程中拥有独立的内存单元,多个线程共享进程的内存。所以线程的同步和通信较为容易,而进程通信相对复杂。
(3)创建、撤销和切换进程时,系统开销将大于线程的系统开销。
(4)进程编程调试简单可靠,线程编程调试相对复杂。
(1)手工操作阶段(此阶段无操作系统):用户在计算机上的所有工作都需要人工干预。
缺点:用户独占全机,CPU利用不充分。
(2)单道批处理系统:
优点:缓解人机速度矛盾
缺点:内存仅能有一道程序运行。
(3)多道批处理系统(操作系统诞生):
优点:多道程序并发执行,共享计算机资源。
缺点:没有人机交互功能
(4)分时操作系统:
优点:计算机以时间片为单位为各用户/作业服务,解决了人机交互问题。
缺点:不能优先处理一些紧急任务。
(5)实时操作系统:分为硬实时系统和软实时系统,硬实时系统要求指定动作必须在规定时间内完成,如导弹飞行控制系统
软实时能够接受动作偶尔违反时间规定,如飞机订票系统
优点:响应速度快,能够优先处理紧急任务。
(6)网络操作系统
把计算机网络中的各台计算机结合起来,实现计算机之间的数据互相传送。
(7)分布式操作系统
与网络操作系统不同的是:若干计算机相互协同合作完成同一任务
并发是指宏观上看起来两个程序在同时运行(例如单核CPU上的多任务),但是从微观上看两个程序的指令是交叉执行的。
并行指严格物理意义上的同时运行(例如多核CPU上的任务),如两个程序分别运行在两个CPU上,相互不影响。
程序是永久的,进程是暂时的。
程序是静态的,进程是动态的。
程序是有序代码的集合,进程是程序的执行。
进程由:程序+数据+进程控制块(PCB)组成。
进程具有并发性,而程序没有。
进程是系统进行资源调度和分配的基本单位。
运行状态:进程正在使用CPU。
就绪状态:进程具备运行的条件,但是尚未占用CPU。
阻塞状态:进程由于等待某一状态,不能占用CPU。
创建状态:进程正在被创建,还未到就绪状态。
终止状态:进程正在从系统消失。
(1)先来先服务FCFS:
规则:按照作业/进程到达的先后顺序进行服务
优点:公平,算法容易实现,有利于长作业。
缺点:对短作业不利
非抢占式,不会饥饿
(2)短作业优先SJF:
规则:当前已到达的最短的作业/进程最先得到服务
优点:最少的平均等待时间、平均周转时间
缺点:不公平,对短作业有利,对长作业不利
非抢占式+抢占式,会饥饿
(3)高响应比优先HRRN:
规则:调度前,会计算各个作业/进程的响应比,响应比高的先服务。
优点:综合考虑了等待时间和要求服务时间。
缺点:需要提前计算优先权,增加了系统开销。
非抢占式,不会饥饿
(4)时间片轮转调度算法RR:
规则:按照各个进程到达就绪队列的顺序,轮流让各个进程执行一个时间片。
优点:公平、响应快,适用分时操作系统
缺点:由于高频率的进程切换,会有一定的开销。
抢占式,不会饥饿
时间片设置太大会退化成先来先服务调度算法,太小会导致进程切换频繁,系统开销大。
(5)优先级调度算法:
规则:每个作业/进程有各自的优先级,调度时选择优先级最高的。
优点:用优先级区分任务的紧急程度,适用于实时操作系统。
缺点:如果有源源不断的高优先级进程到来,那么低优先级的进程可能会饥饿。
非抢占式+抢占式,会饥饿
- 多级反馈队列调度算法:
设置多个队列,第1级队列优先级最高,其余队列优先级依次降低。优先级越高的队列中,时间片越小。前 n-1级队列采用FCFS,最后一级队列采用时间片轮转调度。
7、死锁
死锁是指两个或多个并发进程中,因争夺资源而造成的相互等待,导致各进程都阻塞的现象。
产生死锁的根本原因:资源有限且操作不当。
死锁产生的四个必要条件:
(1)互斥条件:一个资源每次只能给一个进程使用。
(2)不可剥夺条件:资源申请者不能强行的从资源占有者手中夺取资源,资源只能由占有者自愿释放。
(3)请求和保持条件:在申请新的资源的同时保持对原有资源的占有。
(4)循环等待条件:存在进程资源的循环等待链。
死锁的处理策略:
(1)死锁预防
一次预先分配所有资源
资源按序分配
(2)死锁避免
银行家算法
(3)死锁检测
定期检查死锁是否已经发生
- 死锁预防:破坏产生死锁的4个必要条件之一
资源分配策略:保守,宁可资源闲置
处理方法:一次请求所有资源or资源剥夺or资源按序分配
优点:必然不会发生死锁
缺点:效率低,进程初始化时间延长
- 死锁避免:银行家算法
处理方法:寻找可能的安全执行序列
优点:不必进行剥夺
缺点:必须知道进程将来的资源需求
- 死锁检测:资源分配图
资源分配策略:宽松,只要当前资源能够满足进程需要就进行分配
优点:不延长进程初始化时间,允许发生死锁时对现场进行处理
缺点:将通过剥夺解除死锁,这会造成一定损失
(1)编译:将经过预处理后的预编译文件转换成若干目标模块。
(2)链接:由链接程序将编译后形成的一组目标模块及所需的库函数链接在一起,形成一个完整的装入模块。
(3)装入:由装入程序将装入模块装入内存。
(1)静态链接:在程序运行之前,先将各目标模块及它们所需的库函数链接在一起,以后不再拆开
(2)装入时动态链接:将装入模块装入内存时采用边装入边链接的方式
(3)运行时动态链接:在程序执行中需要该目标模块时才进行链接,其优点是便于修改和更新,便于实现对目标模块的共享
(1)绝对装入:在编译时确定地址
(2)静态重定位:在装入时确定地址
(3)动态重定位:在执行时确定地址
覆盖:由于程序运行时并非任何时候都要访问程序的各个部分,因此可以把用户空间分成一个固定区和若干覆盖区。将经常活跃的部分放在固定区,其余部分按照调用关系分段,将那些即将要访问的段放入覆盖区,其他段放在外存中。在需要调用前,系统再将其调入覆盖区,替换覆盖区中原有的段。
交换:把处于等待状态的程序从内存移入辅存,把准备好竞争CPU的程序从辅存移到内存。
区别:
(1)覆盖技术用于同一个进程中,交换技术用于不同进程之间。
(2)覆盖需要由程序员声明覆盖结构
(3)现代操作系统是通过虚拟内存技术解决的,覆盖技术已经成为历史。交换技术仍具有较强的生命力
(1)单一连续分配:只能用于单用户、单任务的操作系统中
(2)固定分区分配
(3)动态分区分配
动态分区策略:首次适应、最佳适应、最坏适应、邻近适应
(1)最佳置换算法OPT
(2)先进先出置换算法FIFO
(3)最近最久未使用置换算法LRU
(4)时钟置换算法CLOCK
在单核机器上写多线程程序,仍然需要线程锁,因为线程锁通常用来实现线程的同步和通信。因为在抢占式操作系统中,通常为每个线程分配一个时间片,当某个线程时间片耗尽时,操作系统会将其挂起,然后运行另一个线程。如果这两个线程共享某些数据,不使用线程锁的前提下,可能会导致共享数据修改引起冲突。
进程间:
(1)管道:数据一旦被读取,它就会从管道中被抛弃,所以一个管道只能有一个读进程,但可以有多个写进程。管道只能采取半双工,如果要实现父子进程双方互相通信,需要设置两个管道。
(2)消息队列:将消息的链表存放在内核中
(3)信号量
(4)信号:信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
(5)共享内存(最快):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。
(6)套接字:socket也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同主机之间的进程通信。
线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。
线程间:
(1)锁机制:包括互斥锁、条件变量、读写锁
互斥锁提供了以排他方式防止数据结构被并发修改的方法。
读写锁允许多个线程同时读共享数据,而对写操作是互斥的。
条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。
(2)信号量机制
(3)信号机制
执行HLT停机指令,该指令可以使处理器处于暂时停机状态,可以节省大量的电能与资源。
游戏服务器应该为每个用户开辟一个进程。因为同一进程间的线程会相互影响,一个线程死掉会影响其他线程,从而导致进程崩溃。因此为了保证不同用户之间不会相互影响,应该为每个用户开辟一个进程。
多线程模型主要优势是切换代价较小,因此适用于I/O密集型的工作场景。
多进程模型适用于CPU密集型,比起多线程的一个好处是具有更强的容错性,一个进程崩溃了不会影响其他进程。
大内核是将操作系统功能作为一个紧密结合的整体放到内核,由于各模块共享信息,因此有很高的性能。但大内核由于代码庞大冗余,难以维护。
微内核分离了内核与服务、服务与服务,使得他们之间的接口更加清晰,维护的代价大大降低、各部分可以独立地优化和演进,保证系统的可靠性。
操作系统是指控制和管理整个计算机系统硬件和软件资源的最基本的系统软件。
并发性:指两个或多个事件在同一时间间隔内发生;
共享性:系统中的资源可供内存中多个并发执行的进程共同使用;
虚拟性:把一个物理上的实体变成若干个逻辑上的对应物;
异步性:进程的执行并不是一气呵成的,而是以不可预知的速度向前推进.
多次性:作业无须一次调入,允许分多次调入内存;
对换性:作业在运行过程中无须常驻内存,可以根据需要进行换入换出;
虚拟性:从逻辑上扩充内存容量。
文件目录,又称文件控制块,存储的是文件的管理信息,控制对象是单个文件;
目录文件,存储的是若干个文件目录,控制对象是整个文件系统;
目前广泛采用的树形目录结构,优点是:允许文件重命名,实现了文件分类。
(1)页是信息的物理单位,分页的目的是满足系统管理的需要。段是信息的逻辑单位,分段的目的是为了更好地实现地址共享,满足用户的需要。
(2)页的大小固定,将逻辑地址划分为页号和页内地址是由机器硬件实现的。而段的长度不固定,决定于用户所编写的程序。
(3)分页的地址空间是一维的,分段的地址空间是二维的。
在分时系统中不剥夺并不是一个好的策略。因为在分时系统中,除了交互性以外,及时性是很重要的性能因素。当一个作业被阻塞后,若不进行剥夺,CPU则处于空闲状态,别的用户的及时性就无法得到保障。
管程是由一组局部变量、对局部变量进行操作的一组过程和对局部变量进行初始化的语句序列组成。
引入的原因是因为PV操作太过分散,对它的维护很麻烦且容易造成死锁。
管程的特点是:
(1)管程的过程只能访问管程的局部变量,管程的局部变量只能由其过程来访问;
(2)任何时刻只能有一个进程进入管程执行;
(3)进程只能通过管程提供的过程入口进入管程。
采用可变分区方式管理时,一般均采用动态重定位方式装入作业。地址变换要靠硬件支持,主要是两个寄存器:基址寄存器和限长寄存器,这两个值确定了一个分区的位置和大小;
限长寄存器存放作业所占分区的长度;
基址寄存器则存放作业所占分区的起始地址;
地址转换时:根据逻辑地址与限长值比较,如果不有超过这个值,表示访问地址合法,再加上基址寄存器中的值就得到了绝对地址了,否则形成“地址越界”中断。
可以,父进程创建子进程后,子进程也成为了一个可以独立运行的单位,虽然子进程继承了父进程的全部资源,但是只要两个进程创建的程序和数据没有冲突,则它们可以并发运行。
缓冲是一种以空间换时间的资源换取技术。一般利用内存作为缓冲区。
为什么引入:
(1)可以协调CPU与I/O设备之间速度不匹配的矛盾;
(2)可以减少对CPU的中断频率;
(3)提高设备的利用率。