面試操作系統八股文五問五答第二期
作者:程序員小白條,個人博客
相信看了本文后,對你的面試是有一定幫助的!
?點贊?收藏?不迷路!?
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指令重排序的好處?
●提高并行性:現代處理器通常具有多個功能單元,可以執行多個指令,指令重排序可以使處理器更好地利用這些功能單元,從而提高并行性和整體性能。
●減少空閑周期:指令重排序可以減少處理器在等待某些操作完成時的空閑周期。例如,如果某個指令需要等待內存數據加載,處理器可以在等待時執行其他無依賴的指令,從而減少了空閑時間。
●提高分支預測準確性:指令重排序可以改善分支預測的準確性。處理器可以在分支預測錯誤時丟棄已經被重排序的指令,從而減少性能下降。
●提高內存層次的利用:指令重排序可以更好地利用處理器的高速緩存。通過重新排列指令以最大限度地減少緩存未命中,可以提高內存層次結構的效率。
●降低數據冒險的影響:數據冒險是一種因為數據相關性而導致指令無法立即執行的情況。指令重排序可以通過提前執行無數據相關性的指令來減輕數據冒險的影響。
●提高指令級并行性:指令重排序有助于充分利用指令級并行性,即處理器可以同時執行多條指令,而不必等待前一條指令的完成。