1. 程式人生 > 其它 >Angular入門系列 第四章:建立特性元件

Angular入門系列 第四章:建立特性元件

技術標籤:核心作業系統多執行緒linux面試

參考:

多程序和多執行緒的區別是什麼?多程序和多執行緒的優缺點分析

協程與執行緒的區別

程序、執行緒和協程之間的區別和聯絡

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、外圍裝置的中斷: 所有程式都執行在使用者態,但在從硬碟讀取資料、或從鍵盤輸入時,這些事情只有作業系統能做,程式需要向作業系統請求以程式的名義來執行這些操作。這個時候使用者態程式切換到核心態。

使用者介面程式(GUI或shell)

GUI,Graphical User Interface,圖形使用者介面,帶有圖形介面的作業系統;基於文字、命令列的叫shell,處於使用者態中,位於使用者態的最底層,允許使用者執行其他程式(而作業系統執行在核心態中)