面试操作系统八股文五问五答第二期

2023-12-13 05:17:01

面试操作系统八股文五问五答第二期

作者:程序员小白条个人博客

相信看了本文后,对你的面试是有一定帮助的!

?点赞?收藏?不迷路!?

1.怎么解决死锁?

1、预防死锁:通过设置一些限制条件,去破坏产生死锁的必要条件(四个条件)

2、避免死锁:在资源分配过程中,使用某种方法避免系统进入不安全的状态,从而避免发生死锁(银行家算法)

3、检测死锁:允许死锁的发生,但是通过系统的检测之后,采取一些措施,将死锁清除掉

4、解除死锁:该方法与检测死锁配合使用

2.JMM内存模型?

Java 内存模型(JMM) 抽象了线程和主内存之间的关系,就比如说线程之间的共享变量必须存储在主内存中。

在 JDK1.2 之前,Java 的内存模型实现总是从 主存 (即共享内存)读取变量,是不需要进行特别的注意的。而在当前的 Java 内存模型下,线程可以把变量保存 本地内存 (比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致。

什么是主内存?什么是本地内存?

●主内存:所有线程创建的实例对象都存放在主内存中,不管该实例对象是成员变量,还是局部变量,类信息、常量、静态变量都是放在主内存中。为了获取更好的运行速度,虚拟机及硬件系统可能会让工作内存优先存储于寄存器和高速缓存中。

●本地内存:每个线程都有一个私有的本地内存,本地内存存储了该线程以读 / 写共享变量的副本。每个线程只能操作自己本地内存中的变量,无法直接访问其他线程的本地内存。如果线程间需要通信,必须通过主内存来进行。本地内存是 JMM 抽象出来的一个概念,并不真实存在,它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化。

3.CPU和内存之间的三级缓存有了解吗

为什么要弄一个 CPU 高速缓存呢? 类比我们开发网站后台系统使用的缓存(比如 Redis)是为了解决程序处理速度和访问常规关系型数据库速度不对等的问题。 CPU 缓存则是为了解决 CPU 处理速度和内存处理速度不对等的问题。

我们甚至可以把 内存看作外存的高速缓存,程序运行的时候我们把外存的数据复制到内存,由于内存的处理速度远远高于外存,这样提高了处理速度。

总结:CPU Cache 缓存的是内存数据用于解决 CPU 处理速度和内存不匹配的问题,内存缓存的是硬盘数据用于解决硬盘访问速度过慢的问题。

现代的 CPU Cache 通常分为三层,分别叫 L1,L2,L3 Cache。有些 CPU 可能还有 L4 Cache,这里不做讨论,并不常见

CPU Cache 的工作方式: 先复制一份数据到 CPU Cache 中,当 CPU 需要用到的时候就可以直接从 CPU Cache 中读取数据,当运算完成后,再将运算得到的数据写回 Main Memory 中。但是,这样存在 内存缓存不一致性的问题 !比如我执行一个 i++ 操作的话,如果两个线程同时执行的话,假设两个线程从 CPU Cache 中读取的 i=1,两个线程做了 i++ 运算完之后再写回 Main Memory 之后 i=2,而正确结果应该是 i=3。

CPU 为了解决内存缓存不一致性问题可以通过制定缓存一致协议(比如 MESI 协议open in new window)或者其他手段来解决。 这个缓存一致性协议指的是在 CPU 高速缓存与主内存交互的时候需要遵守的原则和规范。不同的 CPU 中,使用的缓存一致性协议通常也会有所不同。

我们的程序运行在操作系统之上,操作系统屏蔽了底层硬件的操作细节,将各种硬件资源虚拟化。于是,操作系统也就同样需要解决内存缓存不一致性问题。

操作系统通过 内存模型(Memory Model) 定义一系列规范来解决这个问题。无论是 Windows 系统,还是 Linux 系统,它们都有特定的内存模型。

4.多核CPU下,三级缓存对于每个内核来说是共享的吗?那你知道它的数据存储以及指令存储的方式有了解过吗

1.L1缓存:

L1缓存是每个核心(内核)私有的,不与其他核心共享。

通常包括L1数据缓存和L1指令缓存,分别用于数据和指令的快速存取。

2.L2缓存:

L2缓存有时也是每个核心私有的,特别是在一些多核架构中。

在一些多核架构中,L2缓存可能部分共享,这意味着一组核心(例如,两个核心共享一个L2缓存)。

L2缓存通常包括数据和指令缓存。

3.L3缓存:

L3缓存通常是在多核CPU上的共享缓存层,用于在所有核心之间共享数据。

这意味着多个核心可以访问同一个L3缓存,以提供更大的缓存容量和更好的数据共享。

L3缓存通常更大,但速度相对较慢,用于存储和共享较大量的数据。

●数据存储和指令存储的方式通常是硬件设计的一部分,不同的CPU架构可能有不同的实现方式。然而,一般来说,这些缓存存储数据和指令的方式与它们的缓存行(cache lines)相关,缓存行是缓存中的最小数据单元。缓存行通常以块的方式加载到缓存中,这有助于提高数据局部性(data locality),从而加速数据访问。

5.CPU指令重排序的好处?

●提高并行性:现代处理器通常具有多个功能单元,可以执行多个指令,指令重排序可以使处理器更好地利用这些功能单元,从而提高并行性和整体性能。

●减少空闲周期:指令重排序可以减少处理器在等待某些操作完成时的空闲周期。例如,如果某个指令需要等待内存数据加载,处理器可以在等待时执行其他无依赖的指令,从而减少了空闲时间。

●提高分支预测准确性:指令重排序可以改善分支预测的准确性。处理器可以在分支预测错误时丢弃已经被重排序的指令,从而减少性能下降。

●提高内存层次的利用:指令重排序可以更好地利用处理器的高速缓存。通过重新排列指令以最大限度地减少缓存未命中,可以提高内存层次结构的效率。

●降低数据冒险的影响:数据冒险是一种因为数据相关性而导致指令无法立即执行的情况。指令重排序可以通过提前执行无数据相关性的指令来减轻数据冒险的影响。

●提高指令级并行性:指令重排序有助于充分利用指令级并行性,即处理器可以同时执行多条指令,而不必等待前一条指令的完成。

文章来源:https://blog.csdn.net/qq_67358181/article/details/134870923
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。