linux面试准备2
1. 線程的實現方式. (也就是用戶線程與內核線程的區別)
內核級線程:切換由內核控制,當線程進行切換的時候,由用戶態轉化為內核態。切換完畢要從內核態返回用戶態;可以很好的利用smp,即利用多核cpu。windows線程就是這樣的。
用戶級線程內核的切換由用戶態程序自己控制內核切換,不需要內核干涉,少了進出內核態的消耗,但不能很好的利用多核Cpu,目前Linux pthread大體是這么做的。
線程的實現可以分為兩類:用戶級線程(User-Level Thread)和內核線線程(Kernel-Level Thread),后者又稱為內核支持的線程或輕量級進程。在多線程操作系統中,各個系統的實現方式并不相同,在有的系統中實現了用戶級線程,有的系統中實現了內核級線程。
用戶線程指不需要內核支持而在用戶程序中實現的線程,其不依賴于操作系統核心,應用進程利用線程庫提供創建、同步、調度和管理線程的函數來控制用戶線程。不需要用戶態/核心態切換,速度快,操作系統內核不知道多線程的存在,因此一個線程阻塞將使得整個進程(包括它的所有線程)阻塞。由于這里的處理器時間片分配是以進程為基本單位,所以每個線程執行的時間相對減少。
內核線程:由操作系統內核創建和撤銷。內核維護進程及線程的上下文信息以及線程切換。一個內核線程由于I/O操作而阻塞,不會影響其它線程的運行。Windows NT和2000/XP支持內核線程。
用戶線程運行在一個中間系統上面。目前中間系統實現的方式有兩種,即運行時系統(Runtime System)和內核控制線程。“運行時系統”實質上是用于管理和控制線程的函數集合,包括創建、撤銷、線程的同步和通信的函數以及調度的函數。這些函數都駐留在用戶空間作為用戶線程和內核之間的接口。用戶線程不能使用系統調用,而是當線程需要系統資源時,將請求傳送給運行時,由后者通過相應的系統調用來獲取系統資源。內核控制線程:系統在分給進程幾個輕型進程(LWP),LWP可以通過系統調用來獲得內核提供的服務,而進程中的用戶線程可通過復用來關聯到LWP,從而得到內核的服務。
以下是用戶級線程和內核級線程的區別:
內核支持線程是OS內核可感知的,而用戶級線程是OS內核不可感知的。
用戶級線程的創建、撤消和調度不需要OS內核的支持,是在語言(如Java)這一級處理的;而內核支持線程的創建、撤消和調度都需OS內核提供支持,而且與進程的創建、撤消和調度大體是相同的。
用戶級線程執行系統調用指令時將導致其所屬進程被中斷,而內核支持線程執行系統調用指令時,只導致該線程被中斷。
在只有用戶級線程的系統內,CPU調度還是以進程為單位,處于運行狀態的進程中的多個線程,由用戶程序控制線程的輪換運行;在有內核支持線程的系統內,CPU調度則以線程為單位,由OS的線程調度程序負責線程的調度。
用戶級線程的程序實體是運行在用戶態下的程序,而內核支持線程的程序實體則是可以運行在任何狀態下的程序。
內核線程的優點:
缺點:
用戶進程的優點:
線程的調度不需要內核直接參與,控制簡單。
可以在不支持線程的操作系統中實現。
創建和銷毀線程、線程切換代價等線程管理的代價比內核線程少得多。
允許每個進程定制自己的調度算法,線程管理比較靈活。這就是必須自己寫管理程序,與內核線程的區別
線程能夠利用的表空間和堆棧空間比內核級線程多。
同一進程中只能同時有一個線程在運行,如果有一個線程使用了系統調用而阻塞,那么整個進程都會被掛起。另外,頁面失效也會產生同樣的問題。
缺點:
資源調度按照進程進行,多個處理機下,同一個進程中的線程只能在同一個處理機下分時復用
2. 用戶態和核心態的區別
內核態與用戶態是操作系統的兩種運行級別,當程序運行在3級特權級上時,就可以稱之為運行在用戶態,因為這是最低特權級,是普通的用戶進程運行的特權級,大部分用戶直接面對的程序都是運行在用戶態;反之,當程序運行在0級特權級上時,就可以稱之為運行在內核態。運行在用戶態下的程序不能直接訪問操作系統內核數據結構和程序。當我們在系統中執行一個程序時,大部分時間是運行在用戶態下的,在其需要操作系統幫助完成某些它沒有權力和能力完成的工作時就會切換到內核態。
這兩種狀態的主要差別是: 處于用戶態執行時,進程所能訪問的內存空間和對象受到限制,其所處于占有的處理機是可被搶占的 ; 而處于核心態執行中的進程,則能訪問所有的內存空間和對象,且所占有的處理機是不允許被搶占的。
通常來說,以下三種情況會導致用戶態到內核態的切換:
系統調用
這是用戶態進程主動要求切換到內核態的一種方式,用戶態進程通過系統調用申請使用操作系統提供的服務程序完成工作,比如前例中fork()實際上就是執行了一個創建新進程的系統調用。而系統調用的機制其核心還是使用了操作系統為用戶特別開放的一個中斷來實現,例如Linux的int 80h中斷。
異常
當CPU在執行運行在用戶態下的程序時,發生了某些事先不可知的異常,這時會觸發由當前運行進程切換到處理此異常的內核相關程序中,也就轉到了內核態,比如缺頁異常。
外圍設備的中斷
當外圍設備完成用戶請求的操作后,會向CPU發出相應的中斷信號,這時CPU會暫停執行下一條即將要執行的指令轉而去執行與中斷信號對應的處理程序,如果先前執行的指令是用戶態下的程序,那么這個轉換的過程自然也就發生了由用戶態到內核態的切換。比如硬盤讀寫操作完成,系統會切換到硬盤讀寫的中斷處理程序中執行后續操作等。
這3種方式是系統在運行時由用戶態轉到內核態的最主要方式,其中系統調用可以認為是用戶進程主動發起的,異常和外圍設備中斷則是被動的。
3. 用戶棧和內核棧的區別
操作系統中,每個進程會有兩個棧,一個用戶棧,存在于用戶空間,一個內核棧,存在于內核空間。當進程在用戶空間運行時,cpu堆棧指針寄存器里面的內容是用戶堆棧地址,使用用戶棧;當進程在內核空間時,cpu堆棧指針寄存器里面的內容是內核棧空間地址,使用內核棧。
內核棧是內存中屬于操作系統空間的一塊區域,其主要用途為:
用戶棧是用戶進程空間中的一塊區域,用于保存用戶進程的子程序間相互調用的參數、返回值、返回點以及子程序(函數)的局部變量。
PS:那么為什么不直接用一個棧,何必浪費那么多的空間呢?
如果只用系統棧。系統棧一般大小有限,如果中斷有16個優先級,那么系統棧一般大小為15(只需保存15個低優先級的中斷,另一個高優先級中斷處理程序處于運行),但用戶程序子程序調用次數可能很多,那樣15次子程序調用以后的子程序調用的參數、返回值、返回點以及子程序(函數)的局部變量就不能被保存,用戶程序也就無法正常運行了。
如果只用用戶棧。我們知道系統程序需要在某種保護下運行,而用戶棧在用戶空間(即cpu處于用戶態,而cpu處于核心態時是受保護的),不能提供相應的保護措施(或相當困難)。
4. 死鎖的概念,導致死鎖的原因
可以把死鎖定義為一組相互競爭系統資源或進行通信的進程間的“永久”阻塞。當一組進程中的每個進程都在等待某個事件(典型的情況是等待所請求的資源釋放),而只有在這組進程中的其他被阻塞的進程才可以觸發該事件,這時就稱這組進程發生死鎖。因為沒有事件能夠被觸發,所以死鎖是永久性的。
產生死鎖的原因主要是:
因為系統資源不足。
進程運行推進的順序不合適。
資源分配不當等
導致死鎖的4個必要條件:
循環等待條件:在發生死鎖時,必然存在一個進程–資源的環形鏈。
死鎖預防策略是試圖設計一種系統來排除發生死鎖的可能性,方法分為兩類:間接的死鎖預防方法(防止前面三個列出的三個必要條件中的任何一個的發生);直接的死鎖的預防方法(防止循環等待的發生)。
死鎖避免策略
銀行家算法:首先需要定義狀態和安全狀態的概念。系統的狀態是當前給進程分配的資源情況。因此,狀態包含兩個向量Resource(系統中每種資源的總量)和Available(未分配給進程的每種資源的總量)及兩個矩陣Claim(表示進程對資源的需求)和Allocation(表示當前分配給進程的資源)。安全狀態是指至少有一個資源分配序列不會導致死鎖。當進程請求一組資源時,假設同意該請求,從而改變了系統的狀態,然后確定其結果是否還處于安全狀態。如果是,同意這個請求;如果不是,阻塞該進程知道同意該請求后系統狀態仍然是安全的。
5. 進程調度算法。(周轉時間 = 程序結束時間 – 開始服務時間、帶權周轉時間= 周轉時間 / 要求服務時間)
一、先來先服務和短作業(進程)優先調度算法
二、高優先權優先調度算法
1)非搶占式優先權算法
2)搶占式優先權調度算法(高性能計算機操作系統)
為了彌補短作業優先算法的不足,我們引入動態優先權,使作業的優先等級隨著等待時間的增加而以速率a提高。 該優先權變化規律可描述為:優先權=(等待時間+要求服務時間)/要求服務時間;即 =(響應時間)/要求服務時間
三、基于時間片的輪轉調度算法
時間片輪轉法。時間片輪轉法一般用于進程調度,每次調度,把CPU分配隊首進程,并令其執行一個時間片。 當執行的時間片用完時,由一個記時器發出一個時鐘中斷請求,該進程被停止,并被送往就緒隊列末尾;依次循環。
多級反饋隊列調度算法 ,不必事先知道各種進程所需要執行的時間,它是目前被公認的一種較好的進程調度算法。 其實施過程如下:
1) 設置多個就緒隊列,并為各個隊列賦予不同的優先級。在優先權越高的隊列中, 為每個進程所規定的執行時間片就越小。
2) 當一個新進程進入內存后,首先放入第一隊列的末尾,按FCFS原則排隊等候調度。 如果他能在一個時間片中完成,便可撤離;如果未完成,就轉入第二隊列的末尾,在同樣等待調度…… 如此下去,當一個長作業(進程)從第一隊列依次將到第n隊列(最后隊列)后,便按第n隊列時間片輪轉運行。
3) 僅當第一隊列空閑時,調度程序才調度第二隊列中的進程運行;僅當第1到第(i-1)隊列空時, 才會調度第i隊列中的進程運行,并執行相應的時間片輪轉。
4) 如果處理機正在處理第i隊列中某進程,又有新進程進入優先權較高的隊列, 則此新隊列搶占正在運行的處理機,并把正在運行的進程放在第i隊列的隊尾。
轉載于:https://www.cnblogs.com/readlearn/p/10806441.html
總結
以上是生活随笔為你收集整理的linux面试准备2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于批量插入数据之我见(100万级别的数
- 下一篇: 在IT的世界里,分享是一种快乐.