笔者在2023年参加了部分985和华五计算机夏令营和预推免面试,下面是笔者对于操作系统知识点一些总结,对于期末复习、保研和考研均适用,对找工作的同学也有一定参考作用,欢迎大家关注点赞、收藏、评论,如需要其他学科的问题请关注我~(部分其他学科的知识点总结已在主页公布)
相关文章:
计算机保研/考研面试题——编程语言篇(C和C++)-CSDN博客
1. 操作系统的特点和功能是什么?★★★★
特点:
并发、共享、虚拟、异步。其中,并发和共享是操作系统主要的特点。
功能:
(1)进程管理:操作系统负责管理和调度各个进程(程序的执行实例),包括进程的创建、终止、调度、同步和通信等,以确保它们能够按照一定的顺序和优先级运行。
(2)内存管理:操作系统负责管理计算机的内存资源,包括内存的分配、回收和地址转换等,以确保不同程序和数据可以正确地加载到内存中,并且彼此之间不会互相干扰。
(3)文件系统管理:操作系统提供了对计算机存储设备上文件的组织和访问方式,包括文件的创建、读写、删除、权限控制等,使用户能够方便地管理和利用存储空间。
(4)设备驱动和输入输出管理:操作系统提供了对计算机输入输出设备的管理和控制,包括设备驱动程序的加载、设备的初始化、读写数据等,使用户能够通过输入输出设备与计算机进行交互。
(5)提供用户界面:操作系统为用户提供了与计算机系统交互的接口,例如命令行界面或图形用户界面(GUI),使用户能够通过输入指令或点击图标来操作计算机。
2. 请你解释一下什么是并发和并行。★★
并发是指多个任务在相同时间段内交替执行的能力。当系统中有多个任务同时存在时,它们可以通过时间片轮转、线程切换等方式交替执行,给用户一种同时执行的感觉。在并发模型中,各个任务之间可能会进行频繁的切换,以达到多任务的同时进行。
并行是指多个任务在同一时刻同时执行的能力。在具备多个处理器或多个核心的系统中,不同的任务可以同时执行,每个任务在独立的处理器上执行,互不干扰。并行计算能够加速任务的执行速度,提高整体的计算能力。
3. 中断与系统调用的区别是什么?★★
中断是CPU对例如I/O设备发送的中断信号的响应,此时CPU应该检测当前是否有正在处理的程序,如果有,则需要保存CPU上下文环境,从用户态切换至内核态对中断请求进行处理,完成处理后再返回原处理程序的断点位置继续执行。
中断通常分为硬中断和软中断两种。硬中断是指从硬件发出的中断信号,例如I/O请求。而软中断是指由指令执行过程中发出的中断。
系统调用就是一种软中断,它是指通过应用程序通过操作系统间接地调用I/O过程。由于应用程序只能执行于用户态,而I/O操作需要进入内核态,因此通过中断请求,操作系统进行用户态向内核态的转换完成I/O操作。
4. 进程和线程的概念和区别是什么?★★★★★★
(1)概念:
进程:进程是计算机中正在运行的程序的实例。每个进程都有自己独立的地址空间,包括代码、数据和堆栈等。进程之间是独立的,彼此不会直接共享内存,通信需要通过特定的机制来实现。
线程:线程是进程中的一个执行单元。进程可以包含多个线程,这些线程共享相同的地址空间,即它们可以直接访问相同的内存区域和资源。线程之间可以通过共享变量来进行通信和同步。
(2)区别:
① 资源分配与调度
引入线程前:进程是资源分配、调度的基本单位;
引入线程后:进程是资源分配的基本单位、线程是调度的基本单位;
② 并发性
引入线程前:只能进程间并发
引入线程后:进程间并发,同一进程的不同线程可以并发,不同进程的不同线程也可以并发
③ 系统开销
引入线程前:进程间并发,需要切换进程的运行环境,系统开销大
引入线程后:线程间并发,如果是同一进程内的线程切换,不需要切换进程环境,系统开销小;线程之间的切换也比进程之间的切换快。
5. 进程有哪几种状态?他们之间如何进行转换?★★★★
进程的基本转态有:就绪、执行、阻塞。
就绪状态:进程已经分配到除了处理机之外所有的执行所需要的资源,一旦获得处理器就可以立刻执行;
执行状态:进程获得处理机并且在处理器上执行;
阻塞状态:当执行中的程序由于等待某个事件发生而无法执行时,放弃处理机从而进入阻塞状态,例如等待I/O完成。
三种状态之间的相互转换:
执行状态的程序遇到I/O请求等将会转入阻塞状态。
I/O请求完成时会进入就绪状态。
获得处理机之后将重新进入执行状态。
执行状态的程序当时间片用完时,将会重新回到就绪状态。
6. 进程的调度策略有哪些?★★★★★
(1)先来先服务
在作业调度中,该算法每次会从后备队列中选择最先进入该队列的作业调入内存,为其分配资源并且创建进程,并放入就绪队列;在进程调度中,算法将从就绪队列中选择最先进入队列的进程,分配处理机执行。(对短作业不友好)
(2)短作业优先
在进程调度之前,操作系统将获取后备队列中作业的执行时间或者就绪队列中进程的执行时间,并且选择时间最短的优先进行调度。该算法会导致长作业或者长进程的饥饿现象。(对长作业不友好)
(3)优先权调度
为了照顾一些紧迫类型的作业,为每个作业按照紧急程度赋予了优先级。在进行作业调度时,系统将从后备队列中选择拥有高优先权的作业装入内存。该算法可以分为抢占式和非抢占式,在抢占式方式下,一旦在程序执行期间有比当前执行程序优先权更高的进程进入就绪队列,调度程序将立即停止当前执行程序,转而将处理机分配给高优先权的进程;而在非抢占方式下,执行的程序会一直执行直至完成或者主动放弃处理机,调度程序才进行调度。
(4)高响应比优先调度
为了解决短作业优先算法中长作业的饥饿问题,该算法为每个作业引入一个动态优先权,该优先权等于(等待时间 + 要求服务时间)/ 要求服务时间,该算法在利用短作业优先的思想之下,同时照顾等待时间长的作业(周转时间/要求服务时间);
(5)轮转算法
系统将所有就绪进程排成一个队列,在每次调度时,处理机将分配给队列的起一个进程,并且令其执行一个时间片长度。当时间片执行完时,由计时器发出一个时钟请求,此时调度程序停止该程序并将其移动至队尾;
(6)多级反馈队列调度
该算法不需要知道各种进程的执行时间,同时可以满足各种不同类型进程的需求,例如短进程会很快完成,长进程不会饥饿。算法的执行过程为:
①设置多个就绪队列,每个队列的优先级不同。第一个队列优先级最高并依次递减,优先级越低的队列时间片越长,一般按照倍数增长;
②当一个新的进程进入内存后,其首先被放入第一队列的队尾,并且按照先来先服务的原则等待调度。若其在第一个时间片可以完成执行,则将撤出系统;若不能,则其在时间片执行完毕之后会被移动至下一个就绪队列的队尾,如此反复;
③上一级队列为空的时候,下一级队列才开始进行调度。
7. 进程的调度性能指标有哪些?★★★★
CPU利用率、系统吞吐量、周转时间、平均周转时间、等待时间、带权周转时间=作业周转时间/作业实际运行的时间(带权周转时间越大,说明相对等待得越久)、平均带权周转时间。
(图转自王道计算机考研)
8. 进程之间的通信方式有哪些?★★★
(1)共享存储器系统
相互通信的进程共享某些数据结构或者共享存储区,并且借助这些空间进行通信,主要有基于共享数据结构的通信方式(例如队列实现的缓冲区)与基于共享存储区的通信方式(例如内存中划分出来的共享区)。
(2)管道通信系统
管道是连接一个读进程与一个写进程之间通信的一个共享文件,又称为pipe文件,它必须被互斥地访问,即运作于半双工方式。同时必须进行同步,即一方写满后另一方才读,或者一方读空后另一方才写。
(3)消息传递系统
在该机制中,以格式化的消息为单位,将通信的数据封装在消息中,并利用操作系统提供的一组通信命令(原语)在进程之间进行数据交换。
9. 什么是死锁?产生死锁的原因?产生死锁的必要条件是什么?★★★★★
(1)死锁的定义:
死锁是指多个进程因为竞争资源而造成相互等待的情况,若无外力作用,这些进程都无法向前推进。
(2)产生死锁的原因:
①竞争不可抢占型资源
②竞争可消耗型资源(硬件中断、信号等)
③进程推进顺序不当。
(3)产生死锁的四个必要条件:
①互斥条件:进程对所获得的资源必须互斥访问,即同一时刻只能有一个进程访问;
②请求和保持:进程在至少获得一个资源的情况下,又提出新的资源需求;
③不可抢占:进程所获得的资源在其完成之前不可被其他进程抢占;
④循环等待链:当发生死锁时,必然存在一个进程——资源循环等待链。
10. 解决死锁有什么办法?★★★★★
(1)死锁的预防:破坏死锁产生的四个条件之一即可。
(2)死锁的避免:银行家算法。先看能不能给他,再假设给他,看是否存在一条安全性序列,不存在的话就不安全。(不安全的状态有可能会导致死锁,安全状态不会的)。
(3)死锁的检测:构造资源分配表,看是否能够化简完全(即看是否存在环路)。
(4)死锁的解除:一般是撤销一部分进程使得死锁解除。
11. 如何预防死锁?★★★★★
预防死锁可以通过破坏产生死锁的四个必要条件中的一个实现。
(1)破坏互斥条件:如Spooling技术。使用Spooling技术,可以将所有的I/O请求都先缓冲起来,然后按顺序依次处理。
(2)破坏请求保持条件:资源一次性分配,则一次性分配进程运行所需要资源,或分配进行运行初期需要的资源,在进程运行过程中逐步释放资源并且请求新资源
(3)破坏不可抢占条件:当进程获得部分资源,但是得不到其他资源时,它将释放已经占有的资源
(4)破坏循环等待链:资源有序分配,即系统为没类资源赋予一个编号,每一个进程按照编号递增的顺序请求资源。
12. 什么是银行家算法?★★★
银行家算法用于解决操作系统中的资源分配问题和预防死锁。
银行家算法的核心思想是通过动态地检查系统资源的状态,来判断是否分配资源会导致死锁,并只允许安全的分配。它基于资源的最大需求量和当前已分配资源的情况,对进程提出资源请求进行评估。
银行家算法的实现过程为:
设置四种数据结构:
Avaliable(系统中所有可用资源数量);
Max(系统中n个进程对m类资源的最大需求量);
Allocation(每类资源已经分配给进程的资源数);
Need(每个进程尚需的各类进程数)。
申请过程中,Requires需要小于Need与Avaliable,若满足,则系统试探性的进行分配,并执行安全性算法,假设将可用资源分配给某一进程,进程完成后释放资源。如果所有进程可以完成则说明系统仍处于安全状态,则此次分配成功。否则,不进行分配并且等待。
13. 哲学家进餐有哪些实现方式?★★★
(1)最多只允许n-1个哲学家拿起筷子就餐
(2)奇数号哲学家拿先拿左边的筷子,偶数号哲学家先拿右边的筷子
(3)当一个哲学家拿起一只筷子时,如果另外一只筷子无法拿起,则放下刚刚拿起的筷子
14. 简单操作系统内存管理的功能。★★★
(1)内存的分配与回收
(2)地址转换(逻辑地址->物理地址)
(3)内存保护(防止越界,非法访问)
(4)内存共享(多个进程对应一个程序)
(5)内存扩充(覆盖、交换、虚拟存储器)
15. 简单叙述一下内存空间的分配。★★★★★
连续分配管理方式,用户进程分配的必须是一个连续的内存空间。连续分配方式包括:
单一连续分配:整个内存空间只分配给一个进程,其他进程被限制在外部存储器上。
固定分区分配:将内存划分为若干固定大小的区域(可以分区大小相等,也可以分区大小不等),每个区域只能分配给一个进程使用。
动态分区分配:将内存划分为不同大小的区域,根据进程的大小动态地分配合适大小的空闲内存块。
非连续分配管理方式:为用户进程分配的不一定是连续的内存。非连续分配方式包括:
分页方式:将物理内存和进程的逻辑地址空间分成固定大小的页,从而实现将进程的页映射到物理内存的任意位置。
分段方式:将进程的逻辑地址空间划分为多个逻辑段,每个逻辑段映射到物理内存的任意位置。
段页式方式:结合了分段和分页的特点,将进程的逻辑地址空间划分为多个段,每个段再被分成固定大小的页。
16. 简单叙述一下动态分区分配算法。★★★★★
(1)首次适应算法
从空闲内存块列表中找到第一个满足进程需求的空闲块,分配给进程,并将剩余的空闲块插入到空闲块列表中合适的位置。这种算法执行效率较高,但可能会导致内存碎片问题。
(2)最佳适应算法
在空闲内存块列表中找到最小且能满足进程需求的空闲块,分配给进程。这种算法能够更好地利用内存,减少内存碎片,但执行效率较低。
(3)最差适应算法
在空闲内存块列表中找到最大的空闲块,然后将其分配给进程。这种算法可以产生较大的空闲块,但也容易导致外部碎片问题。
(4)简单叙述一下动态分区回收算法。★★★
上邻空闲区。与上空闲区合并,修改其长度。
下邻空闲区。与下空闲区合并,修改其长度和首址。
上、下邻空闲区。与上、下空闲区合并,修改其长度和首址,从空闲区表中或空闲链表中删除下接的空闲区表项。
上下都不相邻空闲区时,在空闲区表中或空闲链表中添加新项,添上被回收分区长度和首址。
17. 非连续内存分配中,分页的好处是什么,分页和分段有什么区别?★★★★★★
分页的好处:
(1)实现了虚拟内存:分页将进程的逻辑地址空间划分为固定大小的页,并将物理内存也划分为相同大小的页框。这样,每个进程只需要将所需的页加载到物理内存中,而不需要一次性加载整个进程。
(2)内存利用率高:分页可以更灵活地分配内存,当进程的大小不是固定的且不规则时,分页可以更好地利用内存空间,减少内存碎片的产生。
(3)页表简单:由于页的大小是固定的,页表可以更加简单有效地实现。
分页和分段的区别:
(1)单位不同:分页以固定大小的页作为单位进行管理,而分段以逻辑段作为单位进行管理。分页的大小是固定的,由操作系统指定;而分段的大小是可变的,由程序员决定。
(2)地址映射方式不同:在分页中,逻辑地址被划分为页号和页内偏移量,通过页表进行映射。而在分段中,逻辑地址是由段号和段内偏移量组成,使用段表进行映射。
(3)内存碎片情况不同:由于分页使用固定大小的页,会产生内部碎片(页内的未利用空间),而分段可以更好地适应变长的逻辑段,避免内部碎片。
(4)管理灵活性不同:分页更适合处理不规则且动态变化的进程需求,而分段更适合处理结构化的程序,如编译器、数据库等。
18. 什么是虚拟内存?什么是共享内存?★★★
(1)虚拟内存
虚拟内存是一种计算机系统的内存管理技术,它扩展了物理内存的容量,并允许进程能够使用比实际可用物理内存更大的地址空间。当进程需要访问一个不在物理内存中的页时,操作系统会将该页从外部存储器中加载到物理内存,这个过程被称为页的置换。虚拟内存的主要优势包括:提供了比物理内存更大的地址空间、允许多个进程并发执行、简化了内存管理等。
(2)共享内存
共享内存是一种进程间通信的机制,它允许多个进程访问同一块物理内存区域,从而实现数据的共享和交换。共享内存适用于需要高效地进行大量数据传输的场景,比如多个进程之间需要共享大型数据结构、缓存或其他共享资源时。
(3)总结
虚拟内存和共享内存是两个不同的概念和技术,虚拟内存是一种扩展物理内存容量的技术,而共享内存是进程间通信的一种机制,用于实现数据的共享和交换。
19. 有哪些页面置换算法?请简述。★★★★★
(1)最佳置换算法(OPT)
每次选择淘汰的页面是以后最长时间内不再被访问的页面。这种算法是最理想的算法,目前无法实现,但可以作为衡量一个置换算法好坏的标杆。
(2)先进先出置换算法(FIFO)
每次选择淘汰最先进入内存的页面,这种置换算法保证了公平性,但是会出现belady现象,即当内存空间增大时,页命中率下降。
(3)最近最久未使用算法(LRU)
每次淘汰的页面是最近最久未被使用的页面,该算法利用了栈的特性,因此不会出现belady现象。
(4)时钟置换算法(Clock)
为每个页面设置一个访问位,页面被访问时,将其访问位设置为1,每次系统选择淘汰访问位为0的页面。每次进行淘汰时,系统循环地检查每个页面访问位,若为1,则设置为0;若为0,则淘汰页面。Clock算法给了页面留存内存的第二次机会。
(5)改进时钟算法
在访问位的基础上添加一个修改位,两个位组合一共有四种组合:00,01,10,11。扫描到第一个00,则将页面淘汰;若第一轮失败,则第二轮扫描第一个01淘汰,并且将10设置为00,将11设置为01;若前两轮失败,则重复前两轮。因为此时10与11已经被更新为00和01,因此一定可以找到用于替换的页面。
20. 有哪些磁盘调度算法?请简述。★★★★★
(1)先来先服务(FCFS)
这是一种公平调度算法,其根据请求访问磁盘的先后顺序进行调度;
(2)最短寻道时间优先(SSTF)
该算法考虑当前磁头距离哪个被请求的磁道,则哪个磁道将被优先访问。但是该算法可能产生饥饿现象;
(3)扫描算法(SCAN):
该算法是先满足一个方向所有的请求,再满足反方向的所有请求,如此循环往复。该算法如果在一个方向上已经没有请求,则可以提前掉头,无需扫描到末端;
(4)循环扫描算法(CSCAN):
该算法在SCAN算法的基础上,规定磁头只能单向移动,即只满足同一个方向上的所有请求;
21. 磁盘存储管理有哪些方法?★★★★
(1)连续分配:要求每一个文件分配一组相邻接的盘块,访问速度快,但是必须事先知道文件的大小;
(2)链接分配:分为隐式链接和显示链接。隐式链接是指在每个目录项中都含有指向链接文件第一盘块和最后一个盘块的指针,每个盘块都有指向下一个盘块的指针,显示链接是指把用于链接文件各物理块的指针都存放在内存中的一张链接表中。它不支持随机访问,但是利于文件的动态增长;
(3)索引分配:分为单级索引分配以及多级索引分配。它为每个文件分配一个索引表,把分配给该文件的所有盘号都记录在该索引块中。它不能支持高效的直接存取。
22. 文件系统中文件是如何组织的?★★★★
(1)逻辑结构
文件的逻辑组织结构通常分为有结构文件和无结构文件。其中,有结构文件即在逻辑上被视为一组连续记录的集合的文件,分为定长记录文件和不定长记录文件两种;无结构文件则是内部不在划分记录,而是由一组相关信息组成的有序字符流。
(2)物理结构
文件的物理结构通常分为顺序文件、索引文件和索引顺序文件。顺序文件是指由一系列记录按照某种顺序排列所形成的文件,索引文件是指为变长记录建立一张索引表,为每个记录设置一个表项,从而加速对记录的检索。索引顺序文件是为一组记录的第一个记录建立索引表。
23. 一段代码是怎么装入内存的★★
(1)编译
首先,开发者使用编译器将源代码翻译为目标文件。编译过程包括词法分析、语法分析、语义分析、代码生成等步骤。
(2)目标文件生成
编译器生成的目标文件包含了已编译的机器指令、数据和符号表等信息。目标文件的格式可能是可执行文件格式(如ELF、Mach-O、PE等)或者是对象文件格式(如.o、.obj等)。
(3)链接
如果代码依赖于其他模块或库文件中的函数或变量,链接器会将这些模块或库文件与目标文件进行链接,解决符号引用和定义之间的关联。链接器会创建一个最终可执行文件或共享库文件。
(4)装入
操作系统负责将生成的可执行文件或共享库文件从存储介质(如硬盘)加载到内存中。加载过程包括分配足够的内存空间来存放代码段、数据段以及其他必要的信息。
(5)重定位
在加载过程中,操作系统可能需要进行地址重定位。因为程序在内存中的实际地址与编译时或链接时使用的虚拟地址可能不一致。重定位的目的是确保程序在内存中的地址能够正确地访问和跳转。
24. 说一说链接的三种方式。★★★
链接是将编译后的多个模块或库文件合并为一个可执行文件的过程。
(1)静态链接
在程序运行之前先将各目标模块及它们所需的库函数连接成一个完整的可执行文件(装入块),之后不再拆开。
(2)装入时动态链接
将各目标模块装入内存时,边装入边链接的链接方式。
(3)运行时动态链接
在程序执行中需要该目标模块时,才对它进行链接。其优点是便于修改和更新,便于实现对目标模块的共享。