操作系统面试习题(中)
死锁
1,你知道什么是死锁吗?
死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力作用,他们都将无法推进下去,陷入死循环。具体来说,当每个进程都在等待其中的其它进程释放资源而被封锁,并且每个进程都占有一定资源而不释放,导致它们都无法向前推进,从而陷入永久等待状态时,就发生了死锁。
活锁指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试—失败—尝试—失败的过程。处于活锁的实体是在不断的改变状态,活锁有可能自行解开。
速记
进程死锁真麻烦,资源争夺互等待。
各占资源不释放,若无外力难推进。
活锁情况不一样,未被阻塞在尝试。
条件未符循环试,或许自行能解开。
2,产生死锁的四个必要条件是什么?
产生死锁的四个必要条件包括:
- 互斥条件:一个资源每次只能被一个进程使用。
- 占有并等待:一个进程至少应该占有一个资源,并等待另一资源,而该资源被其他进程所占有。
- 非抢占:资源不能被抢占。只能在持有资源的进程完成任务后,该资源才会被释放。
- 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
速记
死锁四要记心间,互斥独用资源专。
占有等待不松弦,非抢资源得期满。
循环等待环相连,条件齐聚锁难掀。
3,解决死锁的方法
(1)死锁的预防
打破互斥条件:改造独占性资源为虚拟资源,大部分资源已无法改造。
避免“占有并等待”条件。要求进程在申请新的资源时,先释放已经占有的资源。
避免“不剥夺”条件。允许操作系统剥夺已经分配给一个进程的资源,这样就可以打破死锁状态。
避免“循环等待”条件。对所有资源进行排序,并要求进程按顺序申请资源。
为系统中的每一个资源和进程赋予一个唯一的编号。如果一个进程已经占有了编号为i的资源,就不能再请求编号大于i的资源。
(2)避免则是系统在分配资源时,根据资源的使用情况提前做出预测,从而避免死锁的发生
(3)检测是指系统设有专门的机构,当死锁发生时,该机构能够检测死锁的发生,并精确地确定与死锁有关的进程和资源。
这种方法对资源的分配不加以任何限制,也不采取死锁避免措施,但系统 定时地运行一个 “死锁检测” 的程序,判断系统内是否出现死锁,如果检测到系统发生了死锁,再采取措施去解除它。
(4)解除 是与检测相配套的一种措施,用于将进程从死锁状态下解脱出来。
立即结束所有进程的执行,重新启动操作系统 :这种方法简单,但以前所在的工作全部作废,损失很大。
(5)撤销涉及死锁的所有进程,解除死锁后继续运行 :这种方法能彻底打破死锁的循环等待条件,但将付出很大代价,例如有些进程可能已经计算了很长时间,由于被撤销而使产生的部分结果也被消除了,再重新执行时还要再次进行计算。
逐个撤销涉及死锁的进程,回收其资源直至死锁解除。
抢占资源 :从涉及死锁的一个或几个进程中抢占资源,把夺得的资源再分配给涉及死锁的进程直至死锁解除。
速记
死锁应对有妙招,预防避免要记牢。
互斥打破难改造,占等释放先抛掉。
非抢允许来剥夺,循环排序别乱搞。
资源编号有诀窍,大的莫把小的超。
分配预测避烦恼,检测机构把锁找。
定时程序来扫描,发现死锁快除掉。
解除方法真不少,重启撤销有损耗。
逐个撤销资源要,抢占分配解困扰。
操作系统内存管理
4,操作系统的内存管理主要是做什么?
- 内存空间的分配与回收:由操作系统完成主存储器空间的分配和管理,使程序员可以专注于编程,而不必担心存储分配的问题,从而提高编程效率。(malloc 函数:申请内存,free 函数:释放内存)
- 地址转换:在多道程序环境下,由于程序中的逻辑地址与内存中的物理地址可能不一致,因此存储管理需要提供地址变换功能,将逻辑地址转换成相应的物理地址。
- 内存保护:保证各道作业在各自的存储空间内运行,互不干扰。同时,充分利用内存空间,共享内存中存放的信息。
速记
内存管理有高招,分配回收效率超。 malloc 申请 free 抛,编程不必愁分毫。 多道程序地址飘,逻辑物理要对牢。 地址转换不能少,存储变换真奇妙。 内存保护很重要,作业互不来干扰。 空间共享充分搞,存储管理呱呱叫。
5,操作系统的内存管理机制了解吗?内存管理有哪几种方式?
简单分为连续分配管理方式和非连续分配管理方式这两种。连续分配管理方式是指为一个用户程序分配一个连续的内存空间,常见的如 块式管理。同样地,非连续分配管理方式允许一个程序使用的内存分布在离散或者说不相邻的内存中,常见的如 页式管理 和 段式管理。
块式管理: 将内存分为几个固定大小的块,每个块中只包含一个进程。如果程序运行需要内存的话,操作系统就分配给它一块,如果程序运行只需要很小的空间的话,分配的这块内存很大一部分几乎被浪费了。这些在每个块中未被利用的空间,我们称之为碎片。
页式管理:把主存分为大小相等且固定的一页一页的形式,页较小,相比于块式管理的划分粒度更小,提高了内存利用率,减少了碎片。页式管理通过页表对应逻辑地址和物理地址。
段式管理: 页式管理虽然提高了内存利用率,但是页式管理其中的页并无任何实际意义。 段式管理把主存分为一段段的,段是有实际意义的,每个段定义了一组逻辑信息,例如,有主程序段 MAIN、子程序段 X、数据段 D 及栈段 S 等。 段式管理通过段表对应逻辑地址和物理地址。一个程序片断可能会被分为几十段,这样很多时间就会被浪费在计算每一段的物理地址上。
段页式管理:结合了段式管理和页式管理的优点。将程序分成若干段,每个段分成若干页。段页式管理每取一数据,要访问3次内存。
速记
内存分配分两类,连续非连各有规。
连续分配块式随,整块分配易生碎。
非连页段来搭配,页式碎片能消退。
页表映射地址对,粒度更小效率倍。
段式分段有意义,逻辑信息来归类。
段表对应地址推,分段太多时间费。
段页结合优点汇,先段后页三重内。
6,什么是页表,为什么要有?
参考回答
页表是虚拟内存的概念。操作系统虚拟内存到物理内存的映射表,就被称为页表。
原因:不可能每一个虚拟内存的 Byte 都对应到物理内存的地址。这张表将大得真正的物理地址也放不下,于是操作系统引入了页(Page)的概念。进行分页,这样可以减小虚拟内存页对应物理内存页的映射表大小。
速记
页表虚拟内存念,虚实映射表来建。
逐字节映不可行,物理难容表太大。
引入分页好办法,映射表小效率佳。
7,简述操作系统中的缺页中断。
参考回答
缺页异常:malloc和mmap函数在分配内存时只是建立了进程虚拟地址空间,并没有分配虚拟内存对应的物理内存。当进程访问这些没有建立映射关系的虚拟内存时,处理器自动触发一个缺页异常,引发缺页中断。
缺页中断:缺页异常后将产生一个缺页中断,此时操作系统会根据页表中的外存地址在外存中找到所缺的一页,将其调入内存。
速记
malloc、mmap来分配,虚拟空间先就位。
物理内存未配对,访问触发缺页会。
缺页异常引中断,外存找页调入内。
8,快表和多级页表
在分页内存管理中,很重要的两点是:
虚拟地址到物理地址的转换要快。
解决虚拟地址空间大,页表也会很大的问题。
(1)快表
为了提高虚拟地址到物理地址的转换速度,操作系统在 页表方案 基础之上引入了 快表 来加速虚拟地址到物理地址的转换。我们可以把快表理解为一种特殊的 高速缓冲存储器(Cache),其中的内容是页表的一部分或者全部内容。作为页表的 Cache,它的作用与页表相似,但是提高了 访问速率。由于采用页表做地址转换,读写内存数据时 CPU 要访问 两次主存。有了快表,有时只要访问一次高速缓冲存储器,一次主存,这样可加速查找并提高 指令执行速度。
(2)多级页表
引入多级页表的主要目的是为了避免把全部页表一直放在内存中占用过多空间,特别是那些根本就不需要的页表就不需要保留在内存中。多级页表属于时间换空间的典型场景。
速记
分页管理两要点,转换要快表要减。
快表引入加速转,高速缓存来帮忙。
访问次数能减少,执行速度往上蹿。
多级页表来救场,内存空间省着占。
时间换空策略妙,按需存表真灵验。
9,地址变换中,有快表和没快表,有什么区别?
在没有快表的情况下,一个虚拟地址要转换成物理地址需要至少两次访问物理内存。第一次是查询内存中的页表,第二次是访问物理页框。这种转换过程相对复杂,需要花费较多的时间。
而在有快表的情况下,地址变换过程会大大加快。快表是一种高速缓冲存储器,用来存放页表项。当目标页表项存储在快表中时,通过快表访问页表会比在内存中访问页表快很多,有利于缩短从一个虚拟地址转换成一个物理地址的过程的时间。这样,即使在内存中的页表项被更换掉,也可以通过快表迅速找到对应的页表项,大大提高了地址转换的效率和速度。
速记
快表缺时转地址,两次访存费精力。
先查页表再寻框,过程复杂时间长。
快表有时效率高,高速缓存存表条。
快表命中速度妙,地址转换时间少。
10,分页机制和分段机制有哪些共同点和区别呢?
分页机制 和 分段机制 都是为了提高 内存利用率,减少 内存碎片,但它们在 内存管理 中的实现方式和使用场景有所不同。
共同点:
- 分页机制 和 分段机制 都是 离散分配内存 的方式,每个 页面 和 段 都是离散存储的,所以它们都可以有效减少 内存碎片。
- 分页机制 和 分段机制 都是为了满足 操作系统内存管理 的需求。
区别:
- 地址空间:分页机制 的地址空间是连续的,而 分段机制 的地址空间是不连续的。
- 大小:页 的大小是固定的,由 操作系统 决定;而 段 的大小不固定,取决于我们当前运行的 程序。
- 存储内容:分页 仅仅是为了满足 操作系统内存管理 的需求,而 段 是 逻辑信息 的单位,在程序中可以体现为 代码段、数据段 等,能够更好满足 用户 的需要。
- 可见性:分页 对 程序员 是不可见的;分段 对 程序员 是可见的,分段 为组织 程序 和 数据 提供了方便。
- 处理方式:在 分页系统 中,物理内存 被分为大小相等的 页面,操作系统 按照 页面大小 来分配内存并管理 内存地址。而在 分段系统 中,将 程序 的 逻辑地址空间 按照功能或类别分为多个 段,每个 段 的大小不固定,并且每个 段 都有自己的 名称、权限 等信息。
- 存储效率:分页系统 中的 页面 通常是固定大小的,因此可以在 内存 中存储更多的 页面。而 分段系统 中的 段 大小不固定,因此可能无法充分利用 内存空间。
- 保护机制:分段系统 可以提供更好的 保护机制。例如,每个 段 都有自己的 访问权限 和 保护标志,可以防止 用户程序 访问 操作系统敏感数据 或其他 用户 的敏感数据。而 分页系统 通常只提供简单的 保护机制,例如只允许访问自己的 内存页。
- 内存管理开销:分段系统 的 内存管理开销 相对较大。因为每个 段 的大小不固定,所以需要在 内存 中维护多个 段表,这会增加 系统 的开销。而 分页系统 的 内存管理开销 相对较小,因为 页面大小 固定,系统 只需要维护一个 页表 即可。
- 硬件支持:分段系统 比 分页系统 需要更多的 硬件支持,因为 段表 需要在 内存 中进行维护和更新,需要占用更多的 内存空间。而 分页系统 对 硬件要求 较低,可以在较小的 内存空间 中实现 内存管理。
综上所述,分页机制 和 分段机制 各有其优缺点,在选择使用时需要根据 实际情况 进行权衡。
速记
分页分段目的同,提效减碎立奇功。
离散分配降碎片,内存管理需求融。
两者区别要认清,地址空间分连零。
页定段变随程序,存储内容各有凭。
分页对咱不可见,分段组织便编程。
处理方式各不同,存储效率有劣优。
分段保护更周全,管理开销却不浅。
硬件支持也较多,分页要求则轻便。
优劣并存细权衡,实际场景来定选。
逻辑地址与虚拟地址
11,逻辑(虚拟)地址和物理地址
指针里面存储的数值就可以理解成为内存里的一个地址,这个地址也就是我们说的逻辑地址,逻辑地址由操作系统决定。物理地址指的是真实物理内存中地址,更具体一点来说就是内存地址寄存器中的地址。物理地址是内存单元真正的地址。
速记
指针数值是地址,逻辑地址系统定。
物理地址真内存,寄存器中藏身影。
12,CPU 寻址了解吗?为什么需要虚拟地址空间?
CPU寻址 是计算机程序运行中的重要环节,它是指CPU根据指令中的地址,从内存中获取需要处理的数据,或将处理结果存回内存的过程。
为什么需要 虚拟地址空间?这是由于在传统的 直接寻址方式 下,程序直接访问和操作的都是 物理内存,这会带来一些问题。首先,这种方式容易造成 操作系统崩溃,因为用户可以访问任意的 内存地址,可能会破坏操作系统的正常运行。其次,想要同时运行多个程序特别困难,因为每个程序都直接操作 物理内存,一个程序的错误操作可能会影响到其他程序的运行。
因此,通过引入 虚拟寻址,CPU可以将 虚拟地址 转换成 物理地址,从而实现对真实 物理内存 的访问。虚拟地址空间 的优点有:
- 程序可以使用一系列相邻的 虚拟地址 来访问 物理内存 中不相邻的大 内存缓冲区。
- 不同进程 使用的 虚拟地址 彼此隔离,一个进程中的代码无法更改由另一进程使用的 物理内存。这不仅保护了每个进程的 内存空间,也提高了 内存 的使用效率。
- 当 物理内存 的供应量变小时,内存管理器 会将 物理内存页 保存到 磁盘文件,从而实现对 内存 的动态管理。
综上,虚拟地址空间 在提高程序的 隔离性、内存使用效率 以及实现 多任务运行 等方面都具有重要作用。
速记
CPU寻址很关键,指令寻址数据搬。
传统直寻问题现,系统崩溃多不便。
多程运行也困难,错误操作互牵连。
虚拟寻址来救场,虚实转换保安全。
相邻虚址访大缓,进程隔离效率添。
内存不足盘来援,动态管理功能全。
隔离高效多任务,虚拟空间不简单。
13,通过虚拟地址访问内存有以下优势:
// ... existing code ...
程序 可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区。
程序 可以使用一系列 虚拟地址 来访问大于可用 物理内存 的 内存缓冲区。当 物理内存 的供应量变小时,内存管理器 会将 物理内存页(通常大小为 4 KB)保存到 磁盘文件。数据或代码页 会根据需要在 物理内存 与 磁盘 之间移动。
不同进程 使用的 虚拟地址 彼此隔离。一个进程 中的代码无法更改正在由 另一进程 或 操作系统 使用的 物理内存。
// ... existing code ...
速记
相邻虚址真奇妙,不邻物存也能找。
虚址访问大缓存,物理不足也能搞。
内存紧张盘来保,四K 页面磁盘跑。
数据代码按需移,进程隔离错不了。
一进莫改他进程,安全高效呱呱叫。
14,虚拟地址到物理地址怎么映射的?
// ... existing code ...
操作系统 为每一个 进程 维护了一个从 虚拟地址 到 物理地址 的映射关系的数据结构,叫 页表。页表 中的每一项都记录了这个 页 的 基地址。
三级页表转换方法:(两步)
逻辑地址 转 线性地址:段起始地址 + 段内偏移地址 = 线性地址
线性地址 转 物理地址:
页目录地址 + 页目录索引 = 页表地址 页表地址 + 页表索引 = 页地址 页地址 + 页内偏移 = 物理地址
// ... existing code ...
速记
系统维护页表忙,虚物映射有保障。
页表每项基址藏,三级转换分两趟。
逻辑线性来转向,段起偏址加一场。
线性物理再变样,目录索引找表详。
表址索引页寻上,页内偏移物理彰。
15,局部性原理表现在以下两个方面:
// ... existing code ...
时间局部性 :如果 程序中的某条指令一旦执行,不久以后该指令可能再次执行;如果 某数据被访问过,不久以后该数据可能再次被访问。产生时间局部性的典型原因,是由于在 程序中存在着大量的循环操作。
空间局部性 :一旦 程序访问了某个存储单元,在不久之后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址,可能集中在一定的范围之内,这是因为 指令通常是顺序存放、顺序执行的,数据也一般是以向量、数组、表等形式簇聚存储的。
// ... existing code ...
速记
时间局部性真妙,指令数据重访早。
循环操作是主因,不久又把它们找。
空间局部性来到,访问单元有诀窍。
附近单元将被瞧,指令数据簇聚好。
顺序存放执行巧,地址集中范围小。
