亚洲欧美精品沙发,日韩在线精品视频,亚洲Av每日更新在线观看,亚洲国产另类一区在线5

<pre id="hdphd"></pre>

  • <div id="hdphd"><small id="hdphd"></small></div>
      學(xué)習(xí)啦>學(xué)習(xí)電腦>操作系統(tǒng)>操作系統(tǒng)基礎(chǔ)知識(shí)>

      操作系統(tǒng)常見問題解答

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

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

        操作系統(tǒng)常見問題解答

        (一)進(jìn)程與線程的區(qū)別,線程安全&rdquo;怎么理解?

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

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

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

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

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

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

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

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

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

        另解

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

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

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

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

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

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

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

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

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

        說法三:多線程共存于應(yīng)用程序中是現(xiàn)代操作系統(tǒng)中的基本特征和重要標(biāo)志。用過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)程和線程有什么區(qū)別呢?

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

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

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

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

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

        進(jìn)程(Process)是最初定義在Unix等多用戶、多任務(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)中完成的幾乎所有用戶管理和資源分配等工作都是通過操作系統(tǒng)對(duì)應(yīng)用程序進(jìn)程的控制來實(shí)現(xiàn)的。

        C、C++、Java等語言編寫的源程序經(jīng)相應(yīng)的編譯器編譯成可執(zhí)行文件后,提交給計(jì)算機(jī)處理器運(yùn)行。這時(shí),處在可執(zhí)行狀態(tài)中的應(yīng)用程序稱為進(jìn)程。從用戶角度來看,進(jìn)程是應(yīng)用程序的一個(gè)執(zhí)行過程。從操作系統(tǒng)核心角度來看,進(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)的硬盤等存儲(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í)行過程中有內(nèi)存單元的初始入口點(diǎn),并且進(jìn)程存活過程中始終擁有獨(dú)立的內(nèi)存地址空間;

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

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

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

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

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

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

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

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

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

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

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

        2,訪問局部性(localilty of reference)滿足進(jìn)程要求

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

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

        5,減少頁大小

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

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

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

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

        換頁錯(cuò)誤:

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

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

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

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

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

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

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

        首先應(yīng)弄清PV操作的含義:PV操作由P操作原語和V操作原語組成(原語是不可中斷的過程),對(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;

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

        PV操作的意義:我們用信號(hào)量及PV操作來實(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操作來改變。

        一般來說,信號(hào)量S>=0時(shí),S表示可用資源的數(shù)量。執(zhí)行一次P操作意味著請(qǐng)求分配一個(gè)單位資源,因此S的值減1;當(dāng)S<0時(shí),表示已經(jīng)沒有可用資源,請(qǐng)求者必須等待別的進(jìn)程釋放該類資源,它才能運(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è)程序中用戶實(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)系起來,當(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)量種類。在保持進(jìn)程間有正確的同步關(guān)系情況下,哪個(gè)進(jìn)程先執(zhí)行,哪些進(jìn)程后執(zhí)行,彼此間通過什么資源(信號(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. 同步(互斥鎖,條件變量,讀寫鎖,文件和記錄鎖,Posix和System V信號(hào)燈)

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

        4. 過程調(diào)用(Solaris門,Sun RPC)

        消息隊(duì)列和過程調(diào)用往往單獨(dú)使用,也就是說它們通常提供了自己的同步機(jī)制.相反,共享內(nèi)存區(qū)通常需要由應(yīng)用程序提供的某種同步形式才能正常工作.解決某個(gè)特定問題應(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)程或線程間的.如果應(yīng)用程序有可能分布到多臺(tái)主機(jī)上,那就要考慮使用套接字代替IPC,從而簡(jiǎn)化以后向聯(lián)網(wǎng)的應(yīng)用程序轉(zhuǎn)移的工作.

        2. 可移植性.

        3. 性能,在具體的開發(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é)流,沒有消息邊界.Posix消息和System V消息則有從發(fā)送者向接受者維護(hù)的記錄邊界(eg:TCP是沒有記錄邊界的字節(jié)流,UDP則提供具有記錄邊界的消息).

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

        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ù)通過IPC通道轉(zhuǎn)移的速度.為測(cè)量該值,我們從一個(gè)進(jìn)程向另一個(gè)進(jìn)程發(fā)送大量數(shù)據(jù)(幾百萬字節(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)程再返回來所花的時(shí)間.我們測(cè)量的是只有一個(gè)1個(gè)字節(jié)的消息從一個(gè)進(jìn)程到令一個(gè)進(jìn)程再回來的時(shí)間(往返時(shí)間)

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

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

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

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

        Linux的線程實(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()來創(chuàng)建線程時(shí),則最終設(shè)置了所有這些屬性來調(diào)用__clone(),而這些參數(shù)又全部傳給核內(nèi)的do_fork(),從而創(chuàng)建的&rdquo;進(jìn)程&rdquo;擁有共享的運(yùn)行環(huán)境,只有棧是獨(dú)立的,由 __clone()傳入。

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

        很多朋友都說使用多線程的好處是資源占用少,其隱含之意就是說進(jìn)程占用資源比線程多,對(duì)吧?但實(shí)際上Linux下多進(jìn)程是否就真的點(diǎn)用很多資源呢?暫且不說進(jì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)程來說必須有的數(shù)據(jù)段、代碼段、堆棧段是不是全盤復(fù)制呢?對(duì)于多進(jìn)程來說,代碼段是肯定不用復(fù)制的,因?yàn)楦高M(jìn)程和各子進(jìn)程的代碼段是相同的,數(shù)據(jù)段和堆棧段呢?也不一定,因?yàn)樵贚inux里廣泛使用的一個(gè)技術(shù)叫copy-on-write,即寫時(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)程地址空間是完全隔開的,變量的地址可以是完全相同的。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        簡(jiǎn)單來講,塊設(shè)備可以隨機(jī)存取,而字符設(shè)備不能隨機(jī)存取,塊設(shè)備通過系統(tǒng)緩存進(jìn)行讀取,不是直接和物理磁盤讀取。字符設(shè)備可以直接物理磁盤讀取。不經(jīng)過系統(tǒng)緩存。(如鍵盤,直接相應(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ǔ)在外部磁盤存儲(chǔ)器上,在需要時(shí)進(jìn)行數(shù)據(jù)交換。

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


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

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

      2.Windows7十大常見問題及解決方案

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

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

      操作系統(tǒng)常見問題解答

      計(jì)算機(jī)操作系統(tǒng),是電子計(jì)算機(jī)系統(tǒng)中負(fù)責(zé)支撐應(yīng)用程序運(yùn)行環(huán)境以及用戶操作環(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系列,接下來是小編為大家收集的E道航e22操作系

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

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

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

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

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

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

      2811395