操作系統(tǒng)常見問題解答
計算機操作系統(tǒng),是電子計算機系統(tǒng)中負責(zé)支撐應(yīng)用程序運行環(huán)境以及用戶操作環(huán)境的系統(tǒng)軟件,同時也是計算機系統(tǒng)的核心與基石。接下來是小編為大家收集的操作系統(tǒng)常見問題解答,希望能幫到大家。
操作系統(tǒng)常見問題解答
(一)進程與線程的區(qū)別,線程安全”怎么理解?
進程和線程都是由操作系統(tǒng)所體會的程序運行的基本單元,系統(tǒng)利用該基本單元實現(xiàn)系統(tǒng)對應(yīng)得并發(fā)性。進程和線程的區(qū)別在于:
一個程序至少有一個進程,一個進程至少有一個線程。
線程的劃分尺度小于進程,使得多線程程序的并發(fā)性高,另外,進程在執(zhí)行過程中擁有獨立的內(nèi)存單元,而多個線程共享內(nèi)存,從而極大地提高了程序的運行效率。
線程在執(zhí)行過程中與進程還是有區(qū)別的。每個獨立的線程有一個程序運行的入口、順序執(zhí)行序列和程序的出口。但是線程不能獨立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個線程執(zhí)行控制。
從邏輯角度來看,多線程的意義在于一個應(yīng)用程序中,有多個執(zhí)行部分可以同時執(zhí)行。但操作系統(tǒng)并沒有將多個線程看做多個獨立的應(yīng)用,來實現(xiàn)進程的調(diào)度和管理以及資源分配。這就是進程和線程的重要區(qū)別。
如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結(jié)果和單線程運行的結(jié)果是一樣的,而且其他的變量的值也和預(yù)期的是一樣的,就是線程安全的。
或者說:一個類或者程序所提供的接口對于線程來說是原子操作或者多個線程之間的切換不會導(dǎo)致該接口的執(zhí)行結(jié)果存在二義性,也就是說我們不用考慮同步的問題。
線程安全問題都是由全局變量及靜態(tài)變量引起的。
若每個線程中對全局變量、靜態(tài)變量只有讀操作,而無寫操作,一般來說,這個全局變量是線程安全的;若有多個線程同時執(zhí)行寫操作,一般都需要考慮線程同步,否則就可能影響線程安全。
另解
說法一:進程是具有一定獨立功能的程序關(guān)于某個數(shù)據(jù)集合上的一次運行活動,進程是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位.
線程是進程的一個實體,是CPU調(diào)度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源(如程序計數(shù)器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源.
一個線程可以創(chuàng)建和撤銷另一個線程;同一個進程中的多個線程之間可以并發(fā)執(zhí)行
說法二:進程和線程都是由操作系統(tǒng)所體會的程序運行的基本單元,系統(tǒng)利用該基本單元實現(xiàn)系統(tǒng)對應(yīng)用的并發(fā)性。進程和線程的區(qū)別在于:
簡而言之,一個程序至少有一個進程,一個進程至少有一個線程.
線程的劃分尺度小于進程,使得多線程程序的并發(fā)性高。
另外,進程在執(zhí)行過程中擁有獨立的內(nèi)存單元,而多個線程共享內(nèi)存,從而極大地提高了程序的運行效率。
線程在執(zhí)行過程中與進程還是有區(qū)別的。每個獨立的線程有一個程序運行的入口、順序執(zhí)行序列和程序的出口。但是線程不能夠獨立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個線程執(zhí)行控制。
從邏輯角度來看,多線程的意義在于一個應(yīng)用程序中,有多個執(zhí)行部分可以同時執(zhí)行。但操作系統(tǒng)并沒有將多個線程看做多個獨立的應(yīng)用,來實現(xiàn)進程的調(diào)度和管理以及資源分配。這就是進程和線程的重要區(qū)別。
說法三:多線程共存于應(yīng)用程序中是現(xiàn)代操作系統(tǒng)中的基本特征和重要標志。用過UNIX操作系統(tǒng)的讀者知道進程,在UNIX操作系統(tǒng)中,每個應(yīng)用程序的執(zhí)行都在操作系統(tǒng)內(nèi)核中登記一個進程標志,操作系統(tǒng)根據(jù)分配的標志對應(yīng)用程序的執(zhí)行進行調(diào)度和系統(tǒng)資源分配,但進程和線程有什么區(qū)別呢?
進程和線程都是由操作系統(tǒng)所體會的程序運行的基本單元,系統(tǒng)利用該基本單元實現(xiàn)系統(tǒng)對應(yīng)用的并發(fā)性。進程和線程的區(qū)別在于:
線程的劃分尺度小于進程,使得多線程程序的并發(fā)性高。
另外,進程在執(zhí)行過程中擁有獨立的內(nèi)存單元,而多個線程共享內(nèi)存,從而極大地提高了程序的運行效率。
線程在執(zhí)行過程中與進程還是有區(qū)別的。每個獨立的線程有一個程序運行的入口、順序執(zhí)行序列和程序的出口。但是線程不能夠獨立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個線程執(zhí)行控制。
從邏輯角度來看,多線程的意義在于一個應(yīng)用程序中,有多個執(zhí)行部分可以同時執(zhí)行。但操作系統(tǒng)并沒有將多個線程看做多個獨立的應(yīng)用,來實現(xiàn)進程的調(diào)度和管理以及資源分配。這就是進程和線程的重要區(qū)別。
進程(Process)是最初定義在Unix等多用戶、多任務(wù)操作系統(tǒng)環(huán)境下用于表示應(yīng)用程序在內(nèi)存環(huán)境中基本執(zhí)行單元的概念。以Unix操作系統(tǒng)為例,進程是Unix操作系統(tǒng)環(huán)境中的基本成分、是系統(tǒng)資源分配的基本單位。Unix操作系統(tǒng)中完成的幾乎所有用戶管理和資源分配等工作都是通過操作系統(tǒng)對應(yīng)用程序進程的控制來實現(xiàn)的。
C、C++、Java等語言編寫的源程序經(jīng)相應(yīng)的編譯器編譯成可執(zhí)行文件后,提交給計算機處理器運行。這時,處在可執(zhí)行狀態(tài)中的應(yīng)用程序稱為進程。從用戶角度來看,進程是應(yīng)用程序的一個執(zhí)行過程。從操作系統(tǒng)核心角度來看,進程代表的是操作系統(tǒng)分配的內(nèi)存、CPU時間片等資源的基本單位,是為正在運行的程序提供的運行環(huán)境。進程與應(yīng)用程序的區(qū)別在于應(yīng)用程序作為一個靜態(tài)文件存儲在計算機系統(tǒng)的硬盤等存儲空間中,而進程則是處于動態(tài)條件下由操作系統(tǒng)維護的系統(tǒng)資源管理實體。多任務(wù)環(huán)境下應(yīng)用程序進程的主要特點包括:
●進程在執(zhí)行過程中有內(nèi)存單元的初始入口點,并且進程存活過程中始終擁有獨立的內(nèi)存地址空間;
●進程的生存期狀態(tài)包括創(chuàng)建、就緒、運行、阻塞和死亡等類型;
●從應(yīng)用程序進程在執(zhí)行過程中向CPU發(fā)出的運行指令形式不同,可以將進程的狀態(tài)分為用戶態(tài)和核心態(tài)。處于用戶態(tài)下的進程執(zhí)行的是應(yīng)用程序指令、處于核心態(tài)下的應(yīng)用程序進程執(zhí)行的是操作系統(tǒng)指令。
在Unix操作系統(tǒng)啟動過程中,系統(tǒng)自動創(chuàng)建swapper、init等系統(tǒng)進程,用于管理內(nèi)存資源以及對用戶進程進行調(diào)度等。在Unix環(huán)境下無論是由操作系統(tǒng)創(chuàng)建的進程還要由應(yīng)用程序執(zhí)行創(chuàng)建的進程,均擁有唯一的進程標識(PID)。
說法四:應(yīng)用程序在執(zhí)行過程中存在一個內(nèi)存空間的初始入口點地址、一個程序執(zhí)行過程中的代碼執(zhí)行序列以及用于標識進程結(jié)束的內(nèi)存出口點地址,在進程執(zhí)行過程中的每一時間點均有唯一的處理器指令與內(nèi)存單元地址相對應(yīng)。
Java語言中定義的線程(Thread)同樣包括一個內(nèi)存入口點地址、一個出口點地址以及能夠順序執(zhí)行的代碼序列。但是進程與線程的重要區(qū)別在于線程不能夠單獨執(zhí)行,它必須運行在處于活動狀態(tài)的應(yīng)用程序進程中,因此可以定義線程是程序內(nèi)部的具有并發(fā)性的順序代碼流。
Unix操作系統(tǒng)和Microsoft Windows操作系統(tǒng)支持多用戶、多進程的并發(fā)執(zhí)行,而Java語言支持應(yīng)用程序進程內(nèi)部的多個執(zhí)行線程的并發(fā)執(zhí)行。多線程的意義在于一個應(yīng)用程序的多個邏輯單元可以并發(fā)地執(zhí)行。但是多線程并不意味著多個用戶進程在執(zhí)行,操作系統(tǒng)也不把每個線程作為獨立的進程來分配獨立的系統(tǒng)資源。進程可以創(chuàng)建其子進程,子進程與父進程擁有不同的可執(zhí)行代碼和數(shù)據(jù)內(nèi)存空間。而在用于代表應(yīng)用程序的進程中多個線程共享數(shù)據(jù)內(nèi)存空間,但保持每個線程擁有獨立的執(zhí)行堆棧和程序執(zhí)行上下文(Context)。
基于上述區(qū)別,線程也可以稱為輕型進程 (Light Weight Process,LWP)。不同線程間允許任務(wù)協(xié)作和數(shù)據(jù)交換,使得在計算機系統(tǒng)資源消耗等方面非常廉價。
線程需要操作系統(tǒng)的支持,不是所有類型的計算機都支持多線程應(yīng)用程序。Java程序設(shè)計語言將線程支持與語言運行環(huán)境結(jié)合在一起,提供了多任務(wù)并發(fā)執(zhí)行的能力。這就好比一個人在處理家務(wù)的過程中,將衣服放到洗衣機中自動洗滌后將大米放在電飯鍋里,然后開始做菜。等菜做好了,飯熟了同時衣服也洗好了。
需要注意的是:在應(yīng)用程序中使用多線程不會增加 CPU 的數(shù)據(jù)處理能力。只有在多CPU 的計算機或者在網(wǎng)絡(luò)計算體系結(jié)構(gòu)下,將Java程序劃分為多個并發(fā)執(zhí)行線程后,同時啟動多個線程運行,使不同的線程運行在基于不同處理器的Java虛擬機中,才能提高應(yīng)用程序的執(zhí)行效率。
(二)如何減少換頁錯誤?
1,進程傾向于占用CPU
2,訪問局部性(localilty of reference)滿足進程要求
3,進程傾向于占用I/O
4,使用基于最短剩余時間(shortest remaining time)的調(diào)度機制
5,減少頁大小
最先排出1和3選項,訪問快慢、訪問接口,對“錯誤”能夠有什么影響?肯定是需要某種策略。
仔細看題:“減少”,而不是“消除”,說明這個“錯誤”不管怎么樣,肯定是存在的;關(guān)鍵在于你是否理解“換頁錯誤”的定義了。
看看選項2和4都有點像;至于5嘛,不太像了——即使頁面減少,錯誤率會降低嗎?難說,你可不知道系統(tǒng)實際運行時,數(shù)據(jù)大小、分布是什么樣的:頁面大,更可能將大數(shù)據(jù)塊放在一頁上;頁面小,則會分散數(shù)據(jù)——形象上是這么理解,但操作系統(tǒng)算法沒這么麻煩,也沒見過這方面的概率討論,排除。
我猜想的答案是2,因為被“錯誤”2字誤導(dǎo)了:既然要減少錯誤嘛,“局部化”是很常用的策略,錯誤發(fā)生在局部就不至于影響全局......(歸根結(jié)底還是不明白“換頁錯誤”的定義)其實如果仔細想想,“局部化”可以降低錯誤的影響,但是它并不能降低錯誤的發(fā)生概率!剩下的答案就顯而易見了。
換頁錯誤:
Page Fault 是在進程嘗試執(zhí)行代碼指導(dǎo),或者引用進程所映射物理內(nèi)存中并不存在的數(shù)據(jù)頁時,操作系統(tǒng)記錄的事件。換句話說,進程需要的內(nèi)存頁實際上可能還處于物理內(nèi)存中,但是由于它無法再分配到進程中,所以當進程將此頁讀取回到它的內(nèi)存頁時,就發(fā)生了Page Fault。
說白了就是想在內(nèi)存里找東西,卻發(fā)現(xiàn)不存在(不得不重新讀取...),按道理這不應(yīng)該算“錯誤”這么嚴重吧(簡單點,“不命中”而已)。
采用最短剩余時間調(diào)度機制:
SRT算法(SPN算法的搶占式版本):總是選擇剩余時間最短的進程運行
為什么會減少換頁錯誤呢?因為時間短的結(jié)束運行快,不需要頻繁切換進程(導(dǎo)致刷新內(nèi)存),所以換頁錯誤發(fā)生的概率就減少了......
(二)關(guān)于PV操作
在計算機操作系統(tǒng)中,PV操作是進程管理中的難點。
首先應(yīng)弄清PV操作的含義:PV操作由P操作原語和V操作原語組成(原語是不可中斷的過程),對信號量進行操作,具體定義如下:
P(S):①將信號量S的值減1,即S=S-1;
?、谌绻鸖>=0,則該進程繼續(xù)執(zhí)行;否則該進程置為等待狀態(tài),排入等待隊列。
V(S):①將信號量S的值加1,即S=S+1;
?、谌绻鸖>0,則該進程繼續(xù)執(zhí)行;否則釋放隊列中第一個等待信號量的進程。
PV操作的意義:我們用信號量及PV操作來實現(xiàn)進程的同步和互斥。PV操作屬于進程的低級通信。
什么是信號量?信號量(semaphore)的數(shù)據(jù)結(jié)構(gòu)為一個值和一個指針,指針指向等待該信號量的下一個進程。信號量的值與相應(yīng)資源的使用情況有關(guān)。當它的值大于0時,表示當前可用資源的數(shù)量;當它的值小于0時,其絕對值表示等待使用該資源的進程個數(shù)。注意,信號量的值僅能由PV操作來改變。
一般來說,信號量S>=0時,S表示可用資源的數(shù)量。執(zhí)行一次P操作意味著請求分配一個單位資源,因此S的值減1;當S<0時,表示已經(jīng)沒有可用資源,請求者必須等待別的進程釋放該類資源,它才能運行下去。而執(zhí)行一個V操作意味著釋放一個單位資源,因此S的值加1;若S=<0,表示有某些進程正在等待該資源,因此要喚醒一個等待狀態(tài)的進程,使之運行下去。
利用信號量和PV操作實現(xiàn)進程互斥的一般模型是:
進程P1 進程P2 …… 進程Pn
…… …… ……
P(S); P(S); P(S);
臨界區(qū); 臨界區(qū); 臨界區(qū);
V(S); V(S); V(S);
…… …… …… ……
其中信號量S用于互斥,初值為1。
使用PV操作實現(xiàn)進程互斥時應(yīng)該注意的是:
(1)每個程序中用戶實現(xiàn)互斥的P、V操作必須成對出現(xiàn),先做P操作,進臨界區(qū),后做V操作,出臨界區(qū)。若有多個分支,要認真檢查其成對性。
(2)P、V操作應(yīng)分別緊靠臨界區(qū)的頭尾部,臨界區(qū)的代碼應(yīng)盡可能短,不能有死循環(huán)。
(3)互斥信號量的初值一般為1。
利用信號量和PV操作實現(xiàn)進程同步
PV操作是典型的同步機制之一。用一個信號量與一個消息聯(lián)系起來,當信號量的值為0時,表示期望的消息尚未產(chǎn)生;當信號量的值非0時,表示期望的消息已經(jīng)存在。用PV操作實現(xiàn)進程同步時,調(diào)用P操作測試消息是否到達,調(diào)用V操作發(fā)送消息。
使用PV操作實現(xiàn)進程同步時應(yīng)該注意的是:
(1)分析進程間的制約關(guān)系,確定信號量種類。在保持進程間有正確的同步關(guān)系情況下,哪個進程先執(zhí)行,哪些進程后執(zhí)行,彼此間通過什么資源(信號量)進行協(xié)調(diào),從而明確要設(shè)置哪些信號量。
(2)信號量的初值與相應(yīng)資源的數(shù)量有關(guān),也與P、V操作在程序代碼中出現(xiàn)的位置有關(guān)。
(3)同一信號量的P、V操作要成對出現(xiàn),但它們分別在不同的進程代碼中。
(四)用于進程間通訊(IPC)的四種不同技術(shù):
1. 消息傳遞(管道,FIFO,posix和system v消息隊列,信號量)
2. 同步(互斥鎖,條件變量,讀寫鎖,文件和記錄鎖,Posix和System V信號燈)
3. 共享內(nèi)存區(qū)(匿名共享內(nèi)存區(qū),有名Posix共享內(nèi)存區(qū),有名System V共享內(nèi)存區(qū))
4. 過程調(diào)用(Solaris門,Sun RPC)
消息隊列和過程調(diào)用往往單獨使用,也就是說它們通常提供了自己的同步機制.相反,共享內(nèi)存區(qū)通常需要由應(yīng)用程序提供的某種同步形式才能正常工作.解決某個特定問題應(yīng)使用哪種IPC不存在簡單的判定,應(yīng)該逐漸熟悉各種IPC形式提供的機制,然后根據(jù)特定應(yīng)用的要求比較它們的特性.
必須考慮的四個前提:
1. 聯(lián)網(wǎng)的還是非聯(lián)網(wǎng)的.IPC適用于單臺主機上的進程或線程間的.如果應(yīng)用程序有可能分布到多臺主機上,那就要考慮使用套接字代替IPC,從而簡化以后向聯(lián)網(wǎng)的應(yīng)用程序轉(zhuǎn)移的工作.
2. 可移植性.
3. 性能,在具體的開發(fā)環(huán)境下運行測試程序,比較幾種IPC的性能差異.
4. 實時調(diào)度.如果需要這一特性,而且所用的系統(tǒng)也支持posix實時調(diào)度選項,那就考慮使用Posix的消息傳遞和同步函數(shù).
各種IPC之間的一些主要差異:
1. 管道和FIFO是字節(jié)流,沒有消息邊界.Posix消息和System V消息則有從發(fā)送者向接受者維護的記錄邊界(eg:TCP是沒有記錄邊界的字節(jié)流,UDP則提供具有記錄邊界的消息).
2. 當有一個消息放置到一個空隊列中時,Posix消息隊列可向一個進程發(fā)送一個信號,或者啟動一個新的線程.System V則不提供類似的通知形式.
3. 管道和FIFO的數(shù)據(jù)字節(jié)是先進先出的.Posix消息和System V消息具有由發(fā)送者賦予的優(yōu)先級.從一個Posix消息隊列讀出時,首先返回的總是優(yōu)先級最高的消息.從一個System V消息隊列讀出時,讀出者可以要求想要的任意優(yōu)先級的消息.
4. 在眾多的消息傳遞技術(shù)—管道,FIFO,Posix消息隊列和System V消息隊列—中,可從一個信號處理程序中調(diào)用的函數(shù)只有read和write(適用于管道和FIFO).
比較不同形式的消息傳遞時,我們感興趣的有兩種測量尺度:
1. 帶寬(bandwidth):數(shù)據(jù)通過IPC通道轉(zhuǎn)移的速度.為測量該值,我們從一個進程向另一個進程發(fā)送大量數(shù)據(jù)(幾百萬字節(jié)).我們還給不同大小的I/O操作(例如管道和FIFO的write和read操作)測量該值,期待發(fā)現(xiàn)帶寬隨每個I/O操作的數(shù)據(jù)量的增長而增長的規(guī)律.
2. 延遲(latency):一個小的IPC消息從一個進程到令一個進程再返回來所花的時間.我們測量的是只有一個1個字節(jié)的消息從一個進程到令一個進程再回來的時間(往返時間)
在現(xiàn)實世界中,帶寬告訴我們大塊數(shù)據(jù)通過一個IPC通道發(fā)送出去需花多長時間,然而IPC也用于傳遞小的控制信息,系統(tǒng)處理這些小消息所需的時間就由延遲提供.這兩個數(shù)都很重要.
(五)多進程和多線程的優(yōu)缺點
Linux內(nèi)核對多進程和多線程的支持方式:
線程機制支持并發(fā)程序設(shè)計技術(shù),在多處理器上能真正保證并行處理。而在linux實現(xiàn)線程很特別,linux把所有的線程都當作進程實現(xiàn)。linux下線程看起來就像普通進程(只是該進程和其他進程共享資源,如地址空間)。上述機制與Microsoft windows或是Sun Solaris實現(xiàn)差異很大。
Linux的線程實現(xiàn)是在核外進行的,核內(nèi)提供的是創(chuàng)建進程的接口do_fork()。內(nèi)核提供了兩個系統(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(共享信號句柄表)和CLONE_PID(共享進程ID,僅對核內(nèi)進程,即0號進程有效)。當使用fork系統(tǒng)調(diào)用產(chǎn)生多進程時,內(nèi)核調(diào)用do_fork()不使用任何共享屬性,進程擁有獨立的運行環(huán)境。當使用pthread_create()來創(chuàng)建線程時,則最終設(shè)置了所有這些屬性來調(diào)用__clone(),而這些參數(shù)又全部傳給核內(nèi)的do_fork(),從而創(chuàng)建的”進程”擁有共享的運行環(huán)境,只有棧是獨立的,由 __clone()傳入。
即:Linux下不管是多線程編程還是多進程編程,最終都是用do_fork實現(xiàn)的多進程編程,只是進程創(chuàng)建時的參數(shù)不同,從而導(dǎo)致有不同的共享環(huán)境。Linux線程在核內(nèi)是以輕量級進程的形式存在的,擁有獨立的進程表項,而所有的創(chuàng)建、同步、刪除等操作都在核外pthread庫中進行。pthread 庫使用一個管理線程(__pthread_manager() ,每個進程獨立且唯一)來管理線程的創(chuàng)建和終止,為線程分配線程ID,發(fā)送線程相關(guān)的信號,而主線程pthread_create()) 的調(diào)用者則通過管道將請求信息傳給管理線程。
很多朋友都說使用多線程的好處是資源占用少,其隱含之意就是說進程占用資源比線程多,對吧?但實際上Linux下多進程是否就真的點用很多資源呢?暫且不說進程是否比線程占用資源多,就進程占用資源的多少情況而言,Linux確實是做得相當節(jié)省的。產(chǎn)生一個多進程時肯定是要產(chǎn)生的一點內(nèi)存是要復(fù)制進程表項,即一個task_struct結(jié)構(gòu),但這個結(jié)構(gòu)本身做得相當小巧。其它對于一個進程來說必須有的數(shù)據(jù)段、代碼段、堆棧段是不是全盤復(fù)制呢?對于多進程來說,代碼段是肯定不用復(fù)制的,因為父進程和各子進程的代碼段是相同的,數(shù)據(jù)段和堆棧段呢?也不一定,因為在Linux里廣泛使用的一個技術(shù)叫copy-on-write,即寫時拷貝。copy-on-write意味著什么呢?意味著資源節(jié)省,假設(shè)有一個變量x在父進程里存在,當這個父進程創(chuàng)建一個子進程或多個子進程時這個變量x是否復(fù)制到了子進程的內(nèi)存空間呢?不會的,子進程和父進程使用同一個內(nèi)存空間的變量,但當子進程或父進程要改變變量x的值時就會復(fù)制該變量,從而導(dǎo)致父子進程里的變量值不同。父子進程變量是互不影響的,由于父子進程地址空間是完全隔開的,變量的地址可以是完全相同的。
Linux的”線程”和”進程”實際上處于一個調(diào)度層次,共享一個進程標識符空間,這種限制使得不可能在Linux上實現(xiàn)完全意義上的POSIX線程機制,因此眾多的Linux線程庫實現(xiàn)嘗試都只能盡可能實現(xiàn)POSIX的絕大部分語義,并在功能上盡可能逼近。Linux的進程的創(chuàng)建是非常迅速的。內(nèi)核設(shè)計與實現(xiàn)一書中甚至指出Linux創(chuàng)建進程的速度和其他針對線程優(yōu)化的操作系統(tǒng)(Windows,Solaris)創(chuàng)建線程的速度相比,測試結(jié)果非常的好,也就是說創(chuàng)建速度很快。由于異步信號是內(nèi)核以進程為單位分發(fā)的,而LinuxThreads的每個線程對內(nèi)核來說都是一個進程,且沒有實現(xiàn)”線程組”,因此,某些語義不符合POSIX標準,比如沒有實現(xiàn)向進程中所有線程發(fā)送信號,README對此作了說明。LinuxThreads中的線程同步很大程度上是建立在信號基礎(chǔ)上的,這種通過內(nèi)核復(fù)雜的信號處理機制的同步方式,效率一直是個問題。LinuxThreads 的問題,特別是兼容性上的問題,嚴重阻礙了Linux上的跨平臺應(yīng)用(如Apache)采用多線程設(shè)計,從而使得Linux上的線程應(yīng)用一直保持在比較低的水平。在Linux社區(qū)中,已經(jīng)有很多人在為改進線程性能而努力,其中既包括用戶級線程庫,也包括核心級和用戶級配合改進的線程庫。目前最為人看好的有兩個項目,一個是RedHat公司牽頭研發(fā)的NPTL(Native Posix Thread Library),另一個則是IBM投資開發(fā)的NGPT(Next Generation Posix Threading),二者都是圍繞完全兼容POSIX 1003.1c,同時在核內(nèi)和核外做工作以而實現(xiàn)多對多線程模型。這兩種模型都在一定程度上彌補了LinuxThreads的缺點,且都是重起爐灶全新設(shè)計的。
綜上所述的結(jié)論是在Linux下編程多用多進程編程少用多線程編程。
IBM有個家伙做了個測試,發(fā)現(xiàn)切換線程context的時候,windows比linux快一倍多。進出最快的鎖(windows2k的 critical section和linux的pthread_mutex),windows比linux的要快五倍左右。當然這并不是說linux不好,而且在經(jīng)過實際編程之后,綜合來看我覺得linux更適合做high performance server,不過在多線程這個具體的領(lǐng)域內(nèi),linux還是稍遜windows一點。這應(yīng)該是情有可原的,畢竟unix家族都是從多進程過來的,而 windows從頭就是多線程的。
如果是UNIX/linux環(huán)境,采用多線程沒必要。
多線程比多進程性能高?誤導(dǎo)!
應(yīng)該說,多線程比多進程成本低,但性能更低。
在UNIX環(huán)境,多進程調(diào)度開銷比多線程調(diào)度開銷,沒有顯著區(qū)別,就是說,UNIX的進程調(diào)度效率是很高的。內(nèi)存消耗方面,二者只差全局數(shù)據(jù)區(qū),現(xiàn)在內(nèi)存都很便宜,服務(wù)器內(nèi)存動輒若干G,根本不是問題。
多進程是立體交通系統(tǒng),雖然造價高,上坡下坡多耗點油,但是不堵車。
多線程是平面交通系統(tǒng),造價低,但紅綠燈太多,老堵車。
我們現(xiàn)在都開跑車,油(主頻)有的是,不怕上坡下坡,就怕堵車。
高性能交易服務(wù)器中間件,如TUXEDO,都是主張多進程的。實際測試表明,TUXEDO性能和并發(fā)效率是非常高的。TUXEDO是貝爾實驗室的,與UNIX同宗,應(yīng)該是對UNIX理解最為深刻的,他們的意見應(yīng)該具有很大的參考意義。
塊設(shè)備與字符設(shè)備區(qū)別
系統(tǒng)中能夠隨機(不需要按順序)訪問固定大小數(shù)據(jù)片(chunks)的設(shè)備被稱作塊設(shè)備,這些數(shù)據(jù)片就稱作塊。最常見的塊設(shè)備是硬盤,除此以外,還有軟盤驅(qū)動器、CD-ROM驅(qū)動器和閃存等等許多其他塊設(shè)備。注意,它們都是以安裝文件系統(tǒng)的方式使用的——這也是塊設(shè)備的一般訪問方式。
另一種基本的設(shè)備類型是字符設(shè)備。字符設(shè)備按照字符流的方式被有序訪問,像串口和鍵盤就都屬于字符設(shè)備。如果一個硬件設(shè)備是以字符流的方式被訪問的話,那就應(yīng)該將它歸于字符設(shè)備;反過來,如果一個設(shè)備是隨機(無序的)訪問的,那么它就屬于塊設(shè)備。
簡單來講,塊設(shè)備可以隨機存取,而字符設(shè)備不能隨機存取,塊設(shè)備通過系統(tǒng)緩存進行讀取,不是直接和物理磁盤讀取。字符設(shè)備可以直接物理磁盤讀取。不經(jīng)過系統(tǒng)緩存。(如鍵盤,直接相應(yīng)中斷)
什么是虛擬內(nèi)存?
虛擬內(nèi)存是計算機系統(tǒng)內(nèi)存管理的一種技術(shù)。它使得應(yīng)用程序認為它擁有連續(xù)的可用的內(nèi)存(一個連續(xù)完整的地址空間),而實際上,它通常是被分隔成多個物理內(nèi)存碎片,還有部分暫時存儲在外部磁盤存儲器上,在需要時進行數(shù)據(jù)交換。
別稱虛擬存儲器(Virtual Memory)。電腦中所運行的程序均需經(jīng)由內(nèi)存執(zhí)行,若執(zhí)行的程序占用內(nèi)存很大或很多,則會導(dǎo)致內(nèi)存消耗殆盡。為解決該問題,Windows中運用了虛擬內(nèi)存技術(shù),即勻出一部分硬盤空間來充當內(nèi)存使用。當內(nèi)存耗盡時,電腦就會自動調(diào)用硬盤來充當內(nèi)存,以緩解內(nèi)存的緊張。若計算機運行程序或操作所需的隨機存儲器(RAM)不足時,則 Windows 會用虛擬存儲器進行補償。它將計算機的RAM和硬盤上的臨時空間組合。當RAM運行速率緩慢時,它便將數(shù)據(jù)從RAM移動到稱為“分頁文件”的空間中。將數(shù)據(jù)移入分頁文件可釋放RAM,以便完成工作。 一般而言,計算機的RAM容量越大,程序運行得越快。若計算機的速率由于RAM可用空間匱乏而減緩,則可嘗試通過增加虛擬內(nèi)存來進行補償。但是,計算機從RAM讀取數(shù)據(jù)的速率要比從硬盤讀取數(shù)據(jù)的速率快,因而擴增RAM容量(可加內(nèi)存條)是最佳選擇。
看了“操作系統(tǒng)常見問題解答”還想看:
1.Windows操作系統(tǒng)常見故障解決方法匯總
2.Windows7十大常見問題及解決方案
3.操作系統(tǒng)常見驅(qū)動故障和解決方法
4.Unix系統(tǒng)的十大常見故障及解決方法