操作系統複習

1. 併發 & 並行:

  • 併發: 指單核 CPU 同一時刻只有一條指令執行,但很多個進程指令被快速地輪換執行,使得宏觀上具有多個進程同時執行的效果。但微觀上並不是同時執行的,只是在一定的時間片裏,快速交替執行多個進程。
  • 並行: 同一時刻,有多條指令在多個處理器上同時執行。
  • 若系統內只有一個 CPU,對於多線程任務,這些任務不可能真實並行的,因爲一個 CPU 一次只能執行一條指令,這種情況下多線程或者多線程任務就是併發的,而不是並行,操作系統不停地切換任務。真正的併發也只能夠出現在擁有多個 CPU 的系統中(多核CPU)。

2. 進程和線程以及它們的區別

  • 進程: 進程是對運行時程序的封裝,是系統進行資源調度和分配的的基本單位,實現了操作系統的併發;
  • 線程: 線程是進程的子任務,是 CPU 調度和分派的基本單位,用於保證程序的實時性,實現進程內部的併發;線程是操作系統可識別的最小執行和調度單位。每個線程都獨自佔用一個虛擬處理器:獨自的寄存器組,指令計數器和處理器狀態。每個線程完成不同的任務,但是共享同一地址空間(也就是同樣的動態內存,映射文件,目標代碼等等),打開的文件隊列和其他內核資源。
    區別:
  • ①:一個線程只能屬於一個進程,而一個進程可以有多個線程,但至少有一個線程。線程依賴於進程而存在。
  • ②:進程在執行過程中擁有獨立的內存單元,而多個線程共享進程的內存。(資源分配給進程,同一進程的所有線程共享該進程的所有資源。同一進程中的多個線程共享代碼段(代碼和常量),數據段(全局變量和靜態變量),擴展段(堆存儲)。但是每個線程擁有自己的棧段,棧段又叫運行時段,用來存放所有局部變量和臨時變量。)
  • ③:進程是資源分配的最小單位,線程是 CPU 調度的最小單位;
  • ④:系統開銷: 由於在創建或撤消進程時,系統都要爲之分配或回收資源,如內存空間、I/O 設備等。因此,操作系統所付出的開銷將顯著地大於在創建或撤消線程時的開銷。類似地,在進行進程切換時,涉及到整個當前進程 CPU 環境的保存以及新被調度運行的進程的 CPU 環境的設置。而線程切換隻須保存和設置少量寄存器的內容,並不涉及存儲器管理方面的操作。可見,進程切換的開銷也遠大於線程切換的開銷。
  • ⑤:通信:由於同一進程中的多個線程具有相同的地址空間,致使它們之間的同步和通信的實現,也變得比較容易。進程間通信 IPC,線程間可以直接讀寫進程數據段(如全局變量)來進行通信——需要進程同步和互斥手段的輔助,以保證數據的一致性。在有的系統中,線程的切換、同步和通信都無須操作系統內核的干預。
  • ⑥:進程編程調試簡單可靠性高,但是創建銷燬開銷大;線程正相反,開銷小,切換速度快,但是編程調試相對複雜。
  • ⑦:進程間不會相互影響 ;線程一個線程掛掉將導致整個進程掛掉。
  • ⑧:進程適應於多核、多機分佈;線程適用於多核。

3. 進程間通信地方式

  • 進程間通信主要包括管道、系統 IPC(包括消息隊列、信號量、信號、共享內存等)、以及套接字 socket。
  • (1):管道:管道主要包括無名管道和命名管道:管道可用於具有親緣關係的父子進程間的通信,有名管道除了具有管道所具有的功能外,它還允許無親緣關係進程間的通信。
  • (2):系統 IPC (Inter-Process Communication):
  • (3):套接字socket:socket 也是一種進程間通信機制,與其他通信機制不同的是,它可用於不同主機之間的進程通信。

4. 遊戲服務器應該爲每個用戶開闢一個線程還是一個進程,爲什麼?

  • 遊戲服務器應該爲每個用戶開闢一個進程。因爲同一進程間的線程會相互影響,一個線程死掉會影響其他線程,從而導致進程崩潰。因此爲了保證不同用戶之間不會相互影響,應該爲每個用戶開闢一個進程。

5. 死鎖發生的條件以及如何解決死鎖:

  • 死鎖是指兩個或兩個以上進程在執行過程中,因爭奪資源而造成的下相互等待的現象。死鎖發生的四個必要條件如下:
  • ①:互斥條件:進程對所分配到的資源不允許其他進程訪問,若其他進程訪問該資源,只能等待,直至佔有該資源的進程使用完成後釋放該資源;
  • ②:請求和保持條件::進程獲得一定的資源後,又對其他資源發出請求,但是該資源可能被其他進程佔有,此時請求阻塞,但該進程不會釋放自己已經佔有的資源;
  • ③:不可剝奪條件:進程已獲得的資源,在未完成使用之前,不可被剝奪,只能在使用後自己釋放;
  • ④:循環等待條件: 進程發生死鎖後,必然存在一個進程-資源之間的環形鏈。
  • 解決死鎖的方法即破壞上述四個條件之一,主要方法如下:
  • 資源一次性分配,從而剝奪請求和保持條件;
  • 可剝奪資源:即當進程新的資源未得到滿足時,釋放已佔有的資源,從而破壞不可剝奪的條件;
  • 資源有序分配法:系統給每類資源賦予一個序號,每個進程按編號遞增的請求資源,釋放則相反,從而破壞環路等待的條件。

5. 物理和虛擬尋址:

  • 計算機系統的主存被組織成一個有 M 個連續的字節大小的單元組成的數組。每字節都有一個唯一的物理地址(PA)。第一個字節的物理地址爲 0,接下來的字節地址爲 2,依次類推。給定這種簡單的結構,CPU 定位內存的最自然的方式就是使用物理地址。我們把這種方式稱爲物理尋址(physical addressing)。
  • 現代的處理器使用的是一種稱爲虛擬尋址(virtual address)的尋址方式。
  • 使用虛擬地址,CPU 通過生成一個虛擬地址(Virtual Address,VA)來訪問主存,這個虛擬地址在被送到內存之前先轉換成適當的物理地址。將這個虛擬地址轉換成物理地址的任務叫做地址翻譯(address translation)。

6. 虛擬內存以及虛擬內存置換算法:

  • 傳統存儲管理有的一個缺點:很多用不到的數據也會長期地佔用內存,導致內存利用率不高。以及:作業必須一次性全部裝入內存後才能開始運行。這會造成兩個問題:
    • (1)作業很大時,不能全部裝入內存,導致大作業無法運行:(比如大型的遊戲);
    • (2)當大量作業要求運行時,由於內存無法容納所有作業,因此只有少量作業能運行,導致多道程序併發度下降。
  • 可以使用虛擬存儲技術來解決上面的問題,虛擬存儲技術是基於局部性原理提出來的:
    • (1)時間局部性:如果執行了程序中的某條指令,那麼不久後這條指令很有可能再次被執行;如果某個數據被訪問過,不就之後該數據很有可能再次被訪問。(因爲程序中存在大量的循環);
    • (2)空間局部性:一旦程序訪問了某個存戶單元,在不久之後,其附近的存儲單元也很有可能被訪問。(因爲很多數據在內存中都是連續存放的)。
  • 基於局部性原理,在程序裝入時,可以將程序中很快會用到的部分裝入內存,暫時用不到的部分留在外存,就可以讓程序開始執行。在程序執行過程中,當所訪問的信息不在內存時,由操作系統負責將所需信息從外存調入內存,然後繼續執行程序。若內存空間不夠,由操作系統負責將內存中暫時用不到的信息換出到外存。在操作系統的管理下,在用戶看來似乎有一個比實際內存大得多的內存,這就是虛擬內存。
    頁面置換算法:
  • 比較常見的內存替換算法有:FIFO,LRU,LFU,LRU-K,2Q。
  • ①:FIFO(First In First Out:先進先出淘汰算法):
  • FIFO 算法是最早出現的置換算法、該算法總是淘汰最先進入內存的頁面,即選擇在內存中駐留時間最久的頁面給予淘汰。其理由是:最早調入主存的頁面不再被使用的可能性最大。
  • ②:LRU(Least Recently Used:最近最少使用算法):
  • 利用局部性原理,根據一個作業在執行過程中過去的頁面訪問歷史來推測未來的行爲。它認爲過去一段時間裏不曾被訪問過的頁面,在最近的將來可能也不會再被訪問。所以,這種算法的實質是:當需要淘汰一個頁面時,總是選擇在最近一段時間內最久不用的頁面予以淘汰。 即淘汰最近最長時間未訪問過的頁面。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章