操作系统面试知识点总结(二):内存、锁方面

本文深入探讨操作系统面试中常见的知识点,包括死锁的定义、产生条件、预防与避免策略,以及进程间的资源竞争。同时,详细阐述内存管理,如分页、分段、快表和多级页表机制,强调虚拟地址空间的重要性。此外,解释了虚拟内存的原理、局部性原理以及页面置换算法,分析了内存管理中的颠簸问题及其解决方案。
摘要由CSDN通过智能技术生成

本文主要记录有关操作系统方面的知识点以及面试时容易被问到的问题。

操作系统面试知识点总结(一):进程、线程方面

一、死锁方面知识点
1、什么是死锁?

死锁主要出现在两个或者多个并发进程中,当进程A持有独占锁a,并尝试去获取独占锁b的同时,进程B持有独占锁b,并尝试获取独占锁a的情况下,就会发生AB两个进程由于互相持有对方需要的锁,而发生的阻塞现象,称为死锁。

2、死锁产生的必要条件?
  • 互斥条件: 进程要求对所分配的资源进行排它性控制, 即一次只能被一个进程使用; 若其他申请使用该资源, 那么申请进程必须等到该资源被释放为止;
  • 请求与保持条件: 当进程因请求资源而阻塞时,对已获得的资源保持不放;
  • 不剥夺条件: 进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放;
  • 循环等待条件: 若干进程之间形成一种头尾相接的环形等待资源关系。
3、死锁如何产生的?
  • 竞争资源引起进程死锁
    当系统中供多个进程共享的资源如打印机、公用队列的等,其数目不足以满足诸进程的需要时,会引起诸进程对资源的竞争而产生死锁。
  • 可剥夺资源和不可剥夺资源
    系统中的资源可以分为两类,一类是可剥夺资源,是指某进程在获得这类资源后,该资源可以再被其他进程或系统剥夺。例如,优先权高的进程可以剥夺优先权低的进程的处理机。又如,内存区可由存储器管理程序,把一个进程从一个存储区移到另一个存储区,此即剥夺了该进程原来占有的存储区,甚至可将一进程从内存调到外存上,可见,CPU和主存均属于可剥夺性资源。另一类资源是不可剥夺资源,当系统把这类资源分配给某进程后,再不能强行收回,只能在进程用完后自行释放,如磁带机、打印机等。
  • 竞争不可剥夺资源
    在系统中所配置的不可剥夺资源,由于它们的数量不能满足诸进程运行的需要,会使进程在运行过程中,因争夺这些资源而陷于僵局。例如,系统中只有一台打印机R1和一台磁带机R2,可供进程P1和P2共享。假定PI已占用了打印机R1,P2已占用了磁带机R2,若P2继续要求打印机R1,P2将阻塞;P1若又要求磁带机,P1也将阻塞。于是,在P1和P2之间就形成了僵局,两个进程都在等待对方释放自己所需要的资源,但是它们又都因不能继续获得自己所需要的资源而不能继续推进,从而也不能释放自己所占有的资源,以致进入死锁状态。
  • 竞争临时资源
    上面所说的打印机资源属于可顺序重复使用型资源,称为永久资源。还有一种所谓的临时资源,这是指由一个进程产生,被另一个进程使用,短时间后便无用的资源,故也称为消耗性资源,如硬件中断、信号、消息、缓冲区内的消息等,它也可能引起死锁。
4、如何预防死锁?

只要确保死锁发生的四个必要条件中至少有一个不成立, 就能预防死锁的发生。

  • 破坏互斥条件: 允许进程同时访问某些资源。其实这个条件没有办法破坏,因为用锁本来就是想让他们互斥的(临界资源需要互斥访问);
  • 破坏请求与保持条件: 一次性申请所有的资源。可以实行资源预先分配策略或者只允许进程在没有占用资源时才可以申请资源(一个进程可申请一些资源并使用它们,但是在当前进程申请更多资源之前, 必须全部释放当前所占有资源)。但是这种策略也存在一些缺点:在很多情况下, 无法预知一个进程执行前所需的全部资源,因为进程是动态执行的, 不可预知的; 同时,会降低资源利用率,导致降低进程并发性;
  • 破坏不可剥夺条件:占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源。 这种预防死锁的方式实现起来困难, 会降低系统性能;
  • 破坏循环等待条件:实行资源有序分配策略。对所有资源排序编号, 所有进程对资源的请求必须严格按资源序号递增的顺序提出, 即只用占用了小号资源才能申请大号资源, 这样就不会产生环路, 预防死锁的发生。

资源预先分配策略:进程在运行前一次性向系统申请它所需要的全部资源, 若所需全部资源得不到满足, 则不分配任何资源, 此进程暂不运行; 只有当系统满足当前进程所需的全部资源时, 才一次性将所申请资源全部分配给该进程。

5、如何避免死锁?

避免死锁的基本思想是动态地检测资源分配状态

资源分配图算法银行家算法 是两种经典的死锁避免算法, 其可以确保系统始终处于安全状态。

6、如何解除死锁?

解除死锁的常用方法是 进程终止资源抢占

进程终止:指简单地终止一个或多个进程以打破循环等待, 包括两种方式:终止所有死锁进程和一次只终止一个进程直到取消死锁循环为止。
资源抢占:指从一个或多个死锁进程那里抢占一个或多个资源。

7、解决死锁的基本方法
  • 预防死锁
  • 避免死锁
  • 检测死锁
  • 解除死锁
  • 鸵鸟算法(假装根本没有问题发生)
二、内存管理方面知识点
1、操作系统的内存管理主要工作

主要负责内存的分配与回收、地址转换。

malloc 函数:申请内存
free 函数:释放内存
地址转换:将逻辑地址转换成相应的物理地址

2、常见的几种内存管理机制

简单分为连续分配管理方式非连续分配管理方式这两种。

  • 连续分配管理方式:指为一个用户程序分配一个连续的内存空间,常见的有:块式管理 。
  • 非连续分配管理方式:允许一个程序使用的内存分布在离散或者说不相邻的内存中,常见的有:页式管理 和 段式管理。

块式管理:很早之前计算机操系统的内存管理方式。将内存分为几个固定大小的块,每个块中只包含一个进程。如果程序运行需要内存的话,操作系统就分配给它一块,如果程序运行只需要很小的空间的话,分配的这块内存很大一部分几乎被浪费了。这些在每个块中未被利用的空间,称之为碎片。

页式管理:把主存分为大小相等且固定的一页一页的形式,页较小,相对相比于块式管理的划分力度更大,提高了内存利用率,减少了碎片。页式管理通过页表对应逻辑地址和物理地址。页式管理虽然提高了内存利用率,但是页式管理其中的页实际并无任何实际意义。

段式管理:段式管理把主存分为一段段的,每一段的空间又要比一页的空间小很多 。但是,最重要的是段是有实际意义的,每个段定义了一组逻辑信息,例如,有主程序段 MAIN、子程序段 X、数据段 D 及栈段 S 等。 段式管理通过段表对应逻辑地址和物理地址。

段页式管理机制:段页式管理机制结合了段式管理和页式管理的优点。简单来说段页式管理机制就是把主存先分成若干段,每个段又分成若干页,也就是说段页式管理机制中段与段之间以及段的内部的都是离散的。

3、分页和分段的异同点?

相同点:

  • 分页机制和分段机制都是为了提高内存利用率,较少内存碎片。
  • 页和段都是离散存储的,所以两者都是离散分配内存的方式。但是,每个页和段中的内存是连续的。

不同点:

  • 目的不同:分页是由于系统管理的需要而不是用户的需要, 它是信息的物理单位; 分段的目的是为了更好地满足用户的需要, 它是信息的逻辑单位, 它含有一组其意义相对完整的信息
  • 大小不同:页的大小固定且由系统决定, 而段的长度却不固定, 由其所完成的功能决定
  • 地址空间不同:段向用户提供了二维地址空间; 页向用户提供的是一维地址空间
  • 信息共享:段是信息的逻辑单位, 便于存储保护和信息的共享, 页的保护、共享收到限制
  • 内存碎片:页式存储管理的优点是没有外碎片(因为页的大小固定), 但会产生内碎片(一个页可能填不满), 段式管理的优点是没有内碎片(段大小可变, 改变段大小来消除内碎片), 但段换入换出时会产生外碎片
4、快表和多级页表

快表和多级页表是页表管理机制中两个很重要的概念。

在分页内存管理中,很重要的两点是:
(1)虚拟地址到物理地址的转换要快。
(2)解决虚拟地址空间大,页表也会很大的问题。

(1)快表:

为了解决虚拟地址到物理地址的转换速度,操作系统在页表方案基础之上引入了 快表 来加速虚拟地址到物理地址的转换。可以把快表理解为一种特殊的高速缓冲存储器(Cache),其中的内容是页表的一部分或者全部内容。作为页表的 Cache,它的作用与页表相似,但是提高了访问速率。由于采用页表做地址转换,读写内存数据时 CPU 要访问两次主存。有了快表,有时只要访问一次高速缓冲存储器,一次主存,这样可加速查找并提高指令执行速度。

使用快表之后的地址转换流程是这样的:

  • 根据虚拟地址中的页号查快表;
  • 如果该页在快表中,直接从快表中读取相应的物理地址;
  • 如果该页不在快表中,就访问内存中的页表,再从页表中得到物理地址,同时将页表中的该映射表项添加到快表中;
  • 当快表填满后,又要登记新页时,就按照一定的淘汰策略淘汰掉快表中的一个页。
(2)多级页表:

引入多级页表的主要目的是为了避免把全部页表一直放在内存中占用过多空间,特别是那些根本就不需要的页表就不需要保留在内存中。多级页表属于时间换空间的典型场景。

为了提高内存的空间性能,提出了多级页表的概念;但是提到空间性能是以浪费时间性能为基础的,因此为了补充损失的时间性能,提出了快表(即 TLB)的概念。

5、逻辑(虚拟)地址和物理地址
  • 逻辑地址:是指由程序bai产生的与段相关的偏移地址部分。比如在 C 语言中,指针里面存储的数值就可以理解成为内存里的一个地址,逻辑地址由操作系统决定。
  • 物理地址指的是真实物理内存中地址,更具体一点来说就是内存地址寄存器中的地址。物理地址是内存单元真正的地址。
6、为什么要有虚拟地址空间?

没有虚拟地址空间的时候,程序都是直接访问和操作的都是物理内存。这样用户程序可以访问任意内存,寻址内存的每个字节,这样很容易(有意或者无意)破坏操作系统,造成操作系统崩溃;而且想要同时运行多个程序特别困难。

总结来说:如果直接把物理地址暴露出来的话会带来严重问题,比如可能对操作系统造成伤害以及给同时运行多个程序造成困难。

通过虚拟地址访问内存有以下优势:

  • 程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区。
  • 程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。当物理内存的供应量变小时,内存管理器会将物理内存页(通常大小为 4 KB)保存到磁盘文件。数据或代码页会根据需要在物理内存与磁盘之间移动。
  • 不同进程使用的虚拟地址彼此隔离。一个进程中的代码无法更改正在由另一进程或操作系统使用的物理内存。
7、什么是虚拟内存(Virtual Memory)?

虚拟内存是计算机系统内存管理的一种技术。虚拟内存的重要意义是它定义了一个连续的虚拟地址空间,并且把内存扩展到硬盘空间。

虚拟内存可以让程序可以拥有超过系统物理内存大小的可用内存空间。另外,虚拟内存为每个进程提供了一个一致的、私有的地址空间,它让每个进程产生了一种自己在独享主存的错觉(每个进程拥有一片连续完整的内存空间)。这样会更加有效地管理内存并减少出错。

虚拟内存使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更容易,对真正的物理内存(例如 RAM)的使用也更有效率。

8、介绍一下局部性原理?

程序在执行的时候往往呈现局部性规律,也就是说在某个较短的时间段内,程序执行局限于某一小部分,程序访问的存储空间也局限于某个区域。局部性原理是虚拟内存技术的基础,正是因为程序运行具有局部性原理,才可以只装入部分程序到内存就开始运行。

局部性原理表现在以下两个方面:

  • 时间局部性 :如果程序中的某条指令一旦执行,不久以后该指令可能再次执行;如果某数据被访问过,不久以后该数据可能再次被访问。产生时间局部性的典型原因,是由于在程序中存在着大量的循环操作。
  • 空间局部性 :一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址,可能集中在一定的范围之内,这是因为指令通常是顺序存放、顺序执行的,数据也一般是以向量、数组、表等形式簇聚存储的。

时间局部性是通过将近来使用的指令和数据保存到高速缓存存储器中,并使用高速缓存的层次结构实现。
空间局部性通常是使用较大的高速缓存,并将预取机制集成到高速缓存控制逻辑中实现。
虚拟内存技术实际上就是建立了 “内存一外存”的两级存储器的结构,利用局部性原理实现髙速缓存。

9、 虚拟内存的实现方式?
  • 请求分页存储管理 :建立在分页管理之上,为了支持虚拟存储器功能而增加了请求调页功能和页面置换功能。请求分页是目前最常用的一种实现虚拟存储器的方法。请求分页存储管理系统中,在作业开始运行之前,仅装入当前要执行的部分段即可运行。假如在作业运行的过程中发现要访问的页面不在内存,则由处理器通知操作系统按照对应的页面置换算法将相应的页面调入到主存,同时操作系统也可以将暂时不用的页面置换到外存中。
  • 请求分段存储管理 :建立在分段存储管理之上,增加了请求调段功能、分段置换功能。请求分段储存管理方式就如同请求分页储存管理方式一样,在作业开始运行之前,仅装入当前要执行的部分段即可运行;在执行过程中,可使用请求调入中断动态装入要访问但又不在内存的程序段;当内存空间已满,而又需要装入新的段时,根据置换功能适当调出某个段,以便腾出空间而装入新的段。
  • 请求段页式存储管理

不管是上面哪种实现方式,一般都需要:

  • 一定容量的内存和外存:在载入程序的时候,只需要将程序的一部分装入内存,而将其他部分留在外存,然后程序就可以执行了;
  • 缺页中断:如果需执行的指令或访问的数据尚未在内存(称为缺页或缺段),则由处理器通知操作系统将相应的页面或段调入到内存,然后继续执行程序;
  • 虚拟地址空间 :逻辑地址到物理地址的变换。
10、请求分页与分页存储管理有什么不同呢?

请求分页存储管理建立在分页管理之上。他们的根本区别是是否将程序全部所需的全部地址空间都装入主存,这也是请求分页存储管理可以提供虚拟内存的原因。请求分页存储管理不要求将作业全部地址空间同时装入主存。基于这一点,请求分页存储管理可以提供虚存,而分页存储管理却不能提供虚存。

11、页面置换算法有哪些?
  • 先进先出(FIFO)算法:选择在内存中驻留时间最久的页面进行淘汰;
  • 最近最少使用(LRU)算法:根据使用时间到现在的长短来判断;
  • 最优置换(OPT)算法:理论的最优,就是要保证置换出去的页是不再被使用的页, 或者是实际内存中最晚使用的算法,该算法无法实现;
  • 最少使用次数(LFU)算法:择在之前时期使用最少的页面作为淘汰页。

缺页中断:要访问的页不在主存,需要操作系统将其调入主存后再进行访问。 在这个时候,被内存映射的文件实际上成了一个分页交换文件。

12、虚拟内存的应用与优点有哪些?

应用:虚拟内存很适合在多道程序设计系统中使用, 许多程序的片段同时保存在内存中。 当一个程序等待它的一部分读入内存时, 可以把CPU交给另一个进程使用。
优点:

  • 在内存中可以保留多个进程,提高系统并发
  • 解除用户与内存之间的紧密约束, 进程可以比内存的全部空间还大
13、 颠簸是什么?(抖动)

颠簸本质上是指频繁的页调度行为。进程发生缺页中断时,必须置换某一页。然而,其他所有的页都在使用,它置换一个页,但又立刻再次需要这个页,这时会会不断产生缺页中断,导致整个系统的效率急剧下降,这种现象称为颠簸。

14、如何解决内存颠簸(抖动)?
  • 如果是因为页面替换策略失误, 修改替换算法;
  • 如果是因为运行的程序太多,造成程序无法同时将所有频繁访问的页面调入内存,则要降低多道程序的数量;
  • 终止该进程或增加物理内存容量

参考文章:

死锁面试题操作系统知识点JavaGuide突击面试版

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值