你們好,我是 Guide 哥!不少讀者抱怨計算操做系統的知識點比較繁雜,本身也沒有多少耐心去看,可是面試的時候又常常會遇到。因此,我帶着我整理好的操做系統的常見問題來啦!這篇文章總結了一些我以爲比較重要的操做系統相關的問題好比進程管理、內存管理、虛擬內存等等。html
文章形式經過大部分比較喜歡的面試官和求職者之間的對話形式展開。另外,Guide 哥也只是在大學的時候學習過操做系統,不過基本都忘了,爲了寫這篇文章這段時間看了不少相關的書籍和博客。若是文中有任何須要補充和完善的地方,你均可以在評論區指出。若是以爲內容不錯的話,不要忘記點個在看哦!java
我我的以爲學好操做系統仍是很是有用的,具體能夠看我昨天在星球分享的一段話:git
<img src="https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/image-20200329145912767.png" height="666"/>github
這篇文章只是對一些操做系統比較重要概念的一個概覽,深刻學習的話,建議你們仍是老老實實地去看書。另外, 這篇文章的不少內容參考了《現代操做系統》第三版這本書,很是感謝。面試
面試官頂着蓬鬆的假髮向我走來,只見他一手拿着厚重的 Thinkpad ,一手提着他那淡黃的長裙。算法
<img src="http://wx4.sinaimg.cn/large/ceeb653ely1gd8wj5evc4j20i00n0dh0.jpg" height="300"></img>編程
👨💻面試官 : 先來個簡單問題吧!什麼是操做系統?windows
🙋 我 :我經過如下四點向您介紹一下什麼是操做系統吧!數組
關於內核多插一嘴:內核負責管理系統的進程、內存、設備驅動程序、文件和網絡系統等等,決定着系統的性能和穩定性。是鏈接應用程序和硬件的橋樑。
內核就是操做系統背後黑盒的核心。
👨💻面試官 :什麼是系統調用呢? 能不能詳細介紹一下。緩存
🙋 我 :介紹系統調用以前,咱們先來了解一下用戶態和系統態。
<img src="http://ww4.sinaimg.cn/large/006r3PQBjw1fbimb5c3srj30b40b40t9.jpg" height="200" width="2"/>
根據進程訪問資源的特色,咱們能夠把進程在系統上的運行分爲兩個級別:
說了用戶態和系統態以後,那麼什麼是系統調用呢?
咱們運行的程序基本都是運行在用戶態,若是咱們調用操做系統提供的系統態級別的子功能咋辦呢?那就須要系統調用了!
也就是說在咱們運行的用戶程序中,凡是與系統態級別的資源有關的操做(如文件管理、進程控制、內存管理等),都必須經過系統調用方式向操做系統提出服務請求,並由操做系統代爲完成。
這些系統調用按功能大體可分爲以下幾類:
👨💻面試官: 好的!我明白了!那你再說一下: 進程和線程的區別。
🙋 我: 好的! 下圖是 Java 內存區域,咱們從 JVM 的角度來講一下線程和進程之間的關係吧!
若是你對 Java 內存區域 (運行時數據區) 這部分知識不太瞭解的話能夠閱讀一下這篇文章: 《多是把 Java 內存區域講的最清楚的一篇文章》>)
從上圖能夠看出:一個進程中能夠有多個線程,多個線程共享進程的堆和方法區 (JDK1.8 以後的元空間)資源,可是每一個線程有本身的程序計數器、虛擬機棧 和 本地方法棧。
總結: 線程是進程劃分紅的更小的運行單位,一個進程在其執行的過程當中能夠產生多個線程。線程和進程最大的不一樣在於基本上各進程是獨立的,而各線程則不必定,由於同一進程中的線程極有可能會相互影響。線程執行開銷小,但不利於資源的管理和保護;而進程正相反。
👨💻面試官 : 那你再說說進程有哪幾種狀態?
🙋 我 :咱們通常把進程大體分爲 5 種狀態,這一點和線程很像!
👨💻面試官 :進程間的通訊常見的的有哪幾種方式呢?
🙋 我 :大概有 7 種常見的進程間的通訊方式。
下面這部分總結參考了: 《進程間通訊 IPC (InterProcess Communication)》 這篇文章,推薦閱讀,總結的很是不錯。
👨💻面試官 :那線程間的同步的方式有哪些呢?
🙋 我 :線程同步是兩個或多個共享關鍵資源的線程的併發執行。應該同步線程以免關鍵的資源使用衝突。操做系統通常有下面三種線程同步的方式:
👨💻面試官 :你知道操做系統中進程的調度算法有哪些嗎?
🙋 我 :嗯嗯!這個咱們大學的時候學過,是一個很重要的知識點!
爲了肯定首先執行哪一個進程以及最後執行哪一個進程以實現最大 CPU 利用率,計算機科學家已經定義了一些算法,它們是:
👨💻 面試官: 操做系統的內存管理主要是作什麼?
🙋 我: 操做系統的內存管理主要負責內存的分配與回收(malloc 函數:申請內存,free 函數:釋放內存),另外地址轉換也就是將邏輯地址轉換成相應的物理地址等功能也是操做系統內存管理作的事情。
👨💻 面試官: 操做系統的內存管理機制瞭解嗎?內存管理有哪幾種方式?
🙋 我: 這個在學習操做系統的時候有了解過。
簡單分爲連續分配管理方式和非連續分配管理方式這兩種。連續分配管理方式是指爲一個用戶程序分配一個連續的內存空間,常見的如 塊式管理 。一樣地,非連續分配管理方式容許一個程序使用的內存分佈在離散或者說不相鄰的內存中,常見的如頁式管理 和 段式管理。
👨💻面試官 : 回答的還不錯!不過漏掉了一個很重要的 段頁式管理機制 。段頁式管理機制結合了段式管理和頁式管理的優勢。簡單來講段頁式管理機制就是把主存先分紅若干段,每一個段又分紅若干頁,也就是說 段頁式管理機制 中段與段之間以及段的內部的都是離散的。
🙋 我 :謝謝面試官!剛剛把這個給忘記了~
<img src="http://ww4.sinaimg.cn/large/6af89bc8gw1f8txoxc2asj20k00k0mxv.jpg" alt="這就很尷尬了_尷尬表情" height="200" width="200"/>
👨💻面試官 : 頁表管理機制中有兩個很重要的概念:快表和多級頁表,這兩個東西分別解決了頁表管理中很重要的兩個問題。你給我簡單介紹一下吧!
🙋 我 :在分頁內存管理中,很重要的兩點是:
爲了解決虛擬地址到物理地址的轉換速度,操做系統在 頁表方案 基礎之上引入了 快表 來加速虛擬地址到物理地址的轉換。咱們能夠把塊表理解爲一種特殊的高速緩衝存儲器(Cache),其中的內容是頁表的一部分或者所有內容。做爲頁表的 Cache,它的做用與頁表類似,可是提升了訪問速率。因爲採用頁表作地址轉換,讀寫內存數據時 CPU 要訪問兩次主存。有了快表,有時只要訪問一次高速緩衝存儲器,一次主存,這樣可加速查找並提升指令執行速度。
使用快表以後的地址轉換流程是這樣的:
看完了以後你會發現快表和咱們平時常常在咱們開發的系統使用的緩存(好比 Redis)很像,的確是這樣的,操做系統中的不少思想、不少經典的算法,你均可以在咱們平常開發使用的各類工具或者框架中找到它們的影子。
引入多級頁表的主要目的是爲了不把所有頁表一直放在內存中佔用過多空間,特別是那些根本就不須要的頁表就不須要保留在內存中。多級頁表屬於時間換空間的典型場景,具體能夠查看下面這篇文章
爲了提升內存的空間性能,提出了多級頁表的概念;可是提到空間性能是以浪費時間性能爲基礎的,所以爲了補充損失的時間性能,提出了快表(即 TLB)的概念。 不管是快表仍是多級頁表實際上都利用到了程序的局部性原理,局部性原理在後面的虛擬內存這部分會介紹到。
👨💻面試官 : 分頁機制和分段機制有哪些共同點和區別呢?
🙋 我 :
<img src="http://wx3.sinaimg.cn/large/de80a5ably1gcuslckpygg208c08cwfu.gif" height="200" width="200"></img>
共同點 :
區別 :
👨💻面試官 :你剛剛還提到了邏輯地址和物理地址這兩個概念,我不太清楚,你能爲我解釋一下不?
🙋 我: em...好的嘛!咱們編程通常只有可能和邏輯地址打交道,好比在 C 語言中,指針裏面存儲的數值就能夠理解成爲內存裏的一個地址,這個地址也就是咱們說的邏輯地址,邏輯地址由操做系統決定。物理地址指的是真實物理內存中地址,更具體一點來講就是內存地址寄存器中的地址。物理地址是內存單元真正的地址。
👨💻面試官 :CPU 尋址瞭解嗎?爲何須要虛擬地址空間?
🙋 我 :這部分我真不清楚!
<img src="http://wx2.sinaimg.cn/bmiddle/a9cf8ef6ly1fhqpdipcyfj20ce0b4wex.jpg " height="300px" />
因而面試完以後我默默去查閱了相關文檔!留下了沒有技術的淚水。。。
這部份內容參考了 Microsoft 官網的介紹,地址: https://msdn.microsoft.com/zh...
現代處理器使用的是一種稱爲 虛擬尋址(Virtual Addressing) 的尋址方式。使用虛擬尋址,CPU 須要將虛擬地址翻譯成物理地址,這樣才能訪問到真實的物理內存。 實際上完成虛擬地址轉換爲物理地址轉換的硬件是 CPU 中含有一個被稱爲 內存管理單元(Memory Management Unit, MMU) 的硬件。以下圖所示:
爲何要有虛擬地址空間呢?
先從沒有虛擬地址空間的時候提及吧!沒有虛擬地址空間的時候,程序都是直接訪問和操做的都是物理內存 。可是這樣有什麼問題呢?
總結來講:若是直接把物理地址暴露出來的話會帶來嚴重問題,好比可能對操做系統形成傷害以及給同時運行多個程序形成困難。
經過虛擬地址訪問內存有如下優點:
👨💻面試官 :再問你一個常識性的問題!什麼是虛擬內存(Virtual Memory)?
🙋 我 :這個在咱們平時使用電腦特別是 Windows 系統的時候太常見了。不少時候咱們使用點開了不少佔內存的軟件,這些軟件佔用的內存可能已經遠遠超出了咱們電腦自己具備的物理內存。爲何能夠這樣呢? 正是由於 虛擬內存 的存在,經過 虛擬內存 可讓程序能夠擁有超過系統物理內存大小的可用內存空間。另外,虛擬內存爲每一個進程提供了一個一致的、私有的地址空間,它讓每一個進程產生了一種本身在獨享主存的錯覺(每一個進程擁有一片連續完整的內存空間)。這樣會更加有效地管理內存並減小出錯。
虛擬內存是計算機系統內存管理的一種技術,咱們能夠手動設置本身電腦的虛擬內存。不要單純認爲虛擬內存只是「使用硬盤空間來擴展內存「的技術。虛擬內存的重要意義是它定義了一個連續的虛擬地址空間,而且 把內存擴展到硬盤空間。推薦閱讀:《虛擬內存的那點事兒》
維基百科中有幾句話是這樣介紹虛擬內存的。
虛擬內存 使得應用程序認爲它擁有連續的可用的內存(一個連續完整的地址空間),而實際上,它一般是被分隔成多個物理內存碎片,還有部分暫時存儲在外部磁盤存儲器上,在須要時進行數據交換。與沒有使用虛擬內存技術的系統相比,使用這種技術的系統使得大型程序的編寫變得更容易,對真正的物理內存(例如 RAM)的使用也更有效率。目前,大多數操做系統都使用了虛擬內存,如 Windows 家族的「虛擬內存」;Linux 的「交換空間」等。From: https://zh.wikipedia.org/wiki...
👨💻面試官 :要想更好地理解虛擬內存技術,必需要知道計算機中著名的局部性原理。另外,局部性原理既適用於程序結構,也適用於數據結構,是很是重要的一個概念。
🙋 我 :局部性原理是虛擬內存技術的基礎,正是由於程序運行具備局部性原理,才能夠只裝入部分程序到內存就開始運行。
如下內容摘自《計算機操做系統教程》 第 4 章存儲器管理。
早在 1968 年的時候,就有人指出咱們的程序在執行的時候每每呈現局部性規律,也就是說在某個較短的時間段內,程序執行侷限於某一小部分,程序訪問的存儲空間也侷限於某個區域。
局部性原理表如今如下兩個方面:
時間局部性是經過將近來使用的指令和數據保存到高速緩存存儲器中,並使用高速緩存的層次結構實現。空間局部性一般是使用較大的高速緩存,並將預取機制集成到高速緩存控制邏輯中實現。虛擬內存技術實際上就是創建了 「內存一外存」的兩級存儲器的結構,利用局部性原理實現髙速緩存。
👨💻面試官 :都說了虛擬內存了。你再講講虛擬存儲器把!
🙋 我 :
這部份內容來自: 王道考研操做系統知識點整理。
基於局部性原理,在程序裝入時,能夠將程序的一部分裝入內存,而將其餘部分留在外存,就能夠啓動程序執行。因爲外存每每比內存大不少,因此咱們運行的軟件的內存大小其實是能夠比計算機系統實際的內存大小大的。在程序執行過程當中,當所訪問的信息不在內存時,由操做系統將所須要的部分調入內存,而後繼續執行程序。另外一方面,操做系統將內存中暫時不使用的內容換到外存上,從而騰出空間存放將要調入內存的信息。這樣,計算機好像爲用戶提供了一個比實際內存大的多的存儲器——虛擬存儲器。
實際上,我以爲虛擬內存一樣是一種時間換空間的策略,你用 CPU 的計算時間,頁的調入調出花費的時間,換來了一個虛擬的更大的空間來支持程序的運行。不得不感嘆,程序世界幾乎不是時間換空間就是空間換時間。
👨💻面試官 :虛擬內存技術的實現呢?
🙋 我 :虛擬內存的實現須要創建在離散分配的內存管理方式的基礎上。 虛擬內存的實現有如下三種方式:
這裏多說一下?不少人容易搞混請求分頁與分頁存儲管理,二者有何不一樣呢?
請求分頁存儲管理創建在分頁管理之上。他們的根本區別是是否將程序所有所需的所有地址空間都裝入主存,這也是請求分頁存儲管理能夠提供虛擬內存的緣由,咱們在上面已經分析過了。
它們之間的根本區別在因而否將一做業的所有地址空間同時裝入主存。請求分頁存儲管理不要求將做業所有地址空間同時裝入主存。基於這一點,請求分頁存儲管理能夠提供虛存,而分頁存儲管理卻不能提供虛存。
無論是上面那種實現方式,咱們通常都須要:
👨💻面試官 :虛擬內存管理很重要的一個概念就是頁面置換算法。那你說一下 頁面置換算法的做用?常見的頁面置換算法有哪些?
🙋 我 :
這個題目常常做爲筆試題出現,網上已經給出了很不錯的回答,我這裏只是總結整理了一下。
地址映射過程當中,若在頁面中發現所要訪問的頁面不在內存中,則發生缺頁中斷 。
缺頁中斷 就是要訪問的 頁不在主存,須要操做系統將其調入主存後再進行訪問。 在這個時候,被內存映射的文件實際上成了一個分頁交換文件。
當發生缺頁中斷時,若是當前內存中並無空閒的頁面,操做系統就必須在內存選擇一個頁面將其移出內存,以便爲即將調入的頁面讓出空間。用來選擇淘汰哪一頁的規則叫作頁面置換算法,咱們能夠把頁面置換算法當作是淘汰頁面的規則。
做者介紹: Github 70k Star 項目 JavaGuide(公衆號同名) 做者。每週都會在公衆號更新一些本身原創乾貨。公衆hao後臺回覆「1」領取Java工程師必備學習資料+面試突擊pdf。