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