[知識點梳理PART2] 走心整理的操作系統常見問題集錦

本文爲個人整理學習筆記,不做商用,如果問題,歡迎指正,侵權刪。

參考鏈接:
(1)https://blog.csdn.net/justloveyou_/article/details/78304294
(2)https://blog.csdn.net/weixin_40852935/article/details/104859524
(3)https://blog.csdn.net/xiongluo0628/article/details/81461053
(4)https://blog.csdn.net/youngchang06hpu/article/details/8009947
(5)https://www.cnblogs.com/inception6-lxc/p/9073983.html

NO-1 線程和進程的區別和聯繫

1 定義

  • 進程
    進程是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,是系統進行資源分配和調度的一個獨立單位。(包括程序段,相關數據段和進程控制塊PCB)
  • 線程
    線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與屬於同一個進程的其他進程共享進程所擁有的全部資源。

2 關係

一個線程可以創建和撤銷另一個線程;同一個進程中的多個線程之間可以併發執行。
相對進程而言,線程是一個更加接近於執行體的概念,它可以與同進程中的其他線程共享數據,但擁有自己的棧空間,擁有獨立的執行序列。

3 區別

如果說操作系統引入進程的目的是爲了提高程序併發執行,以提高資源利用率和系統吞吐量。那麼操作系統中引入線程的目的,則是爲了減少進程併發執行過程中所付出的時空開銷,使操作系統能很好的併發執行。

進程process定義了一個執行環境,包括它自己私有的地址空間、一個句柄表,以及一個安全環境;線程則是一個控制流,有他自己的調用棧call stack,記錄了它的執行歷史。

線程由兩個部分組成:
  1)線程的內核對象,操作系統用它來對線程實施管理。內核對象也是系統用來存放線程統計信息的地方。
  2)線程堆棧,它用於維護線程在執行代碼時需要的所有參數和局部變量。當創建線程時,系統創建一個線程內核對象。該線程內核對象不是線程本身,而是操作系統用來管理線程的較小的數據結構。可以將線程內核對象視爲由關於線程的統計信息組成的一個小型數據結構。
在這裏插入圖片描述
進程和線程的主要差別在於它們是不同的操作系統資源管理方式
進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它線程產生影響。

而線程只是一個進程中的不同執行路徑
線程有自己的堆棧和局部變量,但線程之間沒有獨特的地址空間,一個線程死掉就等於整個進程死掉,所以多進程的程序比金線程的程序健壯。

但在進程切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行又要共享某些變量的併發操作,只能用線程,不能用進程。

總結:

  • 進程是對運行時程序的封裝,是系統進行資源調度和分配的基本單位,實現了操作系統的兵法
  • 線程是進程的子任務,是CPU調度和分派的基本單位,用於保證程序的實時性,實現進程內部的併發
  • 一個程序至少有一個進程,一個進程至少有一個線程,線程依賴於進程而存在
  • 進程在執行過程中擁有獨立的內存單元,而多個線程共享進程的內存

從邏輯角度來看,多線程的意義存在於一個應用程序中,有多個執行部分可以同時執行。
但操作系統並沒有將多個線程看作多個獨立的應用,來實現進程的調度和管理以及資源分配。
這就是進程和線程的重要區別。

4 優缺點

線程開銷小,但不利於資源的管理 和保護; 進程與之相反。

NO- 2 進程的常見狀態?以及各種狀態之間的轉換條件?

  • 就緒狀態:進程已處於準備好運行的狀態,即進程已分配到除CPU外的所以必要資源後,只要再獲得CPU,便可立即執行。
  • 運行狀態:進程已獲得CPU,程序正在執行狀態
  • 阻塞狀態:正在執行的進程由於發生某事件(如I/O請求、申請緩衝區失敗等)暫時無法繼續執行的狀態

在這裏插入圖片描述

NO-3 進程間通信有哪些方式?它們的區別?

參考:https://www.cnblogs.com/inception6-lxc/p/9073983.html
進程通信,是指進程之間的信息交換(信息量少則一個狀態或數值,多者則是成千上萬個字節)。因此,對於用信號量進行的進程間的互斥和同步,由於其所交換的信息量少而被歸結爲低級通信。

所謂高級進程通信指:用戶可以利用操作系統所提供的一組通信命令傳送大量數據的一種通信方式。操作系統隱藏了進程通信的實現細節。或者說,通信過程對用戶是透明的。

高級通信機制可歸結爲三大類:

(1)共享存儲器系統(存儲器中劃分的共享存儲區);實際操作中對應的是“剪貼板”(剪貼板實際上是系統維護管理的一塊內存區域)的通信方式,比如舉例如下:word進程按下ctrl+c,在ppt進程按下ctrl+v,即完成了word進程和ppt進程之間的通信,複製時將數據放入到剪貼板,粘貼時從剪貼板中取出數據,然後顯示在ppt窗口上。

(2)消息傳遞系統(進程間的數據交換以消息(message)爲單位,當今最流行的微內核操作系統中,微內核與服務器之間的通信,無一例外地都採用了消息傳遞機制。應用舉例:郵槽(MailSlot)是基於廣播通信體系設計出來的,它採用無連接的不可靠的數據傳輸。郵槽是一種單向通信機制,創建郵槽的服務器進程讀取數據,打開郵槽的客戶機進程寫入數據。

(3)管道通信系統(管道即:連接讀寫進程以實現他們之間通信的共享文件(pipe文件,類似先進先出的隊列,由一個進程寫,另一進程讀))。實際操作中,管道分爲:匿名管道、命名管道。匿名管道是一個未命名的、單向管道,通過父進程和一個子進程之間傳輸數據。匿名管道只能實現本地機器上兩個進程之間的通信,而不能實現跨網絡的通信。命名管道不僅可以在本機上實現兩個進程間的通信,還可以跨網絡實現兩個進程間的通信。

1 七種進程間通信方式

參考:https://blog.csdn.net/xiongluo0628/article/details/81461053
IPC方式:7種

  • 1 管道(pipe):管道是一種半雙工的通信方式,數據只能單向流動,而且只能在有血緣關係的進程間使用,進程的血緣關係是指父子進程關係
  • 2 命名管道(named pipe): 也是半雙工的通信方式,但是它允許無親緣關係進程間的通信
  • 3 信號(signal):信號是一種比較複雜的通信方式,用於通知接收進程某一事件已經發生
  • 4 信號量(semophere):信號量是一個計數器,可用來控制多個進程對共享資源的訪問。它通常作爲一種鎖機制,防止某進程正在訪問共享資源,其它進程也訪問該資源。
    因此,主要作爲進程間以及同一進程內不同線程之間的同步手段。
  • 5 消息隊列(message queue):消息隊列是由消息組成的鏈表,存放在內核中,並由消息隊列標識符標識。消息隊列克服了信號傳遞消息少,緩衝區有限的缺點。
    具有寫權限的進程可以按照一定的規則向消息隊列中添加新消息;對消息隊列有讀權限的進程可以從消息隊列中讀取信息。
  • 6 共享內存(shared memory):** 可以說這是最有用的進程間通信方式。**就是映射一段能被其他進程所訪問的內存,這段內存由一個進程創建,但多個進程都可以訪問,不同進程可以即使看到對方進程中對共享內存中數據的更新。**共享內存是最快的IPC方式。**它是針對其它進程間的通信方式運行效率低而專門設計的。這種方式往往需要依賴某種同步操作,如互斥鎖和信號量等。
  • 7 套接字(socket):這是一種更爲一般的進程間通信機制,它可用於網絡中不同機器之間 的進程間通信,應用非常廣泛。

2 通信方式的比較

  • 管道:速度慢,容量有限
  • 消息隊列:容量受到系統限制,且要注意第一次讀的時候,要考慮上一次沒有讀完數據的問題
  • 信號量:不能傳遞複雜信息,只能用來同步
  • 共享內存:能夠很容易的控制容量,速度快,但要保持同步,比如一個進程在寫的時候,另一個進程要注意讀寫問題,相當於線程中的線程安全。

3 進程同步與互斥的區別

互斥:指某一個資源同時只允許一個訪問者對其進行訪問,具有唯一性和排他性。
但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的

同步:是指在互斥的基礎上(大多數情況下),通過其它機制實現訪問者對資源的有序訪問。
大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的。少數情況是指可以允許多個訪問者同時訪問資源。

同步:體現的是一種協作性
互斥:體現的是排他性

進程同步的主要任務
是對多個相關進程在執行次序上進行協調,以使併發執行的諸進程之間能有效的共享資源和相互合作,從而使程序的執行具有可再現性。

同步機制遵循的原則
(1)空閒讓進
(2)忙則等待
(3)有限等待
(4)讓權等待

進程間同步的主要方法
有原子操作、信號量機制、自旋鎖、管程、會合、分佈式系統等。


NO-4 線程都有哪些狀態?具體是怎麼運行的

線程有:創建、就緒、運行、阻塞、終止 五種狀態。

  • (1) 新生狀態
    在程序中用構造方法(new操作符)創建一個新線程時,如new Thread(r),該線程就是創建狀態,此時它已經有了相應的內存空間和其它資源,但是還沒有開始執行。

  • (2)就緒狀態
    新建線程對象後,調用該線程的start()方法就可以啓動線程。當線程啓動時,線程就進入就緒狀態(runnable)
    由於還沒有分配CPU,線程將進入線程隊列排隊,等待CPU服務,這表明它已經具備了運行條件。
    當系統挑選一個等待執行的Thread對象後,它就會從等待狀態進入執行狀態。系統挑選的動作稱之爲“CPU調度”。
    一旦獲得CPU,線程就進入運行狀態並自動調用自己的run方法。

  • (3)運行狀態
    當就緒狀態的線程被調用並獲得處理器資源時,線程就進入了運行狀態。此時,自動調用該線程對象的run()方法。
    run()方法定義了該線程的操作和功能。運行狀態中的線程執行自己的run方法中的代碼,直到調用其它方法或者發生阻塞而終止。

  • (4)阻塞狀態
    一個正在執行的線程在某些特殊情況下,如被人爲掛起或需要執行耗時的輸入輸出操作時,將讓出CPU並暫時中止自己的執行,進入堵塞狀態。

在可執行狀態下,如果調用sleep()、suspend()、wait()等方法,線程都將進入阻塞狀態。
堵塞時,線程不能進入排隊隊列,只能當引起阻塞的原因被消除後,線程轉入就緒狀態,重新到就緒隊列中排隊等待,這時被CPU調度選中後會從原來停止的位置開始繼續執行。

記住:阻塞被消除後是回到就緒狀態,不是運行狀態。

  • (5)死亡狀態
    線程調用stop()方法,destory()方法或run()方法執行結束後,線程即處於死亡狀態。
    處於死亡狀態的線程不具有繼續運行的能力。可以通過getState()方法來獲取線程當前的狀態。

有的還有個超時等待
處於這種狀態的線程不會被分配CPU執行時間,不過無須無限期的等待被其它線程顯式的喚醒,在達到一定時間之後它們會自動喚醒。

2 線程運行過程

a)調用new關鍵字創建後,進入到新生狀態
b)調用start後進入就緒狀態
c)CPU調度到本線程後,本線程開始執行,進入到運行狀態
d)運行中遇到join,yield,sleep造成阻塞,進入阻塞狀態。阻塞完成後,又回到就緒狀態
e)線程正常執行完,或者遇到異常終止後,進入死亡狀態。

NO-5 線程間的通信機制及其通信方式(線程同步)

1 線程間的通信機制

  • (1)鎖機制:互斥鎖、 條件變量、讀寫鎖
    互斥鎖提供了以排他方式防止數據結構併發修改的方法
    讀寫鎖允許多個線程同時讀共享數據,而對寫操作是互斥的
    條件變量可以以原子的方式進行阻塞進程,直到某個特定條件爲真爲止。對條件的測試是在互斥鎖的保護下進行的。 條件變量始終與互斥鎖一起使用。

  • (2)信號量機制:包括無名信號量和命名線程信號量

  • (3) 信號機制:類似進程間的信號處理

線程間的通信目的主要是用於線程同步,所以線程沒有像進程通信中的用於數據交換的通信機制。

2 線程間通信的方式

線程同步的方式:臨界區、互斥量、信號量、信號(事件)

  • (1) 臨界區:
    通過多線程的串行化來訪問公共資源或一段代碼,速度快,適合控制數據訪問。

-(2)互斥量 Synchronized/Lock
採用互斥對象機制,只有擁有互斥對象的線程纔有訪問公共資源的權限。因爲互斥對象只有一個,所以可以保證公共資源不會被多個線程同時訪問

  • (3)信號量 Semphare
    爲控制具有有限數量的用戶資源而設計的,它允許多個線程多個線程在同一時刻去訪問同一個資源,但一般需要限制同一時刻訪問此資源的最大線程數目。

  • (4)事件(信號),Wait/Notify:
    通過通知操作的方式來保持多線程同步,還可以方便的實現多線程優先級的比較操作

NO-6 操作系統中進程調度策略有哪幾種?

  • (1) 先來先服務(FCFS)(隊列實現,非搶佔的)
    先請求CPU的進程先分配到CPU
    此算法的原則是按照作業到達後備作業隊列(或進程進入就緒隊列)的先後次序選擇作業(或進程)

  • (2)最短作業優先調度算法(SJF:Shortest Process First):
    平均等待時間最短,但難以知道下一個CPU區間長度
    這種算法主要用於作業調度,它從作業後備序列中挑選所需運行時間最短的作業進入主存運行。

  • (3)優先級調度算法(可以是搶佔的,也可以是非搶佔的)
    優先級越高 越先分配到CPU,相同優先級 先到先服務。
    按照進程的優先權大小來調度,使高優先權進程得到優先處理的調度策略稱爲優先權調度算法。注意:優先數越多,優先權越小。

存在的主要問題:低優先級進程無窮等待CPU,會導致無窮阻塞或飢餓
解決方案:老化

  • (4)時間片輪轉調度算法(可搶佔的)
    隊列中沒有進程被分配超過一個時間片的CPU時間,除非它是唯一可運行的進程。如果進程的CPU區間超過了一個時間片,那麼該進程就被搶佔並放回就緒隊列。

當某個進程執行的時間片用完時,調度程序便終止該進程的執行,並將它送到就緒隊列的末尾,等待分配下一時間片再執行。
然後把處理機分配給就緒隊列中新的隊首進程,同時也讓它執行一個時間片。
這樣就可以保證隊列中的所有進程,在已給定的時間內,均能獲得一時間片處理機執行時間。

  • (5) 多級隊列調度算法
    將就緒隊列分成多個獨立的隊列,每個隊列都有自己的調度算法,隊列之間採用固定優先級搶佔調度。
    其中,一個進程根據自身屬性被永久分配到一個隊列中。

  • (6)多級反饋隊列調度算法
    與多級隊列調度算法相比,其允許進程在隊列之間移動;
    若進程使用過多CPU時間,那麼它會被轉移到耕地的優先級隊列;
    在較低優先級隊列等待時間過長的進程會被轉移到更高優先級隊列,以防止飢餓的發生

在這裏插入圖片描述

在這裏插入圖片描述

非搶佔式調度與搶佔式調度
非搶佔式:分派程序一旦把處理機分配給某進程後便讓它一直運行下去,直到進程完成或發生進程調度某事件而阻塞時,才把處理機分配給另一個進程
搶佔式:操作系統將正在運行的進程強制暫停,由調度程序將CPU分配給其它就緒進程的調度方式

NO-7 什麼是死鎖?產生條件?如何避免死鎖?

1 什麼是死鎖?

在兩個或者多個併發過程中,如果每個進程持有某種資源而又等待其它進程釋放它或它們現在保持的資源,在未改變這種狀態之前都不能向前推進,稱這一組進程發生了死鎖。

死鎖產生的原因:系統資源不足, 進程推進順序非法

通俗地講,就是兩個或多個進程無限期的阻塞、相互等待的一種狀態。
在這裏插入圖片描述

2 死鎖產生的四個條件

  • (1)互斥條件
    一個進程每次只能被一個進程使用
    至少有一個資源屬於非共享模式,即一次只能被一個進程使用;若其它申請使用該資源,那麼申請進程必須等到該資源被釋放爲止。

  • (2)非搶佔(不可剝削條件)
    進程不能被搶佔,即資源只能被進程在完成任務後自願釋放
    進程已獲得資源,在未使用完之前,不能被其它進程強制剝奪,只能主動釋放

  • (3)佔有並等待(請求和保持條件)
    一個資源必須至少佔有一個資源,並等待另一個資源,而該資源爲其它進程所佔有
    進程已經保持了至少一個資源,但又提出了新的資源請求,而該資源已被其它進程佔有,此時請求進程被堵塞,但對自己已獲得的資源保持不放

  • (4)循環等待
    若干進程之間形成一種頭尾相接的環形等待資源關係
    即進程集合{p0,p1,p2,p3……pn};p0正在等待p1佔用的資源,p1正在等待p2佔用的資源,pn正在等待p0佔用的資源。

只要上面一個條件不成立,就不會發生死鎖。

3 死鎖處理的基本策略和常用方法

解決死鎖的基本方法主要有:預防死鎖、避免死鎖、檢測死鎖、接觸死鎖、鴕鳥策略等。

(1)死鎖預防

死鎖預防的基本思想是 只要保證死鎖發生的四個必要條件中至少有一個不成立,就能預防死鎖的發生。

具體方法包括:

  • 打破互斥條件
    允許進程同時訪問某些資源。但是,有些資源是不能被多個進程所共享的,這是由資源本身屬性所決定的
    因此,這種辦法通常並無實用價值。

  • 打破佔有並等待條件
    可以實行資源預先分配策略
    (進程在運行前一次性向系統申請它所需要的全部資源,若所需全部資源得不到滿足,則不分配任何資源,此進程暫不運行;
    只有當系統能滿足當前進程所需的全部資源時,才一次性將所申請資源全部分配給該線程)

或者只允許進程在沒有佔用資源時纔可以申請資源
(一個進程可以申請一些資源並使用它們,但是在當前進程申請更多資源之前,它必須全部釋放當前所佔有的資源)

但是這種策略也存在一些缺點:在很多情況下,無法預知一個進程執行前所需的全部資源,因爲進程是動態執行的,不可預知的;同時,會降低資源利用率,導致降低了進程的併發性

  • 打破非搶佔條件
    允許進程強行從佔有者哪裏奪取某些資源。也就是說,當一個進程佔有了一部分資源,在申請新的資源且得不到滿足時,它必須釋放所有佔有的資源以便讓其它線程使用。
    這種預防死鎖的方式實現起來困難,會降低性能。

  • 打破循環等待條件
    實現資源有序分配策略。對所有資源排序編號,所有進程對資源的請求必須嚴格按資源序號遞增的順序提出,
    即只有佔有了小號資源才能申請大號資源,這樣就不會產生環路,預防死鎖的產生。

** (2)死鎖避免的基本思想**

死鎖避免的基本思想是動態的檢測資源分配狀態,以確保循環等待條件不成立,從而確保系統處於安全狀態。
所謂安全狀態是指:如果系統能按某個順序爲每個進程分配資源(不超過其最大值),那麼系統狀態是安全的。
換句話說,如果存在一個安全序列,那麼系統處於安全狀態。
其中,資源分配圖算法應用場景爲每種資源類型只有一個實例(申請邊,分配邊,需求變,不形成環才允許分配),
而銀行家算法應用於每種資源類型可以有多個實例的場景。

(3) 死鎖解除
死鎖解除的常用兩種方法爲進程終止和資源搶佔。

所謂進程終止是指簡單的終止一個或多個以打破循環等待,
包括兩種方式:終止所有死鎖進程和一次只終止一個進程直到取消死鎖循環爲止;

所謂資源搶佔是指從宇哥或多個死鎖進程那裏搶佔一個或多個資源,此時必須考慮三個問題:
a)選擇一個犧牲品
b)回滾:回滾到安全狀態
c)飢餓(在代價因素上加上回滾次數,回滾的越多則越不可能繼續被作爲犧牲品,避免一個進程總是被回滾)


NO-8 Windows下的內存是如何管理的

有三種管理方式

  • 1 虛擬內存
    最適合用來管理大型 對象或結構數組

  • 2 內存映射文件
    最適合用來管理大型數據流(通常來自文件) 以及在單個計算機上運行多個進程之間共享數據

  • 3 內存堆棧
    最適合用來管理大量的小對象

NO-9 虛擬內存?頁面置換算法?

1 內存的發展歷程

沒有內存抽象(單進程,除去操作系統所用的內存之外,全部給用戶程序使用)

有內存抽象(多進程,進程獨立的地址空間,交換技術(內存大小不可能容納下所有併發執行的進程))

連續內存分配(固定大小分區(多道程序的程度受限),可變分區(首次適應,再次適應,最差適應),碎片)

不連續內存分配(分段,分頁,段頁式,虛擬內存)

2 虛擬內存

**定義:**具有請求調入和置換功能,能從邏輯上對內存容量加以擴充的一種存儲器系統。其邏輯容量由內存和外存之和決定。

虛擬內存允許執行進程不必完全在內存中。
虛擬內存的基本思想是:每個進程擁有獨立的地址空間,這個空間被分爲大小相等的多個塊,稱爲頁(Page)。
每個頁都是一段連續的地址,這些頁被映射到物理內存,但是並不是所有的頁都必須在內存中才能運行程序。
當程序引用到一部分在物理內存中的地址空間時,由硬件立刻進行必要的映射;
當程序引用到一部分不在物理內存中的地址空間時,由操作系統負責將缺失的部分裝入物理內存並重新執行失敗的命令。

這樣,對於進程而言,邏輯上似乎有很大的內存空間,實際上其中一部分對應物理內存上的一塊(稱爲幀,通常頁和幀大小相等),還有一些沒家在在內存中的對應在磁盤上。

如下圖所示:

注意:請求分頁系統、請求分段系統和請求頁式系統都是針對虛擬內存的,通過請求實現內存與外存的信息置換。
在這裏插入圖片描述

由上圖可以看出,虛擬內存實際上比物理內存大。
當訪問虛擬內存時,會訪問MMU(內存管理單元)去匹配對應的物理地址(比如上圖中的0,1,2)。
如果虛擬內存的頁並不存在於物理內存中(如上圖中的3,4),會產生缺頁中斷,從磁盤中取得缺的頁放入內存,如果內存已滿,還會根據某種算法將磁盤中的頁換出。

  • 與傳統存儲器比較虛擬存儲器有以下三個主要特徵:
    (1)多次性:是指無需在作業運行時一次性的全部裝入內存,而是允許被分成多次調入內存運行
    (2)對換性,是指無需在作業運行時一直常駐內存,而是允許在作業的運行過程中,進行換進和換出
    (3)虛擬性,是指從邏輯上擴充內存的容量,使用戶所看到的內存容量,遠大於實際的內存容量

  • 虛擬內存的實現有以下兩種方式
    (1)請求分頁存儲管理
    (2)請求分段存儲管理

3 頁面置換算法

  • FIFO先進先出算法
    在操作系統中經常被用到,比如作業調度(主要實現簡單,很容易想到)
    該算法總是淘汰最先進入內存的頁面,即選擇在內存中駐留時間最久的頁面予以淘汰。

  • LRU(Last recently use) 最近最久使用算法
    根據使用時間到現在的長短來判斷
    該算法是選擇最近最久未使用的頁面予以淘汰,系統在每個頁面設置一個訪問字段,用以記錄這個頁面上次被訪問以來所經歷的時間T,當要淘汰一個頁面時,選擇T最大的頁面

  • LFU(Least frequently use) 最少使用次數算法
    根據使用次數來判斷
    該算法選擇最近時期使用最少的頁面作爲淘汰頁

  • OPT(Optimal replacement ) 最優置換算法
    理論的最優,理論:就是要保證置換出去的是不再被使用的頁,或者是在實際內存中最晚使用的算法

4 顛簸(抖動)

顛簸本質上是指頻繁的頁調度行爲,具體來講,進程發生缺頁中斷,這時,必須置換某一頁。
然而,其他所有的頁都在使用,它置換一個頁,但又立刻再次需要這個頁。
因此,會不斷產生卻也中斷,導致整個系統的效率急劇下降,這種現象稱爲顛簸(抖動)。

內存顛簸的解決策略包括:

  • 如果是因爲頁面替換策略失誤,可以修改替換算法來解決這個問題
  • 如果是因爲允運行的程序太多,造成程序無法同時將所有頻繁訪問的頁面調入內存,則需要降低多道程序的數量
  • 否則,還剩下兩個辦法:終止該進程或增加物理內存容量

5 虛擬內存的應用與優點

虛擬內存很適合在多道程序設計系統中使用,許多程序的片段同時保存在內存中。
當一個程序等待它的一部分讀入內存時,可以把CPU交給另一個進程使用。

虛擬內存的使用可以帶來以下好處:

  • 在內存中可以保留多個進程,系統併發度提高
  • 解除來用戶 與內存之間的緊密約束,進程可以比內存的全部空間還大

NO-9 分頁和分段有什麼區別(內存管理)?

是信息的物理單位,分頁是爲實現離散分配方式,以消減內存的外零頭,提高內存的利用率;或者說,分頁僅僅是由於系統管理的徐需要,而不是用戶的需要。

是信息的邏輯單位,它含有一組其意義相對完整的信息。分段的目的是爲了更好的滿足用戶的需要。

頁面存儲管理方案是一種用戶視角內存與物理內存相分離的內存分配管理方案。
在頁式存儲管理中,將程序的邏輯地址劃分爲固定大小的頁(page),而物理內存劃分爲同樣大小的幀
程序加載時,可以將任意一夜放入內存中的任意一個幀,這些幀不必連續,從而實現了離散分離。
頁式存儲管理的優點是:沒有外碎片(因爲頁的大小固定),
但會產生內碎片(一個頁可能填充不滿)。

段式存儲管理是一種符合用戶視角的內存分配管理方案。
在段式存儲管理中,將程序的地址空間劃分爲若干段(segment),如代碼段,數據段,堆棧段;
這樣每個進程都有一個二維地址空間,相互獨立,互不干擾。
段式管理的優點是:沒有內碎片(因爲段大小可變,改變段大小來消除內碎片)。
但段換入換出時,會產生外碎片(比如4k的段換5k的段,會產生1k的外碎片)

兩者的不同點

  • 1 目的不同
    分頁是由於系統管理的需要而不是用戶的需要,它是信息的物理單位
    分段的目的是爲了能更好的滿足用戶的需要,它是信息的邏輯單位,它含有一組其意義相對完整的信息

  • 2 大小不同
    頁的大小固定且由系統決定,把邏輯地址分爲頁號和頁內地址兩部分,由機器硬件實現的。因此一個系統只能有一種大小的頁面。
    而段的長度卻不固定,由其所完成的功能決定,決定於用戶所編寫的程序,通常由編寫程序在對源代碼進行編輯時,根據信息的性質來劃分。

  • 3 地址空間不同
    頁向用戶提供一維地址空間,即單一的線性空間
    段向用戶提高二維地址空間,程序員在標識一個地址時,既需要給出段名,又需要給出段內地址。

  • 4 信息共享
    段是信息的邏輯單位,便於存儲保護和信息的共享,
    頁的保護和共享受到限制

  • 5 內存碎片
    頁式存儲管理的優點是沒有外碎片(因爲頁的大小固定),但會產生內碎片(一個頁可能填充不滿)
    而段式存儲管理的優點是沒有外碎片(因爲段大小可變,改變段大小來消除內碎片)。但段換入換出時,會產生外碎片(比如4k的段換5k的段,會產生1k的外碎片)

內部碎片與外部碎片
在內存管理中,內部碎片是已經被分配出去的內存空間大於請求所需的內存空間
外部碎片是指還沒有分配出去,但是由於太小而無法分配給申請空間的新進程的內存空間空閒塊
固定分區存在內部碎片,可變式分區分配會存在外部碎片
頁面虛擬存儲系統存在內部碎片;段式虛擬存儲系統,存在外部碎片
爲了有效的利用內存,使內存產生更少的碎片,要對內存分頁,內存以頁爲單位來使用,最後一頁往往裝不滿,於是形成了內部碎片
爲了共享要分段,在段的換入換出時形成外部碎片,比如5K的段換出後,有一個4K的段來放到原來5K的地方,於是形成1K的外部碎片。

NO-10 同步與異步

1 同步

同步是指一個進程在執行某個請求的時候,若該請求需要一段時間才能返回信息,
那麼,這個進程將會一直等待下去,直到收到返回信息才繼續執行下去。

特點:
同步是阻塞 模式;
同步是按順序執行, 執行完一個再執行下一個,需要等待,協調運行

2 異步

異步是指進程不需要一直等下去,而是繼續執行 下面的操作,不管其他進程的狀態。
當有消息返回時系統會通知進程進行處理,這樣可以提高執行的效率。

特點:
異步是非阻塞模式, 無需等待;
異步是彼此獨立, 在等待某事件的過程中,繼續做自己的事,不需要等待這一時間完成後再工作。線程是異步實現的一個方式

3 同步和異步優缺點

同步可以避免出現死鎖,讀髒數據的發生
一般共享某一資源的時候,如果每個人都有修改權限,同時修改一個文件,有可能使一個讀取另一個已經刪除了的內容,就會出錯,同步就不會出錯。

但, 同步需要等待資源訪問結束,浪費時間,效率低

異步可以提高效率,但,安全性較低。

NO-11 中斷和輪詢

對I/O 設備的程序輪詢的方式,是早起的計算機系統對I/O設備的一種管理方式。
它定時對各種設備輪流詢問一遍有無處理要求。
輪流詢問之後,有要求的,則加以處理。在處理I/O設備的要求之後,處理機返回繼續工作。
儘管輪詢需要時間,但輪詢要比I/O設備的速度快得多,所以一般不會發生不能及時處理的問題。
當然,再快的處理機,能處理的輸入輸出設備的數量也是有一定限度的,而且,程序輪詢畢竟佔據了CPU相當一部分處理時間。
因此,程序輪詢是一種效率極低的方式,在現代計算機系統中已很少應用。

程序中斷通常簡稱中斷,是指CPU在正常運行程序的過程中,由於預先安排或發生了各種隨機的內部或外部時間,使CPU中斷正在運行的程序,而轉到爲響應的服務程序去處理。

輪詢—效率低,等待時間很長,CPU利用率不高
中斷—容易遺漏一些問題,CPU利用率高

NO-12 什麼是臨界區?如何解決衝突?

每個進程中訪問臨界資源的那段程序稱爲臨界區,每次只准許一個進程進入臨界區,進入後不允許其它進程進入。

  • (1)如果有若干進程要求進入空閒的臨界區,一次僅允許一個進程進入
  • (2)任何時候,處於臨界區內的進程不可多於一個。如已有進程進入自己的臨界區,則其它所有試圖進入臨界區的進程必須等待
  • (3)進入臨界區的進程要在有限時間內退出,以便其它進程能及時進入自己的臨界區
  • (4)如果進程不能進入自己的臨界區,則應讓出CPU,避免進程出現“忙等”現象

NO-13 Linux中常用的命令

顯示文件目錄命令 ls

改變當前目錄命令cd 如cd/home

建立子目錄 mkdir 如mkdir test

刪除子目錄命令 rmdir 如rmdir /mnt/cdrom

刪除文件命令 rm 如rm /test.xls

文件複製命令cp 如 cp /root/test

獲取幫助信息命令man 如man ls

顯示文件的內容 less 如less test.txt

重定向與管道 type 如type readme >> direct, 將文件readme文件的內容追加到direct中

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章