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