操作系統常見面試題


參考:

多進程和多線程的區別是什么?多進程和多線程的優缺點分析

協程與線程的區別

進程、線程和協程之間的區別和聯系

1、操作系統的四個特性

並發:同一段時間內多個程序執行(與並行區分,並行指的是同一時刻有多個事件,多處理器系統可以使程序並行執行)

共享:系統中的資源可以被內存中多個並發執行的進線程共同使用

虛擬:通過分時復用(如分時系統)以及空分復用(如虛擬內存)技術把一個物理實體虛擬為多個

異步:系統進程用一種走走停停的方式執行,(並不是一下子走完),進程什么時候以怎樣的速度向前推進是不可預知的

2、多線程相較單線程的好處

1、並發提升程序執行效率 
2、提升CPU利用率,訪存的時候可以切換線程來執行
3. 更快的響應速度,可以有專門的線程來監聽用戶請求和專門的線程來處理請求。比如監聽線程和工作線程是兩個線程,這樣監聽就負責監聽,工作的就負責工作,監聽到用戶請求馬上把請求轉到工作線程去處理,監聽線程繼續監聽

3、使用多線程的可能帶來的問題

內存泄漏、上下文切換、死鎖還有受限於硬件和軟件的資源閑置問題。線程崩潰可能導致整個進程崩潰

4、知道多線程和多進程的區別嗎?各自有什么優點呢

在引入線程的操作系統中,通常都是把進程作為分配資源的基本單位,而把線程作為獨立運行和獨立調度的基本單位。

多進程優點:

  1、每個進程互相獨立,不影響主程序的穩定性,子進程崩潰沒關系;

  2、通過增加CPU,可以容易得擴充性能;

  3、可以盡量減少線程加鎖/解鎖操作,極大提高性能,就算是線程運行的模塊算法效率低也沒關系;

多進程缺點:

  1、邏輯控制復雜,需要和主程序交互;

  2、多進程調度開銷比較大,需要跨進程邊界,如果有大數據量傳送,就不太好,適合小數據量傳送、密集運算 ;

多線程的優點:

  1、程序邏輯和控制方式簡單;

  2、擁有資源少,線程調度開銷小,無需跨進程邊界;

  3、同一個進程的所有線程可以直接共享內存和變量

       4、因為cpu調度的粒度更細,所以cpu利用率更高

多線程缺點:

  1、線程之間的同步和加鎖控制比較麻煩;

  2、一個線程的崩潰可能影響到整個程序的穩定性;因為線程沒有地址空間,它只是一個進程的執行路徑,進程是比較健壯的。

  3、到達一定的線程數程度后,即使再增加CPU也無法提高性能,,而且線程多了之后線程本身的調度也需要消耗較多的CPU

進程和線程的區別:

1. 基本單位:進程是分配資源的基本單位,而線程是獨立運行和獨立調度的基本單位。也就是說 進程不能執行,真正執行的是進程里的線程。

2. 健壯性:進程有獨立的地址空間,有獨立的資源,子進程崩潰不會對主進程造成影響;而線程沒有自己的地址空間,只是進程的一個執行路徑,所以一個線程的崩潰可能會影響整個進程的穩定性。

3. 調度開銷:進程因為擁有的資源多,所以調度開銷大,線程的調度開銷小。

5、線程與協程的區別

協程

協程是一種用戶態的輕量級線程, 協程不是由操作系統內核管理 ,而是完全由用戶程序所控制, 這樣帶來的好處就是性能得到了很大的提升,不會像線程切換那樣消耗資源。 協程可以理解為可以暫停執行的函數。它擁有自己的寄存器上下文和棧。協程調度切換時,將寄存器上下文和棧保存到其他地方,在切回來的時候,恢復先前保存的寄存器上下文和棧,直接操作棧則基本沒有內核切換的開銷,可以不加鎖的訪問全局變量,所以上下文的切換非常快。

線程和協程的區別:

1、線程是搶占式,而協程是非搶占式的,所以需要用戶自己釋放使用權來切換到其他協程,因此同一時間其實只有一個協程擁有運行權,相當於單線程的能力。
2、線程是協程的資源。協程通過 可以關聯任意線程或線程池的執行器(Interceptor)來間接使用線程的資源的。

協程相較於多線程的優勢:

1.因為協程這個子程序切換不是線程切換,而是由程序自身控制,因此沒有線程切換的開銷
2.    極高的執行效率:因為只有一個線程,也不存在同時寫變量沖突,在控制共享資源時就不需加鎖,所以執行效率比多線程高很多。

6、什么是死鎖,產生死鎖的四個條件,怎么避免死鎖

一個進程集合中的每一個進程都在等待只能由該集合中的其他進程才能引發的事件,那么該組進程進入死鎖狀態。由於集合中的每一個進程都在等待集合中的另一個進程釋放資源,但由於它們都已經處於等待狀態而無法執行,所以它們誰也不會釋放資源,結果是這組進程都將無法再繼續向前推進。

四個條件:

  • 互斥條件:該資源任意一個時刻只由一個線程占用。
  • 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
  • 不剝奪條件:線程已獲得的資源在末使用完之前不能被其他線程強行剝奪,只有自己使用完畢后才釋放資源。
  • 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系

如何避免:

我們只要破壞產生死鎖的四個條件中的其中一個就可以了。

破壞互斥條件

這個條件我們沒有辦法破壞,因為我們用鎖本來就是想讓他們互斥的(臨界資源需要互斥訪問)。

破壞請求與保持條件

一次性申請所有的資源。

破壞不剝奪條件(Synchronized無法破壞這個條件,所以引入了ReetrantLock)

占用部分資源的線程進一步申請其他資源時,如果申請不到,可以主動釋放它占有的資源。

破壞循環等待條件

靠按序申請資源來預防。按某一順序申請資源,釋放資源則反序釋放。破壞循環等待條件。

7、虛擬內存+內存分頁

虛擬內存

虛擬存儲器就是具有請求調入功能,能從邏輯上對內存容量加以擴充的一種存儲器系統,虛擬內存有多次性,對換性和虛擬性三個特征,它可以將程序分多次調入內存,使得在較小的用戶空間可以執行較大的用戶程序,所以同時容納更多的進程並發執行,從而提高系統的吞吐量。發生缺頁時可以調入一個段也可以調入一個頁,取決於內存的存儲管理方式。虛擬性表示虛擬內存和物理內存的映射
    Linux下,進程不能直接讀寫內存物理地址,只能訪問【虛擬內存地址】
    操作系統會把 虛擬內存地址-->物理地址
    
    虛擬內存解決
        有限的內存空間加載較大的應用程序
        根據需要在內存和磁盤之間來回傳送數據
    
    通過段頁表的形式,虛擬內存中取一段連續的內存空間映射到主內存中,主內存空間的程序段可以不連續

缺頁異常

    進程在訪問某個虛擬內存地址時,
    操作系統翻譯虛擬內存地址兩種{
        1. 沒有缺頁,獲取到內存物理地址
        2. 磁盤,發生缺頁異常。
            進程中斷,讀取磁盤內的對應頁進入內存。進程進入就緒狀態
    }

內存分頁

若按照【字節】為單位,進行 虛擬內存和物理內存的映射,【內存空間不足以存儲這么多映射關系】

因此linux提出【內存分頁】,以每頁4kb為單位進行映射
使得內存中的記錄變為原先的四千分之一

虛擬內存地址{
    1. 前20位 【頁編號】
    2. 后12位 【偏移量】
} 

8、基本分頁儲存管理方式

把主存空間划分為大小相等且固定的頁,作為主存的基本單位,每個進程也以頁為單位進行划分,進程執行時,以頁為單位逐個申請主存中的葉空間。用頁表記錄分散的內存分布情況。

頁表

用來記錄邏輯地址和實際存儲地址之間的映射關系,以實現從頁號到物理塊號的映射。

訪問分頁系統中內存數據需要兩次內存訪問,一次從內存中訪問頁表,找到實際物理地址,第二次根據得到的物理地址訪問指定的內存塊

邏輯空間->頁表->物理空間

快表機制:

可以說是存儲在寄存器中的頁表,功能和頁表一樣,也是提供一個邏輯地址物理地址的映射關系,但是它的容量更小,查詢速度也更快。所以快表中存儲的是訪問最頻繁的那些頁,訪問內存數據的時候先在快表里查詢,如果查到了就可以直接讀取相應的物理塊號,如果沒找到再訪問頁表,得到物理地址並訪問,同時把該頁表中的該映射項添加到快表中

兩級頁表或多級頁表

9、基本分段儲存管理方式

分段管理:每個段內部連續內存分配,但段與段之間是離散的,因此會用到段表,記錄每段在內存中的起始地址和該段長度。

段表可以放在內存或寄存器中。

10、分頁和分段的比較

頁是信息的物理單位,是出於系統內存利用率的角度提出的離散分配機制;

段是信息的邏輯單位,每個段存儲一段意義完整的信息,是出於用戶角度提出的內存管理機制

頁的大小是固定的,由系統決定;

段的大小是不確定的,由用戶決定

頁面置換算法

為什么要頁面置換:

因為應用程序是分多次裝入內存的,所以運行到一定的時間,一定會發生缺頁。地址映射的過程中,如果頁面中發現要訪問的頁面不在內存中,會產生缺頁中斷。此時操作系統必須在內存里選擇一個頁面把他移出內存,為即將調入的頁面讓出空間。選擇淘汰哪一頁的規則就是頁面置換算法

分類:

最佳置換算法(理想):將當前頁面中在未來最長時間內不會被訪問的頁置換出去

先進先出:淘汰最早調入的頁面

最近最久未使用 LRU每個頁面有一個t來記錄上次頁面被訪問直到現在,每次置換時置換t值最大的頁面(用寄存器或棧實現)

時鍾算法clock(也被稱為最近未使用算法NRU):頁面設置訪問為,將頁面鏈接為一個環形列表,每個頁有一個訪問位0/1, 1表示又一次獲救的機會,下次循環指針指向它時可以免除此次置換,但是會把訪問位置為0, 代表他下次如果碰到循環指針就該被置換了。頁面被訪問的時候訪問位設為1。頁面置換的時候,如果當前指針的訪問位為0,置換,否則將這個值置為0,循環直到遇到訪問位為0的頁面。

改進型Clock算法:在clock算法的基礎上添加一個修改位,優先替換訪問位和修改位都是0的頁面,其次替換訪問位為0修改位為1的頁面。

最少使用算法LFU:設置寄存器記錄頁面被訪問次數,每次置換當前訪問次數最少的

11、操作系統中進程和線程的同步和通信機制

進程的同步機制:臨界區、信號量同步機制、管程同步機制
線程的同步機制:synchronized reentrantLock, volatile
進程通信:信號、管道、FIFO、消息隊列、信號量、共享內存、套接字
線程的通信:wait/notify 、volatile、CountDownLatch、CyclicBarrier

進程間的通信方式

信號:編寫自己的信號響應函數或者調用系統的信號響應函數做出相應的響應
匿名管道(半雙工,讀寫端固定,只能父子進程通信,管道文件內存中)
有名管道(FIFO):(任何進程通信,順序寫入,服務器監視FIFO文件,讀出清除)
消息隊列(異步通信機制,存放在內核中並由消息隊列標識符標識,消息含隊列ID支持隨機讀取,獨立於發送、接收進程 進程終止時消息不清空)
信號量(本質是計數器,實現進程【同步互斥】,PV原子性操作),用來控制多個進程對資源的訪問,它通常作為一種鎖機制。
共享內存區(直接對【內存】讀取,通過信號量實現多線程安全)
socket(創建套接字,然后綁定一個端口,監聽套接字,可以通過網絡連接不同計算機上的進程進行通信)

12、線程有哪些狀態?

操作系統分類:創建,就緒,運行,阻塞,結束
Java分類:創建,運行,阻塞,限期等待,非限期等待,結束

13、Java 中用到的線程調度

搶占式調度:

搶占式調度指的是每條線程執行的時間、線程的切換都由系統控制,不由線程本身決定,所以 一個線程的堵塞不會導致整個進程堵塞。

協同式調度:

線程的執行時間由線程本身控制,線程把自己的工作執行完了之后,主動通知系統切換到另一個線程去。有點是實現簡單,缺點是可能導致整個系統崩潰。

JVM 的線程調度實現(搶占式調度)

java 使用的線程調使用搶占式調度,Java 中線程會按優先級分配 CPU 時間片運行,且優先級越高 越優先執行,但優先級高並不代表能獨自占用執行時間片,可能是優先級高得到越多的執行時間 片,反之,優先級低的分到的執行時間少但不會分配不到執行時間。

14、進程調度的算法

先來先服務、短作業優先;優先權(搶占式,非搶占式、高響應比);時間片輪轉、多級反饋隊列

優先級調度算法

1. 先來先服務調度算法(FCFS)
就緒隊列
2. 短作業(進程)優先調度算法

高優先權優先調度算法

1. 非搶占式優先權算法
2. 搶占式優先權調度算法
3.高響應比優先調度算法
(1) 如果作業的等待時間相同,則要求服務的時間愈短,其優先權愈高,因而該算法有利於
短作業。
(2) 當要求服務的時間相同時,作業的優先權決定於其等待時間,等待時間愈長,其優先權
愈高,因而它實現的是先來先服務

基於時間片的輪轉調度算法

多級反饋隊列調度算法

15、用戶態和核心態

內核態:cpu可以訪問內存的所有數據,包括外圍設備,例如硬盤,網卡,cpu也可以將自己從一個程序切換到另一個程序。

用戶態:只能受限的訪問內存,且不允許訪問外圍設備,占用cpu的能力被剝奪,cpu資源可以被其他程序獲取。

最大的區別就是權限不同,在運行在用戶態下的程序不能直接訪問操作系統內核數據結構和程序。

    指令分為 特權指令和非特權指令
    其中 特權指令必須在核心態執行,如 啟動IO /內存清零 /修改程序狀態字
        內核速度快但是資源有限,能控制的進程數不多,所以需要速度少慢一些的用戶態協助
        內核調度、非內核調度

為什么要有這兩態:

內核速度快但是資源有限,能控制的進程數不多,所以需要速度慢一些的用戶態協助,但是為了避免用戶態被惡意利用,所以限制了用戶態程序的權限。

需要限制不同的程序之間的訪問能力,防止他們獲取別的程序的內存數據,或者獲取外圍設備的數據,並發送到網絡,CPU划分出兩個權限等級 -- 用戶態和內核態。

什么時候轉換

1、系統調用

用戶進程主動發起的。用戶態進程通過系統調用申請使用操作系統提供的服務程序完成工作,比如fork()就是執行一個創建新進程的系統調用

用戶程序使用系統調用,系統調用會轉換為內核態並調用操作系統

2、發生異常

會從當前運行進程切換到處理次此異常的內核相關程序中

3、外圍設備的中斷:
所有程序都運行在用戶態,但在從硬盤讀取數據、或從鍵盤輸入時,這些事情只有操作系統能做,程序需要向操作系統請求以程序的名義來執行這些操作。這個時候用戶態程序切換到內核態。

用戶接口程序(GUIshell

GUIGraphical User Interface,圖形用戶界面,帶有圖形界面的操作系統;基於文本、命令行的叫shell,處於用戶態中,位於用戶態的最底層,允許用戶運行其他程序(而操作系統運行在內核態中)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM