1.行程和執行緒的相關題
- 行程:行程是系統進行資源分配和調度的一個獨立單位,是系統中的并發執行的單位,
- 執行緒:執行緒是行程的一個物體,也是CPU調度和分派的基本單位,它是比行程更小的能獨立運行的基本單位,有時又被稱為輕量級行程,
- 行程是資源分配的最小單位,而執行緒是CPU調度的最小單位;創建行程或撤銷行程,系統都要為之分配或回收資源,作業系統開銷遠大于創建或撤銷執行緒時的開銷;不同行程地址空間相互獨立,同一行程內的執行緒共享同一地址空間,一個行程的執行緒在另一個行程內是不可見的;行程間不會相互影響,而一個執行緒掛掉將可能導致整個行程掛掉,
- 行程的記憶體空間共享,每個執行緒都可以使用這些共享記憶體,一個執行緒在使用共享記憶體的時候,其他執行緒需要等待結束才能使用這塊記憶體,因此執行緒進去之后記得關門(上鎖),上了鎖,其他執行緒想進來發現是上鎖了,那就等鎖打開后再進去,這就叫做互斥鎖,防止多個執行緒同時讀寫某一塊記憶體區域,
- 如果以多行程的方式運行,那么允許多個任務同時運行,
- 如果以多執行緒的方式運行,那么允許將單個任務分成不同的部分運行,
- 為了防止行程/執行緒之間產生沖突和允許行程之間的共享資源,需要提供一種協調機制,
2.提到高并發、分布式,就不得不想起多執行緒,那么多執行緒一定比單執行緒效率高?
- Memcache是多執行緒模型而Redis是單執行緒模型,
- 采用多執行緒多核效果更好,但是多執行緒對CPU,記憶體等都要求比較高,如果存在執行緒的背景關系切換過于耗時,互斥時間太久,效率反而會低,
3.多執行緒與多行程的應用場景
- 多執行緒的優點:更加高效的記憶體共享:多行程下記憶體共享不便;較輕的背景關系切換:因為不用切換地址空間,CR3暫存器和清空TLB,
- 多行程的優點:各個行程有自己記憶體空間,所以具有更強的容錯性,不至于一個集成crash導致系統崩潰;具有更好的多核可伸縮性,因為行程將地址空間,頁表等進行了隔離,在多核的系統上可伸縮性更強,
4.如何提升多執行緒的效率?
- 盡量使用池化技術,也就是執行緒池,從而不用頻繁的創建,銷毀執行緒,
- 減少執行緒之間的同步和通信,
- 通過Huge Page的方式避免產生大量的缺頁例外,
- 避免需要頻繁共享寫的資料,
5.為什么有了行程,還要有執行緒呢?
- 為了提高系統資源的利用率和系統的吞吐量,通常行程可讓多個程式并發的執行,但是也會帶來一些問題,行程如果在執行的程序被阻塞,那這個行程將被掛起,這時候行程中有些等待的資源得不到執行;行程在同一時間只能做一件事兒,
- 基于以上的缺點,作業系統引入了比行程粒度更小的執行緒,作為并發執行的基本單位,從而減少程式在并發執行時所付出的時間和空間開銷,提高并發性能,
6.對并發和并行的理解?
- 并發:在一個時間段中多個程式(人物)都啟動運行在同一個處理機中,
- 并行:假設目前A,B兩個行程,兩個行程分別由不同的CPU管理執行,兩個行程不搶占CPU資源且可以同時運行,這叫做并行(同一時間點內)
- 兩者區別在于是否"同時"發生,是在一段時間同時發生還是多個事情在同一個時間點同時發生,
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.行程的調度演算法有哪些?
調度演算法是指:調度程式是內核的重要組成部分,決定著下一個要運行的行程,那么根據系統的資源分配策略所規定的資源分配演算法,
- 先來先服務調度演算法:如同佇列的先進先出特性,每一次的調度都從佇列中選擇最先進入佇列的投入運行,
- 時間片輪轉調度法:如果行程在當前的時間片運行結束,直接將行程從佇列移除,如果行程在這個時間片跑完都沒有結束,行程變為等待狀態,放在行程尾部直到所有行程執行完畢,
- 短作業優先調度演算法:「短作業」意味著執行時間比較短,「優先」代表執行順序,
- 最短剩余時間優先:最短剩余時間是針對最短行程優先增加了搶占機制的版本,在這種情況下,行程調度總是選擇預期剩余時間最短的行程,當一個行程加入到就緒佇列時,他可能比當前運行的行程具有更短的剩余時間,只要新行程就緒,調度程式就能可能搶占當前正在運行的行程,像最短行程優先一樣,調度程式正在執行選擇函式是必須有關于處理時間的估計,并且存在長行程饑餓的危險,
- 高回應比優先調度演算法:有回應之前應該會有請求,相當于是請求+回應+優先,算是一種綜合的調度演算法,也就是它結合了短作業優先,先來先服務以及長作業的一些特性,首先來說短作業優先,等待時間我們假設相等,服務時間很短,這樣的話短作業就會有更高的優先權,再來看先來先服務,假設服務時間相同,先來的自然等待時間較長,優先級越高,上面說長作業很可能因為等待時間過長,容易餓死,
- 優先級調度演算法:優先級調度演算法每次從后備作業佇列中選擇優先級最髙的一個或幾個作業,將它們調入記憶體,分配必要的資源,創建行程并放入就緒佇列,在行程調度中,優先級調度演算法每次從就緒佇列中選擇優先級最高的行程,將處理機分配給它,使之投入運行,
9.同步、異步、阻塞、非阻塞的概念
- 同步異步,阻塞非阻塞是兩個不同層面的問題,一個是operation層面,一個是kernal層面,同步異步最大的區別在于是否需要底層的回應再執行,阻塞非阻塞最大的區別在于是否立即給出回應,
- 同步:當一個同步呼叫發出后,呼叫者要一直等待回傳結果,通知后,才能進行后續的執行,
- 異步:當一個異步程序呼叫發出后,呼叫者不能立刻得到回傳結果,實際處理這個呼叫的部件在完成后,通過狀態、通知和回呼來通知呼叫者,
- 阻塞:是指呼叫結果回傳前,當前執行緒會被掛起,即阻塞,
- 非阻塞:是指即使呼叫結果沒回傳,也不會阻塞當前執行緒,
- 形象比喻:
- 小Q去釣魚,拋完線后就傻傻的看著有沒有動靜,有則拉桿(同步阻塞);
- 小Q去釣魚,拿魚網撈一下,有沒有魚立即知道,不用等,直接就撈(同步非阻塞);
- 小Q去釣魚,這個魚缸比較牛皮,扔了后自己就打王者榮耀去了,因為魚上鉤了這個魚缸帶的報警器會通知我,這樣實作異步(異步非阻塞)
10.產生死鎖的原因?
- 由于系統中存在一些不可剝奪資源,而當兩個或兩個以上行程占有自身資源,并請求對方資源時,會導致每個行程都無法向前推進,這就是死鎖,
- 原因一:競爭資源
- 原因二:行程推進順序不當,例如:行程 A 和 行程 B 互相等待對方的資料,
- 例如:系統中只有一臺列印機,可供行程 A 使用,假定 A 已占用了列印機,若 B 繼續要求列印機列印將被阻塞,系統中的資源可以分為兩類:
- 可剝奪資源:是指某行程在獲得這類資源后,該資源可以再被其他行程或系統剝奪,CPU和主存均屬于可剝奪性資源;
- 不可剝奪資源:當系統把這類資源分配給某行程后,再不能強行識訓,只能在行程用完后自行釋放,如磁帶機、列印機等,
11.怎么避免死鎖?
- 銀行家演算法:當行程首次申請資源時,要測驗該行程對資源的最大需求量,如果系統現存的資源可以滿足它的最大需求量則按當前的申請量分配資源,否則就推遲分配,當行程在執行中繼續申請資源時,先測驗該行程已占用的資源數與本次申請資源數之和是否超過了該行程對資源的最大需求量,若超過則拒絕分配資源,若沒超過則再測驗系統現存的資源能否滿足該行程尚需的最大資源量,若滿足則按當前的申請量分配資源,否則也要推遲分配,
- 安全序列:是指系統能按某種行程推進順序(P1, P2, P3, …, Pn),為每個行程 Pi 分配其所需要的資源,直至滿足每個行程對資源的最大需求,使每個行程都可以順序地完成,這種推進順序就叫安全序列【銀行家演算法的核心就是找到一個安全序列】
- 系統安全狀態:如果系統能找到一個安全序列,就稱系統處于安全狀態,否則,就稱系統處于不安全狀態,
- 資源分配圖:用來描述系統死鎖,
- 死鎖定理:s為死鎖狀態的充分條件是:當且僅當s狀態的資源分配圖是不可完全簡化的,
12.怎么解除死鎖?
- 資源剝奪:掛起某些死鎖行程,并搶占它的資源,將這些資源分配給其他死鎖行程(但應該防止被掛起的行程長時間得不到資源);
- 撤銷行程:強制撤銷部分、甚至全部死鎖行程并剝奪這些行程的資源(撤銷的原則可以按行程優先級和撤銷行程代價的高低進行);
- 行程回退:讓一個或多個行程回退到足以避免死鎖的地步,行程回退時自愿釋放資源而不是被剝奪,要求系統保持行程的歷史資訊,設定還原點,
13.什么是緩沖區溢位?有什么危害?
緩沖區溢位指當計算機向緩沖區內填充資料時超過了緩沖區本身的容量,溢位的資料覆寫在合法資料上,
14.物理地址、邏輯地址、線性地址
- 物理地址:它是地址轉換的最終地址,是記憶體單元真正的地址,如果采用了分頁機制,那么線性地址會通過頁目錄和頁表的方式轉換為物理地址,如果沒有啟用則線性地址即為物理地址,
- 邏輯地址:在撰寫c語言的時候,通過&運算子可以讀取指標變數本身的值,這個值就是邏輯地址,實際上是當前行程的資料段的地址,和真實的物理地址沒有關系,只有當在Intel實模式下,邏輯地址==物理地址,我們平時的應用程式都是通過和邏輯地址打交道,至于分頁,分段機制對他們而言是透明的,邏輯地址也稱作虛擬地址,
- 線性地址:線性地址是邏輯地址到物理地址的中間層,我們撰寫的代碼會存在一個邏輯地址或者是段中的偏移地址,通過相應的計算(加上基地址)生成線性地址,此時如果采用了分頁機制,那么吸納行地址再經過變換即產生物理地址,在Intelk 80386中地址空間容量為4G,各個行程地址空間隔離,意味著每個行程獨享4G線性空間,多個行程難免出現行程之間的切換,線性空間隨之切換,基于分頁機制,對于4GB的線性地址一部分會被映射到物理記憶體,一部分映射到磁盤作為交換檔案,一部分沒有映射,
15.頁面置換演算法有哪些?
請求調頁,也稱按需調頁,即對不在記憶體中的“頁”,當行程執行時要用時才調入,否則有可能到程式結束時也不會調入,而記憶體中給頁面留的位置是有限的,在記憶體中以幀為單位放置頁面,為了防止請求調頁的程序出現過多的記憶體頁面錯誤(即需要的頁面當前不在記憶體中,需要從硬碟中讀資料,也即需要做頁面的替換)而使得程式執行效率下降,我們需要設計一些頁面置換演算法,頁面按照這些演算法進行相互替換時,可以盡量達到較低的錯誤率,常用的頁面置換演算法如下:
- 先進先出置換演算法(FIFO)先進先出,即淘汰最早調入的頁面,
- 最佳置換演算法(OPT)選未來最遠將使用的頁淘汰(一種最優的方案)缺頁數最小,
- 最近最久未使用演算法(LRU)即選擇最近最久未使用的頁面予以淘汰,
- 時鐘置換演算法(Clock)也叫最近未用演算法 NRU(Not RecentlyUsed),該演算法為每個頁面設定一位訪問位,將記憶體中的所有頁面都通過鏈接指標鏈成一個回圈佇列,
- 改進型clock置換演算法
- 最不常用演算法(LFU)當一個缺頁中斷發生時,選擇訪問次數最少的那個頁面,并淘汰之,
16.IO密集型和CPU密集型
CPU密集型通常需要執行大量的CPU運算任務,這個時候保持執行緒數和CPU核數相當即可,不然容易更多的執行緒背景關系切換,再web系統開發中,更多的可能是對于資料庫的查詢等IO操作,此時CPU會空閑一段下來,
(歡迎您的意見和建議,感謝支持!!!???)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/241007.html
標籤:其他
下一篇:大學物理-震動波動光學
