【一】作業系統原理

Hanmh_發表於2020-12-30

1.程式和執行緒的相關題

  1. 程式:程式是系統進行資源分配和排程的一個獨立單位,是系統中的併發執行的單位。
  2. 執行緒:執行緒是程式的一個實體,也是CPU排程和分派的基本單位,它是比程式更小的能獨立執行的基本單位,有時又被稱為輕量級程式。
  3. 程式是資源分配的最小單位,而執行緒是CPU排程的最小單位;建立程式或撤銷程式,系統都要為之分配或回收資源,作業系統開銷遠大於建立或撤銷執行緒時的開銷;不同程式地址空間相互獨立,同一程式內的執行緒共享同一地址空間。一個程式的執行緒在另一個程式內是不可見的;程式間不會相互影響,而一個執行緒掛掉將可能導致整個程式掛掉。
  4. 程式的記憶體空間共享,每個執行緒都可以使用這些共享記憶體。一個執行緒在使用共享記憶體的時候,其他執行緒需要等待結束才能使用這塊記憶體。因此執行緒進去之後記得關門(上鎖),上了鎖,其他執行緒想進來發現是上鎖了,那就等鎖開啟後再進去,這就叫做互斥鎖,防止多個執行緒同時讀寫某一塊記憶體區域。
  5. 如果以多程式的方式執行,那麼允許多個任務同時執行。
  6. 如果以多執行緒的方式執行,那麼允許將單個任務分成不同的部分執行。
  7. 為了防止程式/執行緒之間產生衝突和允許程式之間的共享資源,需要提供一種協調機制。

 2.提到高併發、分散式,就不得不想起多執行緒,那麼多執行緒一定比單執行緒效率高?

  1. Memcache是多執行緒模型而Redis是單執行緒模型。
  2. 採用多執行緒多核效果更好,但是多執行緒對CPU,記憶體等都要求比較高,如果存線上程的上下文切換過於耗時,互斥時間太久,效率反而會低。

3.多執行緒與多程式的應用場景

  1. 多執行緒的優點:更加高效的記憶體共享:多程式下記憶體共享不便;較輕的上下文切換:因為不用切換地址空間,CR3暫存器和清空TLB。
  2. 多程式的優點:各個程式有自己記憶體空間,所以具有更強的容錯性,不至於一個整合crash導致系統崩潰;具有更好的多核可伸縮性,因為程式將地址空間,頁表等進行了隔離,在多核的系統上可伸縮性更強。

4.如何提升多執行緒的效率?

  1. 儘量使用池化技術,也就是執行緒池,從而不用頻繁的建立,銷燬執行緒。
  2. 減少執行緒之間的同步和通訊。
  3. 通過Huge Page的方式避免產生大量的缺頁異常。
  4. 避免需要頻繁共享寫的資料。

5.為什麼有了程式,還要有執行緒呢?

  1. 為了提高系統資源的利用率和系統的吞吐量,通常程式可讓多個程式併發的執行,但是也會帶來一些問題。程式如果在執行的過程被阻塞,那這個程式將被掛起,這時候程式中有些等待的資源得不到執行;程式在同一時間只能做一件事兒。
  2. 基於以上的缺點,作業系統引入了比程式粒度更小的執行緒,作為併發執行的基本單位,從而減少程式在併發執行時所付出的時間和空間開銷,提高併發效能。

6.對併發和並行的理解?

  1. 併發:在一個時間段中多個程式(人物)都啟動執行在同一個處理機中。
  2. 並行:假設目前A,B兩個程式,兩個程式分別由不同的CPU管理執行,兩個程式不搶佔CPU資源且可以同時執行,這叫做並行(同一時間點內
  3. 兩者區別在於是否"同時"發生。是在一段時間同時發生還是多個事情在同一個時間點同時發生。

7.程式間的通訊方式有哪些?

1.管道:在學習Linux基本命令使用的時候,我們經常通過多個命令的組合來完成我們的需求。比如說我們想知道如何檢視程式或者埠是否在使用,會使用下面的這條命令。

netstat -nlp | grep XXX  這裡的"|"實際上就是管道的意思。"|"前面部分作為"|"後面的輸入,很明顯是單向的傳輸,這樣的管道我們叫做"匿名管道",自行建立和銷燬。既然有匿名管道,應該就有帶名字的管道"命名管道"。如果你想雙向傳輸,可以考慮使用兩個管道拼接即可。

管道通訊方式的點:簡單,我們平時經常使用以致於都不知道這是管道。

管道通訊方式的缺點:效率很低,因為假設現在有AB兩個程式,A程式將資料寫入管道,B程式需要等待A程式將資訊寫完以後才能讀出來,所以這種方案不適合頻繁的通訊。

2.訊息佇列:訊息佇列在傳送資料的時候,按照一個個獨立單元(訊息體)進行傳送,其中每個訊息體規定大小塊,同時傳送方和接收方約定好訊息型別或者正文的格式。

訊息佇列的優點:在管道中,其大小受限且只能承載無格式位元組流的方式,而訊息佇列允許不同程式以訊息佇列的形式傳送給任意的程式。

訊息佇列的缺點:資料太大時,需要拷貝的時間也就越多。

3.共享記憶體:每個程式都有自己的虛擬記憶體空間,不同的程式對映到不同的實體記憶體空間。那麼我們可以申請一塊虛擬地址空間,不同程式通過這塊虛擬地址空間對映到相同的實體地址空間。這樣不同程式就可以及時感知程式做了什麼,就不需要再拷貝來拷貝去。通過shmget建立一份共享記憶體,並可以通過ipcs命令檢視我們建立的共享記憶體。此時如果一個程式需要訪問這段記憶體,需要將這個記憶體載入到自己虛擬地址空間的一個位置,讓核心給它一個合法地址。使用完畢接觸板頂並刪除記憶體物件。

共享記憶體的缺點:許多程式都共享這塊記憶體,如果同時都往裡面寫內容,難免會出現衝突的現象,比如A程式寫了數字5,B程式同樣的地址寫了6就直接給覆蓋了,這樣就不友好了?

4.訊號量:為了防止衝突,我們得有個約束或者說一種保護機制。使得同一份共享的資源只能一個程式使用,這裡就出現了訊號量機制。訊號量實際上是一個計數器,這裡需要注意下,訊號量主要實現程式之間的同步和互斥,而不是儲存通訊內容。訊號量定義了兩種操作,p操作和v操作,p操作為申請資源,會將數值減去M,表示這部分被他使用了,其他程式暫時不能用。v操作是歸還資源操作,告知歸還了資源可以用這部分。

5.訊號:在作業系統中,不同訊號用不同的值表示,每個訊號設定相應的函式,一旦程式傳送某一個訊號給另一個程式,另一程式將執行相應的函式進行處理。也就是說把可能出現的異常等問題準備好,一旦訊號產生就執行相應的邏輯即可。

6.套接字:上面的幾種方式都是單機情況下多個程式的通訊方式,如果我想和相隔幾千裡的計算機通訊怎麼辦?這就需要套接字socket,生活中極常見,因為我們天天請求瀏覽器給予的響應。

8.程式的排程演算法有哪些?

排程演算法是指:排程程式是核心的重要組成部分,決定著下一個要執行的程式。那麼根據系統的資源分配策略所規定的資源分配演算法。

  1. 先來先服務排程演算法:如同佇列的先進先出特性,每一次的排程都從佇列中選擇最先進入佇列的投入執行。
  2. 時間片輪轉排程法:如果程式在當前的時間片執行結束,直接將程式從佇列移除。如果程式在這個時間片跑完都沒有結束,程式變為等待狀態,放在程式尾部直到所有程式執行完畢。
  3. 短作業優先排程演算法:「短作業」意味著執行時間比較短,「優先」代表執行順序。
  4. 最短剩餘時間優先:最短剩餘時間是針對最短程式優先增加了搶佔機制的版本。在這種情況下,程式排程總是選擇預期剩餘時間最短的程式。當一個程式加入到就緒佇列時,他可能比當前執行的程式具有更短的剩餘時間,只要新程式就緒,排程程式就能可能搶佔當前正在執行的程式。像最短程式優先一樣,排程程式正在執行選擇函式是必須有關於處理時間的估計,並且存在長程式飢餓的危險。
  5. 高響應比優先排程演算法:有響應之前應該會有請求,相當於是請求+響應+優先,算是一種綜合的排程演算法。也就是它結合了短作業優先,先來先服務以及長作業的一些特性。首先來說短作業優先。等待時間我們假設相等,服務時間很短,這樣的話短作業就會有更高的優先權。再來看先來先服務。假設服務時間相同,先來的自然等待時間較長,優先順序越高。上面說長作業很可能因為等待時間過長,容易餓死。
  6. 優先順序排程演算法:優先順序排程演算法每次從後備作業佇列中選擇優先順序最髙的一個或幾個作業,將它們調入記憶體,分配必要的資源,建立程式並放入就緒佇列。在程式排程中,優先順序排程演算法每次從就緒佇列中選擇優先順序最高的程式,將處理機分配給它,使之投入執行。

9.同步、非同步、阻塞、非阻塞的概念

  1. 同步非同步,阻塞非阻塞是兩個不同層面的問題,一個是operation層面,一個是kernal層面。同步非同步最大的區別在於是否需要底層的響應再執行。阻塞非阻塞最大的區別在於是否立即給出響應。
  2. 同步:當一個同步呼叫發出後,呼叫者要一直等待返回結果。通知後,才能進行後續的執行。
  3. 非同步:當一個非同步過程呼叫發出後,呼叫者不能立刻得到返回結果。實際處理這個呼叫的部件在完成後,通過狀態、通知和回撥來通知呼叫者。
  4. 阻塞:是指呼叫結果返回前,當前執行緒會被掛起,即阻塞。
  5. 非阻塞:是指即使呼叫結果沒返回,也不會阻塞當前執行緒。
  6. 形象比喻:
  • 小Q去釣魚,拋完線後就傻傻的看著有沒有動靜,有則拉桿(同步阻塞);
  • 小Q去釣魚,拿魚網撈一下,有沒有魚立即知道,不用等,直接就撈(同步非阻塞);
  • 小Q去釣魚,這個魚缸比較牛皮,扔了後自己就打王者榮耀去了,因為魚上鉤了這個魚缸帶的報警器會通知我。這樣實現非同步(非同步非阻塞)

10.產生死鎖的原因?

  1. 由於系統中存在一些不可剝奪資源,而當兩個或兩個以上程式佔有自身資源,並請求對方資源時,會導致每個程式都無法向前推進,這就是死鎖。
  2. 原因一:競爭資源
  3. 原因二:程式推進順序不當。例如:程式 A 和 程式 B 互相等待對方的資料。
  • 例如:系統中只有一臺印表機,可供程式 A 使用,假定 A 已佔用了印表機,若 B 繼續要求印表機列印將被阻塞。系統中的資源可以分為兩類:
  • 可剝奪資源:是指某程式在獲得這類資源後,該資源可以再被其他程式或系統剝奪,CPU和主存均屬於可剝奪性資源;
  • 不可剝奪資源當系統把這類資源分配給某程式後,再不能強行收回,只能在程式用完後自行釋放,如磁帶機、印表機等。

11.怎麼避免死鎖?

  1. 銀行家演算法:當程式首次申請資源時,要測試該程式對資源的最大需求量,如果系統現存的資源可以滿足它的最大需求量則按當前的申請量分配資源,否則就推遲分配。當程式在執行中繼續申請資源時,先測試該程式已佔用的資源數與本次申請資源數之和是否超過了該程式對資源的最大需求量。若超過則拒絕分配資源。若沒超過則再測試系統現存的資源能否滿足該程式尚需的最大資源量,若滿足則按當前的申請量分配資源,否則也要推遲分配。
  2. 安全序列:是指系統能按某種程式推進順序(P1, P2, P3, …, Pn),為每個程式 Pi 分配其所需要的資源,直至滿足每個程式對資源的最大需求,使每個程式都可以順序地完成。這種推進順序就叫安全序列【銀行家演算法的核心就是找到一個安全序列】
  3. 系統安全狀態:如果系統能找到一個安全序列,就稱系統處於安全狀態,否則,就稱系統處於不安全狀態。
  4. 資源分配圖:用來描述系統死鎖。
  5. 死鎖定理:s為死鎖狀態的充分條件是:當且僅當s狀態的資源分配圖是不可完全簡化的。

 12.怎麼解除死鎖?

  1. 資源剝奪:掛起某些死鎖程式,並搶佔它的資源,將這些資源分配給其他死鎖程式(但應該防止被掛起的程式長時間得不到資源);
  2. 撤銷程式:強制撤銷部分、甚至全部死鎖程式並剝奪這些程式的資源(撤銷的原則可以按程式優先順序和撤銷程式代價的高低進行);
  3. 程式回退:讓一個或多個程式回退到足以避免死鎖的地步。程式回退時自願釋放資源而不是被剝奪。要求系統保持程式的歷史資訊,設定還原點。

13.什麼是緩衝區溢位?有什麼危害?

緩衝區溢位指當計算機向緩衝區內填充資料時超過了緩衝區本身的容量,溢位的資料覆蓋在合法資料上。

14.實體地址、邏輯地址、線性地址

  1. 實體地址:它是地址轉換的最終地址,是記憶體單元真正的地址。如果採用了分頁機制,那麼線性地址會通過頁目錄和頁表的方式轉換為實體地址。如果沒有啟用則線性地址即為實體地址。
  2. 邏輯地址:在編寫c語言的時候,通過&操作符可以讀取指標變數本身的值,這個值就是邏輯地址。實際上是當前程式的資料段的地址,和真實的實體地址沒有關係。只有當在Intel真實模式下,邏輯地址==實體地址。我們平時的應用程式都是通過和邏輯地址打交道,至於分頁,分段機制對他們而言是透明的。邏輯地址也稱作虛擬地址。
  3. 線性地址:線性地址是邏輯地址到實體地址的中間層。我們編寫的程式碼會存在一個邏輯地址或者是段中的偏移地址,通過相應的計算(加上基地址)生成線性地址。此時如果採用了分頁機制,那麼吸納行地址再經過變換即產生實體地址。在Intelk 80386中地址空間容量為4G,各個程式地址空間隔離,意味著每個程式獨享4G線性空間。多個程式難免出現程式之間的切換,線性空間隨之切換。基於分頁機制,對於4GB的線性地址一部分會被對映到實體記憶體,一部分對映到磁碟作為交換檔案,一部分沒有對映。

15.頁面置換演算法有哪些?

請求調頁,也稱按需調頁,即對不在記憶體中的“頁”,當程式執行時要用時才調入,否則有可能到程式結束時也不會調入。而記憶體中給頁面留的位置是有限的,在記憶體中以幀為單位放置頁面。為了防止請求調頁的過程出現過多的記憶體頁面錯誤(即需要的頁面當前不在記憶體中,需要從硬碟中讀資料,也即需要做頁面的替換)而使得程式執行效率下降,我們需要設計一些頁面置換演算法,頁面按照這些演算法進行相互替換時,可以儘量達到較低的錯誤率。常用的頁面置換演算法如下:

  1. 先進先出置換演算法(FIFO)先進先出,即淘汰最早調入的頁面。
  2. 最佳置換演算法(OPT)選未來最遠將使用的頁淘汰(一種最優的方案)缺頁數最小。
  3. 最近最久未使用演算法(LRU)即選擇最近最久未使用的頁面予以淘汰。
  4. 時鐘置換演算法(Clock)也叫最近未用演算法 NRU(Not RecentlyUsed)。該演算法為每個頁面設定一位訪問位,將記憶體中的所有頁面都通過連結指標鏈成一個迴圈佇列。
  5. 改進型clock置換演算法
  6. 最不常用演算法(LFU)當一個缺頁中斷髮生時,選擇訪問次數最少的那個頁面,並淘汰之。

16.IO密集型和CPU密集型

CPU密集型通常需要執行大量的CPU運算任務,這個時候保持執行緒數和CPU核數相當即可,不然容易更多的執行緒上下文切換。再web系統開發中,更多的可能是對於資料庫的查詢等IO操作,此時CPU會空閒一段下來。

(歡迎您的意見和建議,感謝支援!!!❤❤❤)

相關文章