學(xué)習(xí)啦>學(xué)習(xí)電腦>操作系統(tǒng)>操作系統(tǒng)基礎(chǔ)知識(shí)>

操作系統(tǒng)常見(jiàn)問(wèn)題解答

時(shí)間: 志藝942 分享

  計(jì)算機(jī)操作系統(tǒng),是電子計(jì)算機(jī)系統(tǒng)中負(fù)責(zé)支撐應(yīng)用程序運(yùn)行環(huán)境以及用戶(hù)操作環(huán)境的系統(tǒng)軟件,同時(shí)也是計(jì)算機(jī)系統(tǒng)的核心與基石。接下來(lái)是小編為大家收集的操作系統(tǒng)常見(jiàn)問(wèn)題解答,希望能幫到大家。

  操作系統(tǒng)常見(jiàn)問(wèn)題解答

  (一)進(jìn)程與線(xiàn)程的區(qū)別,線(xiàn)程安全”怎么理解?

  進(jìn)程和線(xiàn)程都是由操作系統(tǒng)所體會(huì)的程序運(yùn)行的基本單元,系統(tǒng)利用該基本單元實(shí)現(xiàn)系統(tǒng)對(duì)應(yīng)得并發(fā)性。進(jìn)程和線(xiàn)程的區(qū)別在于:

  一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線(xiàn)程。

  線(xiàn)程的劃分尺度小于進(jìn)程,使得多線(xiàn)程程序的并發(fā)性高,另外,進(jìn)程在執(zhí)行過(guò)程中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線(xiàn)程共享內(nèi)存,從而極大地提高了程序的運(yùn)行效率。

  線(xiàn)程在執(zhí)行過(guò)程中與進(jìn)程還是有區(qū)別的。每個(gè)獨(dú)立的線(xiàn)程有一個(gè)程序運(yùn)行的入口、順序執(zhí)行序列和程序的出口。但是線(xiàn)程不能獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個(gè)線(xiàn)程執(zhí)行控制。

  從邏輯角度來(lái)看,多線(xiàn)程的意義在于一個(gè)應(yīng)用程序中,有多個(gè)執(zhí)行部分可以同時(shí)執(zhí)行。但操作系統(tǒng)并沒(méi)有將多個(gè)線(xiàn)程看做多個(gè)獨(dú)立的應(yīng)用,來(lái)實(shí)現(xiàn)進(jìn)程的調(diào)度和管理以及資源分配。這就是進(jìn)程和線(xiàn)程的重要區(qū)別。

  如果你的代碼所在的進(jìn)程中有多個(gè)線(xiàn)程在同時(shí)運(yùn)行,而這些線(xiàn)程可能會(huì)同時(shí)運(yùn)行這段代碼。如果每次運(yùn)行結(jié)果和單線(xiàn)程運(yùn)行的結(jié)果是一樣的,而且其他的變量的值也和預(yù)期的是一樣的,就是線(xiàn)程安全的。

  或者說(shuō):一個(gè)類(lèi)或者程序所提供的接口對(duì)于線(xiàn)程來(lái)說(shuō)是原子操作或者多個(gè)線(xiàn)程之間的切換不會(huì)導(dǎo)致該接口的執(zhí)行結(jié)果存在二義性,也就是說(shuō)我們不用考慮同步的問(wèn)題。

  線(xiàn)程安全問(wèn)題都是由全局變量及靜態(tài)變量引起的。

  若每個(gè)線(xiàn)程中對(duì)全局變量、靜態(tài)變量只有讀操作,而無(wú)寫(xiě)操作,一般來(lái)說(shuō),這個(gè)全局變量是線(xiàn)程安全的;若有多個(gè)線(xiàn)程同時(shí)執(zhí)行寫(xiě)操作,一般都需要考慮線(xiàn)程同步,否則就可能影響線(xiàn)程安全。

  另解

  說(shuō)法一:進(jìn)程是具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位.

  線(xiàn)程是進(jìn)程的一個(gè)實(shí)體,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位.線(xiàn)程自己基本上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧),但是它可與同屬一個(gè)進(jìn)程的其他的線(xiàn)程共享進(jìn)程所擁有的全部資源.

  一個(gè)線(xiàn)程可以創(chuàng)建和撤銷(xiāo)另一個(gè)線(xiàn)程;同一個(gè)進(jìn)程中的多個(gè)線(xiàn)程之間可以并發(fā)執(zhí)行

  說(shuō)法二:進(jìn)程和線(xiàn)程都是由操作系統(tǒng)所體會(huì)的程序運(yùn)行的基本單元,系統(tǒng)利用該基本單元實(shí)現(xiàn)系統(tǒng)對(duì)應(yīng)用的并發(fā)性。進(jìn)程和線(xiàn)程的區(qū)別在于:

  簡(jiǎn)而言之,一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線(xiàn)程.

  線(xiàn)程的劃分尺度小于進(jìn)程,使得多線(xiàn)程程序的并發(fā)性高。

  另外,進(jìn)程在執(zhí)行過(guò)程中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線(xiàn)程共享內(nèi)存,從而極大地提高了程序的運(yùn)行效率。

  線(xiàn)程在執(zhí)行過(guò)程中與進(jìn)程還是有區(qū)別的。每個(gè)獨(dú)立的線(xiàn)程有一個(gè)程序運(yùn)行的入口、順序執(zhí)行序列和程序的出口。但是線(xiàn)程不能夠獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個(gè)線(xiàn)程執(zhí)行控制。

  從邏輯角度來(lái)看,多線(xiàn)程的意義在于一個(gè)應(yīng)用程序中,有多個(gè)執(zhí)行部分可以同時(shí)執(zhí)行。但操作系統(tǒng)并沒(méi)有將多個(gè)線(xiàn)程看做多個(gè)獨(dú)立的應(yīng)用,來(lái)實(shí)現(xiàn)進(jìn)程的調(diào)度和管理以及資源分配。這就是進(jìn)程和線(xiàn)程的重要區(qū)別。

  說(shuō)法三:多線(xiàn)程共存于應(yīng)用程序中是現(xiàn)代操作系統(tǒng)中的基本特征和重要標(biāo)志。用過(guò)UNIX操作系統(tǒng)的讀者知道進(jìn)程,在UNIX操作系統(tǒng)中,每個(gè)應(yīng)用程序的執(zhí)行都在操作系統(tǒng)內(nèi)核中登記一個(gè)進(jìn)程標(biāo)志,操作系統(tǒng)根據(jù)分配的標(biāo)志對(duì)應(yīng)用程序的執(zhí)行進(jìn)行調(diào)度和系統(tǒng)資源分配,但進(jìn)程和線(xiàn)程有什么區(qū)別呢?

  進(jìn)程和線(xiàn)程都是由操作系統(tǒng)所體會(huì)的程序運(yùn)行的基本單元,系統(tǒng)利用該基本單元實(shí)現(xiàn)系統(tǒng)對(duì)應(yīng)用的并發(fā)性。進(jìn)程和線(xiàn)程的區(qū)別在于:

  線(xiàn)程的劃分尺度小于進(jìn)程,使得多線(xiàn)程程序的并發(fā)性高。

  另外,進(jìn)程在執(zhí)行過(guò)程中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線(xiàn)程共享內(nèi)存,從而極大地提高了程序的運(yùn)行效率。

  線(xiàn)程在執(zhí)行過(guò)程中與進(jìn)程還是有區(qū)別的。每個(gè)獨(dú)立的線(xiàn)程有一個(gè)程序運(yùn)行的入口、順序執(zhí)行序列和程序的出口。但是線(xiàn)程不能夠獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個(gè)線(xiàn)程執(zhí)行控制。

  從邏輯角度來(lái)看,多線(xiàn)程的意義在于一個(gè)應(yīng)用程序中,有多個(gè)執(zhí)行部分可以同時(shí)執(zhí)行。但操作系統(tǒng)并沒(méi)有將多個(gè)線(xiàn)程看做多個(gè)獨(dú)立的應(yīng)用,來(lái)實(shí)現(xiàn)進(jìn)程的調(diào)度和管理以及資源分配。這就是進(jìn)程和線(xiàn)程的重要區(qū)別。

  進(jìn)程(Process)是最初定義在Unix等多用戶(hù)、多任務(wù)操作系統(tǒng)環(huán)境下用于表示應(yīng)用程序在內(nèi)存環(huán)境中基本執(zhí)行單元的概念。以Unix操作系統(tǒng)為例,進(jìn)程是Unix操作系統(tǒng)環(huán)境中的基本成分、是系統(tǒng)資源分配的基本單位。Unix操作系統(tǒng)中完成的幾乎所有用戶(hù)管理和資源分配等工作都是通過(guò)操作系統(tǒng)對(duì)應(yīng)用程序進(jìn)程的控制來(lái)實(shí)現(xiàn)的。

  C、C++、Java等語(yǔ)言編寫(xiě)的源程序經(jīng)相應(yīng)的編譯器編譯成可執(zhí)行文件后,提交給計(jì)算機(jī)處理器運(yùn)行。這時(shí),處在可執(zhí)行狀態(tài)中的應(yīng)用程序稱(chēng)為進(jìn)程。從用戶(hù)角度來(lái)看,進(jìn)程是應(yīng)用程序的一個(gè)執(zhí)行過(guò)程。從操作系統(tǒng)核心角度來(lái)看,進(jìn)程代表的是操作系統(tǒng)分配的內(nèi)存、CPU時(shí)間片等資源的基本單位,是為正在運(yùn)行的程序提供的運(yùn)行環(huán)境。進(jìn)程與應(yīng)用程序的區(qū)別在于應(yīng)用程序作為一個(gè)靜態(tài)文件存儲(chǔ)在計(jì)算機(jī)系統(tǒng)的硬盤(pán)等存儲(chǔ)空間中,而進(jìn)程則是處于動(dòng)態(tài)條件下由操作系統(tǒng)維護(hù)的系統(tǒng)資源管理實(shí)體。多任務(wù)環(huán)境下應(yīng)用程序進(jìn)程的主要特點(diǎn)包括:

  ●進(jìn)程在執(zhí)行過(guò)程中有內(nèi)存單元的初始入口點(diǎn),并且進(jìn)程存活過(guò)程中始終擁有獨(dú)立的內(nèi)存地址空間;

  ●進(jìn)程的生存期狀態(tài)包括創(chuàng)建、就緒、運(yùn)行、阻塞和死亡等類(lèi)型;

  ●從應(yīng)用程序進(jìn)程在執(zhí)行過(guò)程中向CPU發(fā)出的運(yùn)行指令形式不同,可以將進(jìn)程的狀態(tài)分為用戶(hù)態(tài)和核心態(tài)。處于用戶(hù)態(tài)下的進(jìn)程執(zhí)行的是應(yīng)用程序指令、處于核心態(tài)下的應(yīng)用程序進(jìn)程執(zhí)行的是操作系統(tǒng)指令。

  在Unix操作系統(tǒng)啟動(dòng)過(guò)程中,系統(tǒng)自動(dòng)創(chuàng)建swapper、init等系統(tǒng)進(jìn)程,用于管理內(nèi)存資源以及對(duì)用戶(hù)進(jìn)程進(jìn)行調(diào)度等。在Unix環(huán)境下無(wú)論是由操作系統(tǒng)創(chuàng)建的進(jìn)程還要由應(yīng)用程序執(zhí)行創(chuàng)建的進(jìn)程,均擁有唯一的進(jìn)程標(biāo)識(shí)(PID)。

  說(shuō)法四:應(yīng)用程序在執(zhí)行過(guò)程中存在一個(gè)內(nèi)存空間的初始入口點(diǎn)地址、一個(gè)程序執(zhí)行過(guò)程中的代碼執(zhí)行序列以及用于標(biāo)識(shí)進(jìn)程結(jié)束的內(nèi)存出口點(diǎn)地址,在進(jìn)程執(zhí)行過(guò)程中的每一時(shí)間點(diǎn)均有唯一的處理器指令與內(nèi)存單元地址相對(duì)應(yīng)。

  Java語(yǔ)言中定義的線(xiàn)程(Thread)同樣包括一個(gè)內(nèi)存入口點(diǎn)地址、一個(gè)出口點(diǎn)地址以及能夠順序執(zhí)行的代碼序列。但是進(jìn)程與線(xiàn)程的重要區(qū)別在于線(xiàn)程不能夠單獨(dú)執(zhí)行,它必須運(yùn)行在處于活動(dòng)狀態(tài)的應(yīng)用程序進(jìn)程中,因此可以定義線(xiàn)程是程序內(nèi)部的具有并發(fā)性的順序代碼流。

  Unix操作系統(tǒng)和Microsoft Windows操作系統(tǒng)支持多用戶(hù)、多進(jìn)程的并發(fā)執(zhí)行,而Java語(yǔ)言支持應(yīng)用程序進(jìn)程內(nèi)部的多個(gè)執(zhí)行線(xiàn)程的并發(fā)執(zhí)行。多線(xiàn)程的意義在于一個(gè)應(yīng)用程序的多個(gè)邏輯單元可以并發(fā)地執(zhí)行。但是多線(xiàn)程并不意味著多個(gè)用戶(hù)進(jìn)程在執(zhí)行,操作系統(tǒng)也不把每個(gè)線(xiàn)程作為獨(dú)立的進(jìn)程來(lái)分配獨(dú)立的系統(tǒng)資源。進(jìn)程可以創(chuàng)建其子進(jìn)程,子進(jìn)程與父進(jìn)程擁有不同的可執(zhí)行代碼和數(shù)據(jù)內(nèi)存空間。而在用于代表應(yīng)用程序的進(jìn)程中多個(gè)線(xiàn)程共享數(shù)據(jù)內(nèi)存空間,但保持每個(gè)線(xiàn)程擁有獨(dú)立的執(zhí)行堆棧和程序執(zhí)行上下文(Context)。

  基于上述區(qū)別,線(xiàn)程也可以稱(chēng)為輕型進(jìn)程 (Light Weight Process,LWP)。不同線(xiàn)程間允許任務(wù)協(xié)作和數(shù)據(jù)交換,使得在計(jì)算機(jī)系統(tǒng)資源消耗等方面非常廉價(jià)。

  線(xiàn)程需要操作系統(tǒng)的支持,不是所有類(lèi)型的計(jì)算機(jī)都支持多線(xiàn)程應(yīng)用程序。Java程序設(shè)計(jì)語(yǔ)言將線(xiàn)程支持與語(yǔ)言運(yùn)行環(huán)境結(jié)合在一起,提供了多任務(wù)并發(fā)執(zhí)行的能力。這就好比一個(gè)人在處理家務(wù)的過(guò)程中,將衣服放到洗衣機(jī)中自動(dòng)洗滌后將大米放在電飯鍋里,然后開(kāi)始做菜。等菜做好了,飯熟了同時(shí)衣服也洗好了。

  需要注意的是:在應(yīng)用程序中使用多線(xiàn)程不會(huì)增加 CPU 的數(shù)據(jù)處理能力。只有在多CPU 的計(jì)算機(jī)或者在網(wǎng)絡(luò)計(jì)算體系結(jié)構(gòu)下,將Java程序劃分為多個(gè)并發(fā)執(zhí)行線(xiàn)程后,同時(shí)啟動(dòng)多個(gè)線(xiàn)程運(yùn)行,使不同的線(xiàn)程運(yùn)行在基于不同處理器的Java虛擬機(jī)中,才能提高應(yīng)用程序的執(zhí)行效率。

  (二)如何減少換頁(yè)錯(cuò)誤?

  1,進(jìn)程傾向于占用CPU

  2,訪(fǎng)問(wèn)局部性(localilty of reference)滿(mǎn)足進(jìn)程要求

  3,進(jìn)程傾向于占用I/O

  4,使用基于最短剩余時(shí)間(shortest remaining time)的調(diào)度機(jī)制

  5,減少頁(yè)大小

  最先排出1和3選項(xiàng),訪(fǎng)問(wèn)快慢、訪(fǎng)問(wèn)接口,對(duì)“錯(cuò)誤”能夠有什么影響?肯定是需要某種策略。

  仔細(xì)看題:“減少”,而不是“消除”,說(shuō)明這個(gè)“錯(cuò)誤”不管怎么樣,肯定是存在的;關(guān)鍵在于你是否理解“換頁(yè)錯(cuò)誤”的定義了。

  看看選項(xiàng)2和4都有點(diǎn)像;至于5嘛,不太像了——即使頁(yè)面減少,錯(cuò)誤率會(huì)降低嗎?難說(shuō),你可不知道系統(tǒng)實(shí)際運(yùn)行時(shí),數(shù)據(jù)大小、分布是什么樣的:頁(yè)面大,更可能將大數(shù)據(jù)塊放在一頁(yè)上;頁(yè)面小,則會(huì)分散數(shù)據(jù)——形象上是這么理解,但操作系統(tǒng)算法沒(méi)這么麻煩,也沒(méi)見(jiàn)過(guò)這方面的概率討論,排除。

  我猜想的答案是2,因?yàn)楸?amp;ldquo;錯(cuò)誤”2字誤導(dǎo)了:既然要減少錯(cuò)誤嘛,“局部化”是很常用的策略,錯(cuò)誤發(fā)生在局部就不至于影響全局......(歸根結(jié)底還是不明白“換頁(yè)錯(cuò)誤”的定義)其實(shí)如果仔細(xì)想想,“局部化”可以降低錯(cuò)誤的影響,但是它并不能降低錯(cuò)誤的發(fā)生概率!剩下的答案就顯而易見(jiàn)了。

  換頁(yè)錯(cuò)誤:

  Page Fault 是在進(jìn)程嘗試執(zhí)行代碼指導(dǎo),或者引用進(jìn)程所映射物理內(nèi)存中并不存在的數(shù)據(jù)頁(yè)時(shí),操作系統(tǒng)記錄的事件。換句話(huà)說(shuō),進(jìn)程需要的內(nèi)存頁(yè)實(shí)際上可能還處于物理內(nèi)存中,但是由于它無(wú)法再分配到進(jìn)程中,所以當(dāng)進(jìn)程將此頁(yè)讀取回到它的內(nèi)存頁(yè)時(shí),就發(fā)生了Page Fault。

  說(shuō)白了就是想在內(nèi)存里找東西,卻發(fā)現(xiàn)不存在(不得不重新讀取...),按道理這不應(yīng)該算“錯(cuò)誤”這么嚴(yán)重吧(簡(jiǎn)單點(diǎn),“不命中”而已)。

  采用最短剩余時(shí)間調(diào)度機(jī)制:

  SRT算法(SPN算法的搶占式版本):總是選擇剩余時(shí)間最短的進(jìn)程運(yùn)行

  為什么會(huì)減少換頁(yè)錯(cuò)誤呢?因?yàn)闀r(shí)間短的結(jié)束運(yùn)行快,不需要頻繁切換進(jìn)程(導(dǎo)致刷新內(nèi)存),所以換頁(yè)錯(cuò)誤發(fā)生的概率就減少了......

  (二)關(guān)于PV操作

  在計(jì)算機(jī)操作系統(tǒng)中,PV操作是進(jìn)程管理中的難點(diǎn)。

  首先應(yīng)弄清PV操作的含義:PV操作由P操作原語(yǔ)和V操作原語(yǔ)組成(原語(yǔ)是不可中斷的過(guò)程),對(duì)信號(hào)量進(jìn)行操作,具體定義如下:

  P(S):①將信號(hào)量S的值減1,即S=S-1;

  ②如果S>=0,則該進(jìn)程繼續(xù)執(zhí)行;否則該進(jìn)程置為等待狀態(tài),排入等待隊(duì)列。

  V(S):①將信號(hào)量S的值加1,即S=S+1;

 ?、谌绻鸖>0,則該進(jìn)程繼續(xù)執(zhí)行;否則釋放隊(duì)列中第一個(gè)等待信號(hào)量的進(jìn)程。

  PV操作的意義:我們用信號(hào)量及PV操作來(lái)實(shí)現(xiàn)進(jìn)程的同步和互斥。PV操作屬于進(jìn)程的低級(jí)通信。

  什么是信號(hào)量?信號(hào)量(semaphore)的數(shù)據(jù)結(jié)構(gòu)為一個(gè)值和一個(gè)指針,指針指向等待該信號(hào)量的下一個(gè)進(jìn)程。信號(hào)量的值與相應(yīng)資源的使用情況有關(guān)。當(dāng)它的值大于0時(shí),表示當(dāng)前可用資源的數(shù)量;當(dāng)它的值小于0時(shí),其絕對(duì)值表示等待使用該資源的進(jìn)程個(gè)數(shù)。注意,信號(hào)量的值僅能由PV操作來(lái)改變。

  一般來(lái)說(shuō),信號(hào)量S>=0時(shí),S表示可用資源的數(shù)量。執(zhí)行一次P操作意味著請(qǐng)求分配一個(gè)單位資源,因此S的值減1;當(dāng)S<0時(shí),表示已經(jīng)沒(méi)有可用資源,請(qǐng)求者必須等待別的進(jìn)程釋放該類(lèi)資源,它才能運(yùn)行下去。而執(zhí)行一個(gè)V操作意味著釋放一個(gè)單位資源,因此S的值加1;若S=<0,表示有某些進(jìn)程正在等待該資源,因此要喚醒一個(gè)等待狀態(tài)的進(jìn)程,使之運(yùn)行下去。

  利用信號(hào)量和PV操作實(shí)現(xiàn)進(jìn)程互斥的一般模型是:

  進(jìn)程P1 進(jìn)程P2 &hellip;&hellip; 進(jìn)程Pn

  &hellip;&hellip; &hellip;&hellip; &hellip;&hellip;

  P(S); P(S); P(S);

  臨界區(qū); 臨界區(qū); 臨界區(qū);

  V(S); V(S); V(S);

  &hellip;&hellip; &hellip;&hellip; &hellip;&hellip; &hellip;&hellip;

  其中信號(hào)量S用于互斥,初值為1。

  使用PV操作實(shí)現(xiàn)進(jìn)程互斥時(shí)應(yīng)該注意的是:

  (1)每個(gè)程序中用戶(hù)實(shí)現(xiàn)互斥的P、V操作必須成對(duì)出現(xiàn),先做P操作,進(jìn)臨界區(qū),后做V操作,出臨界區(qū)。若有多個(gè)分支,要認(rèn)真檢查其成對(duì)性。

  (2)P、V操作應(yīng)分別緊靠臨界區(qū)的頭尾部,臨界區(qū)的代碼應(yīng)盡可能短,不能有死循環(huán)。

  (3)互斥信號(hào)量的初值一般為1。

  利用信號(hào)量和PV操作實(shí)現(xiàn)進(jìn)程同步

  PV操作是典型的同步機(jī)制之一。用一個(gè)信號(hào)量與一個(gè)消息聯(lián)系起來(lái),當(dāng)信號(hào)量的值為0時(shí),表示期望的消息尚未產(chǎn)生;當(dāng)信號(hào)量的值非0時(shí),表示期望的消息已經(jīng)存在。用PV操作實(shí)現(xiàn)進(jìn)程同步時(shí),調(diào)用P操作測(cè)試消息是否到達(dá),調(diào)用V操作發(fā)送消息。

  使用PV操作實(shí)現(xiàn)進(jìn)程同步時(shí)應(yīng)該注意的是:

  (1)分析進(jìn)程間的制約關(guān)系,確定信號(hào)量種類(lèi)。在保持進(jìn)程間有正確的同步關(guān)系情況下,哪個(gè)進(jìn)程先執(zhí)行,哪些進(jìn)程后執(zhí)行,彼此間通過(guò)什么資源(信號(hào)量)進(jìn)行協(xié)調(diào),從而明確要設(shè)置哪些信號(hào)量。

  (2)信號(hào)量的初值與相應(yīng)資源的數(shù)量有關(guān),也與P、V操作在程序代碼中出現(xiàn)的位置有關(guān)。

  (3)同一信號(hào)量的P、V操作要成對(duì)出現(xiàn),但它們分別在不同的進(jìn)程代碼中。

  (四)用于進(jìn)程間通訊(IPC)的四種不同技術(shù):

  1. 消息傳遞(管道,FIFO,posix和system v消息隊(duì)列,信號(hào)量)

  2. 同步(互斥鎖,條件變量,讀寫(xiě)鎖,文件和記錄鎖,Posix和System V信號(hào)燈)

  3. 共享內(nèi)存區(qū)(匿名共享內(nèi)存區(qū),有名Posix共享內(nèi)存區(qū),有名System V共享內(nèi)存區(qū))

  4. 過(guò)程調(diào)用(Solaris門(mén),Sun RPC)

  消息隊(duì)列和過(guò)程調(diào)用往往單獨(dú)使用,也就是說(shuō)它們通常提供了自己的同步機(jī)制.相反,共享內(nèi)存區(qū)通常需要由應(yīng)用程序提供的某種同步形式才能正常工作.解決某個(gè)特定問(wèn)題應(yīng)使用哪種IPC不存在簡(jiǎn)單的判定,應(yīng)該逐漸熟悉各種IPC形式提供的機(jī)制,然后根據(jù)特定應(yīng)用的要求比較它們的特性.

  必須考慮的四個(gè)前提:

  1. 聯(lián)網(wǎng)的還是非聯(lián)網(wǎng)的.IPC適用于單臺(tái)主機(jī)上的進(jìn)程或線(xiàn)程間的.如果應(yīng)用程序有可能分布到多臺(tái)主機(jī)上,那就要考慮使用套接字代替IPC,從而簡(jiǎn)化以后向聯(lián)網(wǎng)的應(yīng)用程序轉(zhuǎn)移的工作.

  2. 可移植性.

  3. 性能,在具體的開(kāi)發(fā)環(huán)境下運(yùn)行測(cè)試程序,比較幾種IPC的性能差異.

  4. 實(shí)時(shí)調(diào)度.如果需要這一特性,而且所用的系統(tǒng)也支持posix實(shí)時(shí)調(diào)度選項(xiàng),那就考慮使用Posix的消息傳遞和同步函數(shù).

  各種IPC之間的一些主要差異:

  1. 管道和FIFO是字節(jié)流,沒(méi)有消息邊界.Posix消息和System V消息則有從發(fā)送者向接受者維護(hù)的記錄邊界(eg:TCP是沒(méi)有記錄邊界的字節(jié)流,UDP則提供具有記錄邊界的消息).

  2. 當(dāng)有一個(gè)消息放置到一個(gè)空隊(duì)列中時(shí),Posix消息隊(duì)列可向一個(gè)進(jìn)程發(fā)送一個(gè)信號(hào),或者啟動(dòng)一個(gè)新的線(xiàn)程.System V則不提供類(lèi)似的通知形式.

  3. 管道和FIFO的數(shù)據(jù)字節(jié)是先進(jìn)先出的.Posix消息和System V消息具有由發(fā)送者賦予的優(yōu)先級(jí).從一個(gè)Posix消息隊(duì)列讀出時(shí),首先返回的總是優(yōu)先級(jí)最高的消息.從一個(gè)System V消息隊(duì)列讀出時(shí),讀出者可以要求想要的任意優(yōu)先級(jí)的消息.

  4. 在眾多的消息傳遞技術(shù)&mdash;管道,FIFO,Posix消息隊(duì)列和System V消息隊(duì)列&mdash;中,可從一個(gè)信號(hào)處理程序中調(diào)用的函數(shù)只有read和write(適用于管道和FIFO).

  比較不同形式的消息傳遞時(shí),我們感興趣的有兩種測(cè)量尺度:

  1. 帶寬(bandwidth):數(shù)據(jù)通過(guò)IPC通道轉(zhuǎn)移的速度.為測(cè)量該值,我們從一個(gè)進(jìn)程向另一個(gè)進(jìn)程發(fā)送大量數(shù)據(jù)(幾百萬(wàn)字節(jié)).我們還給不同大小的I/O操作(例如管道和FIFO的write和read操作)測(cè)量該值,期待發(fā)現(xiàn)帶寬隨每個(gè)I/O操作的數(shù)據(jù)量的增長(zhǎng)而增長(zhǎng)的規(guī)律.

  2. 延遲(latency):一個(gè)小的IPC消息從一個(gè)進(jìn)程到令一個(gè)進(jìn)程再返回來(lái)所花的時(shí)間.我們測(cè)量的是只有一個(gè)1個(gè)字節(jié)的消息從一個(gè)進(jìn)程到令一個(gè)進(jìn)程再回來(lái)的時(shí)間(往返時(shí)間)

  在現(xiàn)實(shí)世界中,帶寬告訴我們大塊數(shù)據(jù)通過(guò)一個(gè)IPC通道發(fā)送出去需花多長(zhǎng)時(shí)間,然而IPC也用于傳遞小的控制信息,系統(tǒng)處理這些小消息所需的時(shí)間就由延遲提供.這兩個(gè)數(shù)都很重要.

  (五)多進(jìn)程和多線(xiàn)程的優(yōu)缺點(diǎn)

  Linux內(nèi)核對(duì)多進(jìn)程和多線(xiàn)程的支持方式:

  線(xiàn)程機(jī)制支持并發(fā)程序設(shè)計(jì)技術(shù),在多處理器上能真正保證并行處理。而在linux實(shí)現(xiàn)線(xiàn)程很特別,linux把所有的線(xiàn)程都當(dāng)作進(jìn)程實(shí)現(xiàn)。linux下線(xiàn)程看起來(lái)就像普通進(jìn)程(只是該進(jìn)程和其他進(jìn)程共享資源,如地址空間)。上述機(jī)制與Microsoft windows或是Sun Solaris實(shí)現(xiàn)差異很大。

  Linux的線(xiàn)程實(shí)現(xiàn)是在核外進(jìn)行的,核內(nèi)提供的是創(chuàng)建進(jìn)程的接口do_fork()。內(nèi)核提供了兩個(gè)系統(tǒng)調(diào)用__clone()和fork(),最終都用不同的參數(shù)調(diào)用do_fork()核內(nèi)API。 do_fork() 提供了很多參數(shù),包括CLONE_VM(共享內(nèi)存空間)、CLONE_FS(共享文件系統(tǒng)信息)、CLONE_FILES(共享文件描述符表)、CLONE_SIGHAND(共享信號(hào)句柄表)和CLONE_PID(共享進(jìn)程ID,僅對(duì)核內(nèi)進(jìn)程,即0號(hào)進(jìn)程有效)。當(dāng)使用fork系統(tǒng)調(diào)用產(chǎn)生多進(jìn)程時(shí),內(nèi)核調(diào)用do_fork()不使用任何共享屬性,進(jìn)程擁有獨(dú)立的運(yùn)行環(huán)境。當(dāng)使用pthread_create()來(lái)創(chuàng)建線(xiàn)程時(shí),則最終設(shè)置了所有這些屬性來(lái)調(diào)用__clone(),而這些參數(shù)又全部傳給核內(nèi)的do_fork(),從而創(chuàng)建的&rdquo;進(jìn)程&rdquo;擁有共享的運(yùn)行環(huán)境,只有棧是獨(dú)立的,由 __clone()傳入。

  即:Linux下不管是多線(xiàn)程編程還是多進(jìn)程編程,最終都是用do_fork實(shí)現(xiàn)的多進(jìn)程編程,只是進(jìn)程創(chuàng)建時(shí)的參數(shù)不同,從而導(dǎo)致有不同的共享環(huán)境。Linux線(xiàn)程在核內(nèi)是以輕量級(jí)進(jìn)程的形式存在的,擁有獨(dú)立的進(jìn)程表項(xiàng),而所有的創(chuàng)建、同步、刪除等操作都在核外pthread庫(kù)中進(jìn)行。pthread 庫(kù)使用一個(gè)管理線(xiàn)程(__pthread_manager() ,每個(gè)進(jìn)程獨(dú)立且唯一)來(lái)管理線(xiàn)程的創(chuàng)建和終止,為線(xiàn)程分配線(xiàn)程ID,發(fā)送線(xiàn)程相關(guān)的信號(hào),而主線(xiàn)程pthread_create()) 的調(diào)用者則通過(guò)管道將請(qǐng)求信息傳給管理線(xiàn)程。

  很多朋友都說(shuō)使用多線(xiàn)程的好處是資源占用少,其隱含之意就是說(shuō)進(jìn)程占用資源比線(xiàn)程多,對(duì)吧?但實(shí)際上Linux下多進(jìn)程是否就真的點(diǎn)用很多資源呢?暫且不說(shuō)進(jìn)程是否比線(xiàn)程占用資源多,就進(jìn)程占用資源的多少情況而言,Linux確實(shí)是做得相當(dāng)節(jié)省的。產(chǎn)生一個(gè)多進(jìn)程時(shí)肯定是要產(chǎn)生的一點(diǎn)內(nèi)存是要復(fù)制進(jìn)程表項(xiàng),即一個(gè)task_struct結(jié)構(gòu),但這個(gè)結(jié)構(gòu)本身做得相當(dāng)小巧。其它對(duì)于一個(gè)進(jìn)程來(lái)說(shuō)必須有的數(shù)據(jù)段、代碼段、堆棧段是不是全盤(pán)復(fù)制呢?對(duì)于多進(jìn)程來(lái)說(shuō),代碼段是肯定不用復(fù)制的,因?yàn)楦高M(jìn)程和各子進(jìn)程的代碼段是相同的,數(shù)據(jù)段和堆棧段呢?也不一定,因?yàn)樵贚inux里廣泛使用的一個(gè)技術(shù)叫copy-on-write,即寫(xiě)時(shí)拷貝。copy-on-write意味著什么呢?意味著資源節(jié)省,假設(shè)有一個(gè)變量x在父進(jìn)程里存在,當(dāng)這個(gè)父進(jìn)程創(chuàng)建一個(gè)子進(jìn)程或多個(gè)子進(jìn)程時(shí)這個(gè)變量x是否復(fù)制到了子進(jìn)程的內(nèi)存空間呢?不會(huì)的,子進(jìn)程和父進(jìn)程使用同一個(gè)內(nèi)存空間的變量,但當(dāng)子進(jìn)程或父進(jìn)程要改變變量x的值時(shí)就會(huì)復(fù)制該變量,從而導(dǎo)致父子進(jìn)程里的變量值不同。父子進(jìn)程變量是互不影響的,由于父子進(jìn)程地址空間是完全隔開(kāi)的,變量的地址可以是完全相同的。

  Linux的&rdquo;線(xiàn)程&rdquo;和&rdquo;進(jìn)程&rdquo;實(shí)際上處于一個(gè)調(diào)度層次,共享一個(gè)進(jìn)程標(biāo)識(shí)符空間,這種限制使得不可能在Linux上實(shí)現(xiàn)完全意義上的POSIX線(xiàn)程機(jī)制,因此眾多的Linux線(xiàn)程庫(kù)實(shí)現(xiàn)嘗試都只能盡可能實(shí)現(xiàn)POSIX的絕大部分語(yǔ)義,并在功能上盡可能逼近。Linux的進(jìn)程的創(chuàng)建是非常迅速的。內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)一書(shū)中甚至指出Linux創(chuàng)建進(jìn)程的速度和其他針對(duì)線(xiàn)程優(yōu)化的操作系統(tǒng)(Windows,Solaris)創(chuàng)建線(xiàn)程的速度相比,測(cè)試結(jié)果非常的好,也就是說(shuō)創(chuàng)建速度很快。由于異步信號(hào)是內(nèi)核以進(jìn)程為單位分發(fā)的,而LinuxThreads的每個(gè)線(xiàn)程對(duì)內(nèi)核來(lái)說(shuō)都是一個(gè)進(jìn)程,且沒(méi)有實(shí)現(xiàn)&rdquo;線(xiàn)程組&rdquo;,因此,某些語(yǔ)義不符合POSIX標(biāo)準(zhǔn),比如沒(méi)有實(shí)現(xiàn)向進(jìn)程中所有線(xiàn)程發(fā)送信號(hào),README對(duì)此作了說(shuō)明。LinuxThreads中的線(xiàn)程同步很大程度上是建立在信號(hào)基礎(chǔ)上的,這種通過(guò)內(nèi)核復(fù)雜的信號(hào)處理機(jī)制的同步方式,效率一直是個(gè)問(wèn)題。LinuxThreads 的問(wèn)題,特別是兼容性上的問(wèn)題,嚴(yán)重阻礙了Linux上的跨平臺(tái)應(yīng)用(如Apache)采用多線(xiàn)程設(shè)計(jì),從而使得Linux上的線(xiàn)程應(yīng)用一直保持在比較低的水平。在Linux社區(qū)中,已經(jīng)有很多人在為改進(jìn)線(xiàn)程性能而努力,其中既包括用戶(hù)級(jí)線(xiàn)程庫(kù),也包括核心級(jí)和用戶(hù)級(jí)配合改進(jìn)的線(xiàn)程庫(kù)。目前最為人看好的有兩個(gè)項(xiàng)目,一個(gè)是RedHat公司牽頭研發(fā)的NPTL(Native Posix Thread Library),另一個(gè)則是IBM投資開(kāi)發(fā)的NGPT(Next Generation Posix Threading),二者都是圍繞完全兼容POSIX 1003.1c,同時(shí)在核內(nèi)和核外做工作以而實(shí)現(xiàn)多對(duì)多線(xiàn)程模型。這兩種模型都在一定程度上彌補(bǔ)了LinuxThreads的缺點(diǎn),且都是重起爐灶全新設(shè)計(jì)的。

  綜上所述的結(jié)論是在Linux下編程多用多進(jìn)程編程少用多線(xiàn)程編程。

  IBM有個(gè)家伙做了個(gè)測(cè)試,發(fā)現(xiàn)切換線(xiàn)程context的時(shí)候,windows比linux快一倍多。進(jìn)出最快的鎖(windows2k的 critical section和linux的pthread_mutex),windows比linux的要快五倍左右。當(dāng)然這并不是說(shuō)linux不好,而且在經(jīng)過(guò)實(shí)際編程之后,綜合來(lái)看我覺(jué)得linux更適合做high performance server,不過(guò)在多線(xiàn)程這個(gè)具體的領(lǐng)域內(nèi),linux還是稍遜windows一點(diǎn)。這應(yīng)該是情有可原的,畢竟unix家族都是從多進(jìn)程過(guò)來(lái)的,而 windows從頭就是多線(xiàn)程的。

  如果是UNIX/linux環(huán)境,采用多線(xiàn)程沒(méi)必要。

  多線(xiàn)程比多進(jìn)程性能高?誤導(dǎo)!

  應(yīng)該說(shuō),多線(xiàn)程比多進(jìn)程成本低,但性能更低。

  在UNIX環(huán)境,多進(jìn)程調(diào)度開(kāi)銷(xiāo)比多線(xiàn)程調(diào)度開(kāi)銷(xiāo),沒(méi)有顯著區(qū)別,就是說(shuō),UNIX的進(jìn)程調(diào)度效率是很高的。內(nèi)存消耗方面,二者只差全局?jǐn)?shù)據(jù)區(qū),現(xiàn)在內(nèi)存都很便宜,服務(wù)器內(nèi)存動(dòng)輒若干G,根本不是問(wèn)題。

  多進(jìn)程是立體交通系統(tǒng),雖然造價(jià)高,上坡下坡多耗點(diǎn)油,但是不堵車(chē)。

  多線(xiàn)程是平面交通系統(tǒng),造價(jià)低,但紅綠燈太多,老堵車(chē)。

  我們現(xiàn)在都開(kāi)跑車(chē),油(主頻)有的是,不怕上坡下坡,就怕堵車(chē)。

  高性能交易服務(wù)器中間件,如TUXEDO,都是主張多進(jìn)程的。實(shí)際測(cè)試表明,TUXEDO性能和并發(fā)效率是非常高的。TUXEDO是貝爾實(shí)驗(yàn)室的,與UNIX同宗,應(yīng)該是對(duì)UNIX理解最為深刻的,他們的意見(jiàn)應(yīng)該具有很大的參考意義。

  塊設(shè)備與字符設(shè)備區(qū)別

  系統(tǒng)中能夠隨機(jī)(不需要按順序)訪(fǎng)問(wèn)固定大小數(shù)據(jù)片(chunks)的設(shè)備被稱(chēng)作塊設(shè)備,這些數(shù)據(jù)片就稱(chēng)作塊。最常見(jiàn)的塊設(shè)備是硬盤(pán),除此以外,還有軟盤(pán)驅(qū)動(dòng)器、CD-ROM驅(qū)動(dòng)器和閃存等等許多其他塊設(shè)備。注意,它們都是以安裝文件系統(tǒng)的方式使用的&mdash;&mdash;這也是塊設(shè)備的一般訪(fǎng)問(wèn)方式。

  另一種基本的設(shè)備類(lèi)型是字符設(shè)備。字符設(shè)備按照字符流的方式被有序訪(fǎng)問(wèn),像串口和鍵盤(pán)就都屬于字符設(shè)備。如果一個(gè)硬件設(shè)備是以字符流的方式被訪(fǎng)問(wèn)的話(huà),那就應(yīng)該將它歸于字符設(shè)備;反過(guò)來(lái),如果一個(gè)設(shè)備是隨機(jī)(無(wú)序的)訪(fǎng)問(wèn)的,那么它就屬于塊設(shè)備。

  簡(jiǎn)單來(lái)講,塊設(shè)備可以隨機(jī)存取,而字符設(shè)備不能隨機(jī)存取,塊設(shè)備通過(guò)系統(tǒng)緩存進(jìn)行讀取,不是直接和物理磁盤(pán)讀取。字符設(shè)備可以直接物理磁盤(pán)讀取。不經(jīng)過(guò)系統(tǒng)緩存。(如鍵盤(pán),直接相應(yīng)中斷)

  什么是虛擬內(nèi)存?

  虛擬內(nèi)存是計(jì)算機(jī)系統(tǒng)內(nèi)存管理的一種技術(shù)。它使得應(yīng)用程序認(rèn)為它擁有連續(xù)的可用的內(nèi)存(一個(gè)連續(xù)完整的地址空間),而實(shí)際上,它通常是被分隔成多個(gè)物理內(nèi)存碎片,還有部分暫時(shí)存儲(chǔ)在外部磁盤(pán)存儲(chǔ)器上,在需要時(shí)進(jìn)行數(shù)據(jù)交換。

  別稱(chēng)虛擬存儲(chǔ)器(Virtual Memory)。電腦中所運(yùn)行的程序均需經(jīng)由內(nèi)存執(zhí)行,若執(zhí)行的程序占用內(nèi)存很大或很多,則會(huì)導(dǎo)致內(nèi)存消耗殆盡。為解決該問(wèn)題,Windows中運(yùn)用了虛擬內(nèi)存技術(shù),即勻出一部分硬盤(pán)空間來(lái)充當(dāng)內(nèi)存使用。當(dāng)內(nèi)存耗盡時(shí),電腦就會(huì)自動(dòng)調(diào)用硬盤(pán)來(lái)充當(dāng)內(nèi)存,以緩解內(nèi)存的緊張。若計(jì)算機(jī)運(yùn)行程序或操作所需的隨機(jī)存儲(chǔ)器(RAM)不足時(shí),則 Windows 會(huì)用虛擬存儲(chǔ)器進(jìn)行補(bǔ)償。它將計(jì)算機(jī)的RAM和硬盤(pán)上的臨時(shí)空間組合。當(dāng)RAM運(yùn)行速率緩慢時(shí),它便將數(shù)據(jù)從RAM移動(dòng)到稱(chēng)為&ldquo;分頁(yè)文件&rdquo;的空間中。將數(shù)據(jù)移入分頁(yè)文件可釋放RAM,以便完成工作。 一般而言,計(jì)算機(jī)的RAM容量越大,程序運(yùn)行得越快。若計(jì)算機(jī)的速率由于RAM可用空間匱乏而減緩,則可嘗試通過(guò)增加虛擬內(nèi)存來(lái)進(jìn)行補(bǔ)償。但是,計(jì)算機(jī)從RAM讀取數(shù)據(jù)的速率要比從硬盤(pán)讀取數(shù)據(jù)的速率快,因而擴(kuò)增RAM容量(可加內(nèi)存條)是最佳選擇。


看了&ldquo;操作系統(tǒng)常見(jiàn)問(wèn)題解答&rdquo;還想看:

1.Windows操作系統(tǒng)常見(jiàn)故障解決方法匯總

2.Windows7十大常見(jiàn)問(wèn)題及解決方案

3.操作系統(tǒng)常見(jiàn)驅(qū)動(dòng)故障和解決方法

4.Unix系統(tǒng)的十大常見(jiàn)故障及解決方法

操作系統(tǒng)常見(jiàn)問(wèn)題解答

計(jì)算機(jī)操作系統(tǒng),是電子計(jì)算機(jī)系統(tǒng)中負(fù)責(zé)支撐應(yīng)用程序運(yùn)行環(huán)境以及用戶(hù)操作環(huán)境的系統(tǒng)軟件,同時(shí)也是計(jì)算機(jī)系統(tǒng)的核心與基石。接下
推薦度:
點(diǎn)擊下載文檔文檔為doc格式

精選文章

  • E道航e22操作系統(tǒng)刷機(jī)詳解
    E道航e22操作系統(tǒng)刷機(jī)詳解

    e道航 不但內(nèi)置CMMB移動(dòng)數(shù)字接收模塊以及支持RMVB直讀,而且內(nèi)置地圖方面選用了易用性比較強(qiáng)的正版凱立德C系列,接下來(lái)是小編為大家收集的E道航e22操作系

  • Win7操作系統(tǒng)開(kāi)機(jī)的原理
    Win7操作系統(tǒng)開(kāi)機(jī)的原理

    計(jì)算機(jī)系統(tǒng)將進(jìn)行加電自檢(POST)。如果通過(guò),之后BIOS會(huì)讀取主引導(dǎo)記錄(MBR)被標(biāo)記為啟動(dòng)設(shè)備的硬盤(pán)的首扇區(qū),并傳送被 Windows 7建立的控制編碼給MBR。 接

  • Eppendorf全新升級(jí)顯微操作系統(tǒng)
    Eppendorf全新升級(jí)顯微操作系統(tǒng)

    眾所周知,良好的顯微操作取決于精確、快捷、使用方便的特點(diǎn)。Eppendorf開(kāi)發(fā)的新一代顯微操作系統(tǒng)Transferman 4r,適用所有顯微鏡平臺(tái),并能與現(xiàn)有FemtoJe

  • 虛擬機(jī)中安裝蘋(píng)果操作系統(tǒng)圖文教程
    虛擬機(jī)中安裝蘋(píng)果操作系統(tǒng)圖文教程

    你還在為不知道虛擬機(jī)中安裝蘋(píng)果操作系統(tǒng)圖文教程而煩惱么?接下來(lái)是小編為大家收集的虛擬機(jī)中安裝蘋(píng)果操作系統(tǒng)圖文教程,希望能幫到大家。 虛擬機(jī)

2811395