跳至主要內容

操作系统面试习题(下)

CodeShouhu大约 22 分钟使用指南Markdown

虚拟内存

1,什么是虚拟内存(Virtual Memory)?

虚拟内存是计算机系统内存管理的一种技术,它使得应用程序认为它拥有连续的可用的内存,而实际上,它通常是被分割成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。当内存耗尽时,电脑会自动调用硬盘来充当内存,以缓解内存的紧张,提高电脑运行速率。

正是因为 虚拟内存 的存在,通过 虚拟内存 可以让程序可以拥有超过系统物理内存大小的可用内存空间。另外,虚拟内存为每个进程提供了一个一致的、私有的地址空间,通过页表寻址完成虚拟地址和物理地址的转换。

速记

虚拟内存真奇妙,管理内存有高招。
应用以为内存连,实则碎片磁盘潜。
内存紧张不用怕,硬盘救场速率佳。
可用空间超物理,私有地址各独立。
页表寻址来转换,虚拟物理无缝连。

2,虚拟内存的技术实现

虚拟内存的技术实现主要有以下三种方式

  1. 请求分页存储管理:建立在分页管理之上,为了支持虚拟存储器功能而增加了请求调页功能和页面置换功能。在作业开始运行之前,只装入当前要执行的部分段即可运行。如果在作业运行过程中发现要访问的页面不在内存,则由处理器通知操作系统按照对应的页面置换算法将相应的页面调入到主存,同时操作系统也可以将暂时不用的页面置换到外存中
  2. 请求分段存储管理:建立在分段存储管理之上,增加了请求调段功能、分段置换功能。这种方式在作业开始运行之前,只装入当前要执行的部分段即可运行;在执行过程中,可使用请求调段功能装入要访问但又不在内存的程序段;当内存空间已满,而又需要装入新的段时,根据置换功能适当调出某个段,以便腾出空间装入新的段。
  3. 段页式存储管理:是同时采用分段和分页两种方法来进行内存分配和管理的。在段页式存储管理中,每个段对应一页,因而每个页面的大小与段的长度相等。在内存分配时,可以一次性地将一个作业的所有段一次性地分配到内存中,也可以分多次调入内存

这些就是虚拟内存的一些技术实现方式,如有需要,建议查阅计算机相关资料或请教专业人士。

速记

虚拟内存有三招,分页分段页段搞。
请求分页功能妙,调页置换按需到。
请求分段也可靠,调段置换空间巧。
段页结合更高效,分配内存灵活好。

3,虚拟内存和物理内存的差别,为什么要用虚拟内存?

虚拟内存和物理内存的主要差别在于,物理内存是指由于安装内存条而获得的临时储存空间,而虚拟内存是计算机系统内存管理的一种技术,使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),但实际上是被分割成多个物理内存碎片,部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。

虚拟内存的引入主要有以下几个原因

  1. 提高内存利用率:物理内存是有限的,当有多个进程要执行时,对每个进程都要分配一定的物理内存,很容易就会出现内存不足的情况。而虚拟内存可以使每个进程都感到自己拥有足够的内存,从而提高内存的利用率。
  2. 方便程序执行:虚拟内存可以使每个程序都感到自己拥有独立的内存空间,这样就可以避免不同程序之间的相互干扰,使得程序的执行更加稳定和可靠。
  3. 提高系统安全性:虚拟内存可以隔离不同进程的访问权限,使得每个进程只能访问自己的虚拟内存空间,从而避免了一些恶意行为对系统的攻击。
  4. 方便内存管理:虚拟内存可以使内存管理更加灵活和方便,因为它是按照需要将数据存放在磁盘和物理内存之间进行交换的,从而使得内存的利用率更高。

总之,虚拟内存是一种重要的技术,可以提高内存利用率、方便程序执行、提高系统安全性、方便内存管理等优点。

速记

虚拟物理有差别,内存条得物理卡。虚拟管理有办法,程序连存靠转化。碎片磁盘暂安家,按需交换别犯傻。引入原因好处大,利用提高顶呱呱。程序执行稳不怕,安全隔离护大家。内存管理灵活抓,虚拟内存人人夸。

4,虚拟内存有哪些部分?

五大区:

1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构open in new window中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表open in new window
3、全局区(静态区)(staticopen in new window)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区(常量存储区) —常量字符串就是放在这里的。 程序结束后由系统释放。这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)
5、程序代码区—存放函数体的二进制代码。

速记

栈区:存放函数的参数值,局部变量的值;堆区 由程序员分配释放;

全局区:全局变量和静态变量的存储;常量存储区 存放的是常量;程序代码区—存放函数体的二进制代码

页面置换算法

5,页面置换算法有哪些

OPT 页面置换算法(最佳页面置换算法)最佳(Optimal, OPT)置换算法 所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得 最低的缺页率。但由于人们目前无法预知进程在内存下的若干页面中哪个是未来最长时间内不再被访问的,因而该算法 无法实现。一般作为衡量其他置换算法的方法。

FIFO(First In First Out) 页面置换算法(先进先出页面置换算法) : 总是淘汰 最先进入内存的页面,即选择在内存中 驻留时间最久的页面 进行淘汰。

LRU (Least Recently Used)页面置换算法(最近最久未使用页面置换算法) :LRU 算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 T,当须淘汰一个页面时,选择现有页面中其 T 值最大的,即 最近最久未使用的页面 予以淘汰。

LRU算法:LRU 算法用于 缓存淘汰。思路是将缓存中 最近最少使用的对象删除掉

实现方式:利用 链表和 hashmap

当需要插入新的数据项的时候,如果新数据项在链表中存在(一般称为 命中),则把该节点移到链表头部,如果不存在,则新建一个节点,放到链表头部,若缓存满了,则把链表最后一个节点删除即可。

在访问数据的时候,如果数据项在链表中存在,则把该节点移到链表头部,否则返回 -1。这样一来在链表尾部的节点就是 最近最久未访问的数据项

LFU (Least Frequently Used)页面置换算法(最少使用页面置换算法) : 该置换算法选择在之前时期 使用最少的页面 作为淘汰页

速记

页面置换有算法,且听我来把言发。OPT 最最佳,未来不用就拿下,缺页率低难实现,衡量他法顶呱呱。FIFO 先进先出啦,驻留最久就被刷。LRU 记时间差,最久未用就下架,链表哈希来优化,缓存淘汰全靠它。LFU 也不差,最少使用淘汰它。记住算法好处大!

中断与异常

6,外中断和异常有什么区别?

外中断 是指由 CPU 执行指令以外的事件 引起,如 I/O 完成中断,表示设备输入/输出处理已经完成,处理器能够发送下一个输入/输出请求。此外还有 时钟中断控制台中断 等。

异常 是由 CPU 执行指令的内部事件 引起,如 非法操作码地址越界算术溢出

速记

外中断事挺明显,CPU 指令外事件。I/O 完成时钟断,控制台也来插言。异常情况不一般,指令内部起波澜。非法操作越了界,算术溢出也出现。内外区分记心间。

7,Linux中异常和中断的区别

在Linux中,异常和中断是两种不同的系统事件处理机制。

中断 是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的CPU暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务的程序中去,服务完毕后再返回去继续运行被暂时中断的程序。在Linux中,中断通常分为 同步中断(硬件中断)异步中断(异常)同步中断 是当指令执行时由CPU控制单元产生,异步中断 则是由其他硬件设备依照CPU时钟信号随机产生。

异常 是指在程序运行过程中出现的非预期的事件,比如 故障(fault)陷阱(trap) 等。当异常发生时,CPU会终止当前正在运行的程序,然后跳转到预设的 异常处理程序(在Linux中,这些处理程序通常是由内核直接执行的)。对于 故障,处理程序会尝试重新执行引发故障的指令;而对于 陷阱,处理程序会直接执行下一条指令。如果异常处理程序无法处理该异常,那么它可能会 强制终止当前进程

总的来说,中断和异常都是为了处理系统事件,但是它们在 处理方式处理目标 上存在明显的区别。中断 主要是为了处理外部和内部事件,是一种 同步处理机制;而 异常 主要是为了处理程序运行中的非预期事件,是一种 异步处理机制

速记

Linux 机制有两样,异常中断不一样。中断来时 CPU 停,内外事件它来应,同步异步分分明,控制硬件信号行。异常运行出状况,故障陷阱来登场,处理跳转内核忙,故障重试不慌张,陷阱执行下一行,无法处理进程亡。中断同步事多样,异常异步保顺畅,处理方式各有长,系统稳定不能忘。

动态分区算法

8,动态分区分配算法有哪几种?可以分别说说吗?

动态分区分配算法主要有以下四种:

  1. 首次适应算法(First Fit):空闲分区以地址递增的次序排列。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到第一个能满足要求的空闲分区。这种算法 简单且最快,但容易在内存低地址部分产生大量小碎片,导致查找开销变大。
  2. 最佳适应算法(Best Fit):空闲分区按容量递增次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到第一个能满足要求的空闲分区。这种算法能尽量留下 大的空闲区,但容易产生大量碎片。
  3. 最坏适应算法(Worst Fit):空闲分区按容量递减次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到第一个能满足要求的空闲分区。这种算法能优先使用 最大的连续空闲区,减少碎片,但可能会导致在内存末尾分裂成小碎片。
  4. 邻近适应算法(Next Fit)(循环首次适应算法):空闲分区以地址递增的顺序排列(可排成一个循环链表)。每次分配内存时从上次查找结束的位置开始查找空闲分区链(或空闲分区表),找到第一个能满足要求的空闲分区。这种算法能 减少查找开销,但可能会导致在内存末尾分配空间分裂成小的碎片。

这些算法各有其优点和缺点,实际应用中需要根据具体需求和场景选择合适的算法。

速记

动态分区算法妙,四种方法要记牢。首次适应先查找,地址递增速度高,低址碎片开销糟。最佳适应容量找,留下大区碎片绕。最坏适应反着搞,大区优先尾碎小。邻近适应循环找,减少开销尾碎扰。各有优劣要明了,按需选择错不了。

操作系统中进程概念

9,守护进程、僵尸进程和孤儿进程

守护进程僵尸进程孤儿进程是操作系统中常见的概念。

守护进程Daemon Process)是Linux中的后台服务进程,它的生命周期较长,通常独立于控制终端并且周期性地执行某种任务或者等待处理某些发生的事件守护进程是一个特殊的孤儿进程,它是脱离终端的。守护进程没有控制终端,所以任何输出,无论是向标准输出设备 stdout还是标准出错设备 stderr的输出都需要特殊处理。它的名称通常以d结尾,比如sshdxinetdcrond等。

僵尸进程Zombie Process)是子进程先于父进程退出,且父进程没有调用wait/waitpid回收子进程的资源,此时,子进程就成为了僵尸进程僵尸进程占用系统资源,因此,在Linux下可以简单地将SIGCHLD信号的操作设为SIG_IGN。这样,子进程结束时不会产生僵尸进程

孤儿进程失去父进程的进程,通常由子进程创建。如果父进程退出,而子进程仍在运行,那么这个子进程就会变成孤儿进程。在操作系统中,孤儿进程会被init进程PID为1的进程)所接管,成为其子进程。因此,孤儿进程守护进程实际上是两种不同类型的过程。

速记

操作系统概念妙,守护僵孤进程到。
守护后台寿命长,脱离终端 d 尾彰,输出处理需有方。
僵尸子退父未收,资源占用别犯愁,SIG_IGN 可解忧。
孤儿父走被 init 留,与守护不同各千秋。

10,父进程、子进程、进程组、作业和会话

在操作系统中,父进程和子进程进程组作业会话的概念是管理和控制进程的重要方式。

父进程和子进程
父进程和子进程是进程之间的一种亲缘关系,子进程父进程创建的。在Unix和类Unix系统(如Linux)中,一个进程无法知道它的父进程在何时、何地、以何种方式创建了它,只能通过读取其自身的状态信息来查看它的父进程是谁。

进程组
进程组是一个或多个进程的集合,其中一个进程被指定为进程组组长,其进程ID等于进程组的ID进程组可以拥有一个前台进程组和一个或多个后台进程组

作业
作业进程组的概念基本类似,它与 Shell 前后台相关的控制方式有关。比如 Shell 可以运行一个前台作业和任意多个后台作业。需要注意的是,当作业中的某个进程又创建了子进程时,子进程并不属于作业,而是属于进程组

会话
会话是一个或多个进程组的集合,通常包括一个控制进程(会话首进程),一个前台进程组和一个或多个后台进程组。一个会话对应一个控制终端,通常是登录到其上的终端设备伪终端设备会话首进程是建立与控制终端连接的进程,通常在登录时启动。

速记

进程管理有高招,父子孙亲关系牢。
父创子来有亲缘,状态查看父方晓。
进程组队有组长,前后台组不一样。
作业类似进程组,Shell 前后它来主。
子创进程归组管,作业之中不沾边。
会话集合进程组,控制终端有归属。
首进程连终端路,登录启动有缘故。

11,子进程从父进程继承了什么

子进程从父进程继承来的属性主要有:

  1. 用户信息权限。子进程继承了父进程的用户信息权限
  2. 目录信息。子进程会继承父进程的当前工作目录
  3. 信号信息。子进程继承了父进程的信号屏蔽字,也就是哪些信号会被忽略。
  4. 环境。也就是环境变量,进程的环境变量保存在环境表中,每个已经启动的进程的环境表都是从父进程的环境表继承下来的。
  5. 共享存储段。这是一种可以让多个进程共享的数据段
  6. 资源限制。子进程会继承父进程的资源限制

值得注意的是,父进程和子进程并不共享内存数据,它们各自拥有自己的虚拟地址空间,只是在文件系统打开文件网络连接等资源上存在继承和共享。

速记

子承父业有多项,且听我来细细讲。
用户权限一起扛,目录信息也跟上。
信号屏蔽有规章,环境变量不遗忘。
共享存储段发光,资源限制也莫忘。
内存数据各一方,资源继承共分享。

12,进程终止的几种方式

进程终止的方式共有五种:

  1. 正常终止:包括从main()函数返回、调用exit()函数、调用**_exit()或_Exit()函数**、最后一个线程从其启动例程中返回、最后一个线程调用pthread_exit()函数
  2. 异常终止:包括调用abort()函数以及收到一个信号并终止。

速记

进程终止分两类,正常异常要辨对。
正常退出方式多,main 返回别错过,
exit、_exit 都有着,线程返回也没错,
pthread_exit 别记错。
异常终止也有招,abort 函数信号到。

13,Linux下同步机制?

Linux系统下的同步机制主要涉及互斥同步这两个概念。

互斥(Mutex)是指用于控制某些系统资源在任意时刻只能允许一个进程访问的机制。在Linux系统中,互斥锁信号量实现,且只能在进程上下文使用。需要注意的是,自旋锁互斥锁不同,自旋锁可以在任何上下文使用。

同步(Synchronization)是指用于实现控制多个进程按照一定的规则或顺序访问某些系统资源的机制。在Linux系统中,同步机制可以避免系统中各个进程之间的资源竞争和共享,以及因中断、异常机制引入等导致的内核执行路径交错运行的问题。例如,可以通过自旋锁和信号量等同步机制来确保关键数据结构一致性和稳定性

除此之外,Linux内核还提供了其他同步机制,例如:

  1. 原子操作:原子操作是不可分割的操作,即在执行过程中不会被其他进程或线程干扰。原子操作可以用来保护共享资源,避免多个进程同时修改同一个资源导致的不一致问题。

  2. 读写锁:读写锁是一种特殊的同步机制,用于控制对共享资源的访问。它允许多个线程同时读取共享资源,但在写操作时只允许一个线程进行。这种机制可以提高并发性和性能,同时避免数据竞争

总之,Linux系统下的同步机制有多种,开发人员可以根据实际需要选择合适的同步机制来确保系统的稳定性和高效性

速记

Linux同步机制妙,互斥同步不能少。
互斥控制单访问,信号量来锁实现,
进程上下才可见,自旋锁用更广泛。
同步规则控资源,竞争交错得避免,
自旋信号来把关,关键数据稳如山。
还有原子操作妙,执行过程不干扰,
读写锁也很可靠,读允多来写独好。
多种机制任你挑,系统稳定效率高。

内存覆盖与交换

14,内存的覆盖是什么?有什么特点?

在操作系统中,内存的覆盖是一种用于管理内存的技术。它的特点主要体现在以下几个方面:

  1. 它可以提高内存的使用效率。当一个程序的部分代码或数据在内存中不再需要,或者当内存空间不足时,可以将这些代码或数据保存在磁盘上,而将新的代码或数据加载到内存中,这样可以使得相同的内存空间可以被不同的程序反复使用。
  2. 它可以使得多个程序共享内存空间,从而减少了内存的浪费
  3. 它可以使得程序在运行时不需要将所有的代码和数据都加载到内存中,从而提高了程序的响应速度

需要注意的是,虽然内存覆盖可以提高内存的使用效率和响应速度,但是它也带来了一些挑战,比如如何有效地管理内存覆盖区域的大小和位置,如何避免覆盖操作导致的错误等。因此,在使用内存覆盖技术时,需要综合考虑其利弊,并根据具体的应用场景选择合适的管理策略。

速记

内存覆盖技术妙,管理内存有高招。
效率提升重复用,多程共享浪费少。
全载无需响应快,利弊权衡策略找。

15,内存交换是什么?有什么特点?

内存交换是一种在计算机科学和操作系统中使用的技术,用于在运行时动态地增加或减少程序使用的内存空间。

其特点主要有以下几点:

  1. 内存交换可以有效地管理计算机的内存资源。在多道程序环境下,如果内存空间不足,可以将部分程序移到辅存(如硬盘) 上,从而使得更多的程序可以在内存中同时运行。
  2. 内存交换可以使得程序的内存分配不再受限于静态分配,而是在运行时根据需要动态地进行分配和释放
  3. 内存交换通常需要将正在运行的程序状态保存到辅存上,并在需要时从辅存上恢复程序的状态,因此可能会增加系统的开销和响应时间

总的来说,内存交换技术主要是在不同进程(或作业) 之间进行,而覆盖则用于同一个程序或进程中。它可以帮助计算机更有效地管理和使用内存资源,提高计算机的性能和效率

速记

内存交换真奇妙,运行之时变大小。
多道环境显神效,程序移盘空间搞。
动态分配限制少,辅存恢复开销高。
进程之间来运作,内存管理效率好。

16,什么时候会进行内存的交换?

内存交换通常在许多进程运行且内存吃紧时进行,而系统负荷降低就暂停。例如:在发现许多进程运行时经常发生缺页,就说明内存紧张,此时可以换出一些进程;如果缺页率明显下降,就可以暂停换出

速记

内存交换有诀窍,进程多了内存焦。
缺页频繁赶紧调,换出进程解烦恼。
缺页下降负荷小,交换暂停刚刚好。