嵌入式Linux中文站關(guān)注線程進(jìn)程的基本概念,特別為大家推薦下文:
進(jìn)程(英語:Process,中國大陸譯作進(jìn)程,***譯作行程)是計(jì)算機(jī)中已運(yùn)行程序的實(shí)體。進(jìn)程本身不會(huì)運(yùn)行,是線程的容器。程序本身只是指令的集合,進(jìn)程才是程序(那些指令)的真正運(yùn)行。若干進(jìn)程有可能與同一個(gè)程序相關(guān)系,且每個(gè)進(jìn)程皆可以同步(循序)或不同步(平行)的方式獨(dú)立運(yùn)行。進(jìn)程為現(xiàn)今分時(shí)系統(tǒng)的基本運(yùn)作單位
線程(英語:thread,***譯為運(yùn)行緒),操作系統(tǒng)技術(shù)中的術(shù)語,是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。它被包涵在進(jìn)程之中,一條線程指的是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程并行執(zhí)行不同的任務(wù)。在Unix System V及SunOS中也被稱為輕量進(jìn)程(lightweight processes),但輕量進(jìn)程更多指內(nèi)核線程(kernel thread),而把用戶線程(user thread)稱為線程。
線程是獨(dú)立調(diào)度和分派的基本單位。線程可以操作系統(tǒng)內(nèi)核調(diào)度的內(nèi)核線程,如Win32 線程;由用戶進(jìn)程自行調(diào)度的用戶線程,如Linux Portable Thread; 或者由內(nèi)核與用戶進(jìn)程,如Windows 7的線程,進(jìn)行混合調(diào)度。
同一進(jìn)程中的多條線程將共享該進(jìn)程中的全部系統(tǒng)資源,如虛擬地址空間,文件描述符和信號(hào)處理等等。但同一進(jìn)程中的多個(gè)線程有各自的調(diào)用棧(call stack),自己的寄存器環(huán)境(register context),自己的線程本地存儲(chǔ)(thread-local storage)。
一個(gè)進(jìn)程可以有很多線程,每條線程并行執(zhí)行不同的任務(wù)。
在多核或多CPU,或支持Hyper-threading的CPU上使用多線程程序設(shè)計(jì)的好處是顯而易見,即提高了程序的執(zhí)行吞吐率。在單CPU單核的計(jì)算機(jī)上,使用多線程技術(shù),也可以把進(jìn)程中負(fù)責(zé)IO處理、人機(jī)交互而常備阻塞的部分與密集計(jì)算的部分分開來執(zhí)行,編寫專門的workhorse線程執(zhí)行密集計(jì)算,從而提高了程序的執(zhí)行效率
進(jìn)程是資源分配的最小單位,線程是CPU調(diào)度的最小單位。線程和進(jìn)程的區(qū)別在于,子進(jìn)程和父進(jìn)程有不同的代碼和數(shù)據(jù)空間,而多個(gè)線程則共享數(shù)據(jù)空間,每個(gè)線程有自己的執(zhí)行堆棧和程序計(jì)數(shù)器為其執(zhí)行上下文.多線程主要是為了節(jié)約CPU時(shí)間,發(fā)揮利用,根據(jù)具體情況而定. 線程的運(yùn)行中需要使用計(jì)算機(jī)的內(nèi)存資源和CPU。
多進(jìn)程: 進(jìn)程是程序在計(jì)算機(jī)上的一次執(zhí)行活動(dòng)。當(dāng)你運(yùn)行一個(gè)程序,你就啟動(dòng)了一個(gè)進(jìn)程。顯然,程序是死的(靜態(tài)的),進(jìn)程是活的(動(dòng)態(tài)的)。進(jìn)程可以分為系統(tǒng)進(jìn)程和用戶進(jìn)程。凡是用于完成操作系統(tǒng)的各種功能的進(jìn)程就是系統(tǒng)進(jìn)程,它們就是處于運(yùn)行狀態(tài)下的操作系統(tǒng)本身;所有由用戶啟動(dòng)的進(jìn)程都是用戶進(jìn)程。進(jìn)程是操作系統(tǒng)進(jìn)行資源分配的單位。 進(jìn)程又被細(xì)化為線程,也就是一個(gè)進(jìn)程下有多個(gè)能獨(dú)立運(yùn)行的更小的單位。在同一個(gè)時(shí)間里,同一個(gè)計(jì)算機(jī)系統(tǒng)中如果允許兩個(gè)或兩個(gè)以上的進(jìn)程處于運(yùn)行狀態(tài),這便是多任務(wù)?,F(xiàn)代的操作系統(tǒng)幾乎都是多任務(wù)操作系統(tǒng),能夠同時(shí)管理多個(gè)進(jìn)程的運(yùn)行。 多任務(wù)帶來的好處是明顯的,比如你可以邊聽mp3邊上網(wǎng),與此同時(shí)甚至可以將下載的文檔打印出來,而這些任務(wù)之間絲毫不會(huì)相互干擾。那么這里就涉及到并行的問題,俗話說,一心不能二用,這對計(jì)算機(jī)也一樣,原則上一個(gè)CPU只能分配給一個(gè)進(jìn)程,以便運(yùn)行這個(gè)進(jìn)程。我們通常使用的計(jì)算機(jī)中只有一個(gè)CPU,也就是說只有一顆心,要讓它一心多用,同時(shí)運(yùn)行多個(gè)進(jìn)程,就必須使用并發(fā)技術(shù)。實(shí)現(xiàn)并發(fā)技術(shù)相當(dāng)復(fù)雜,最容易理解的是“時(shí)間片輪轉(zhuǎn)進(jìn)程調(diào)度算法”,它的思想簡單介紹如下:在操作系統(tǒng)的管理下,所有正在運(yùn)行的進(jìn)程輪流使用CPU,每個(gè)進(jìn)程允許占用CPU的時(shí)間非常短(比如10毫秒),這樣用戶根本感覺不出來 CPU是在輪流為多個(gè)進(jìn)程服務(wù),就好象所有的進(jìn)程都在不間斷地運(yùn)行一樣。但實(shí)際上在任何一個(gè)時(shí)間內(nèi)有且僅有一個(gè)進(jìn)程占有CPU。 如果一臺(tái)計(jì)算機(jī)有多個(gè)CPU,情況就不同了,如果進(jìn)程數(shù)小于CPU數(shù),則不同的進(jìn)程可以分配給不同的CPU來運(yùn)行,這樣,多個(gè)進(jìn)程就是真正同時(shí)運(yùn)行的,這便是并行。但如果進(jìn)程數(shù)大于CPU數(shù),則仍然需要使用并發(fā)技術(shù)。 進(jìn)行CPU分配是以線程為單位的,一個(gè)進(jìn)程可能由多個(gè)線程組成,這時(shí)情況更加復(fù)雜,但簡單地說,有如下關(guān)系:
總線程數(shù)<= CPU數(shù)量:并行運(yùn)行
總線程數(shù)> CPU數(shù)量:并發(fā)運(yùn)行
并行運(yùn)行的效率顯然高于并發(fā)運(yùn)行,所以在多CPU的計(jì)算機(jī)中,多任務(wù)的效率比較高。但是,如果在多CPU計(jì)算機(jī)中只運(yùn)行一個(gè)進(jìn)程(線程),就不能發(fā)揮多CPU的優(yōu)勢。 這里涉及到多任務(wù)操作系統(tǒng)的問題,多任務(wù)操作系統(tǒng)(如Windows)的基本原理是:操作系統(tǒng)將CPU的時(shí)間片分配給多個(gè)線程,每個(gè)線程在操作系統(tǒng)指定的時(shí)間片內(nèi)完成(注意,這里的多個(gè)線程是分屬于不同進(jìn)程的).操作系統(tǒng)不斷的從一個(gè)線程的執(zhí)行切換到另一個(gè)線程的執(zhí)行,如此往復(fù),宏觀上看來,就好像是多個(gè)線程在一起執(zhí)行.由于這多個(gè)線程分屬于不同的進(jìn)程,因此在我們看來,就好像是多個(gè)進(jìn)程在同時(shí)執(zhí)行,這樣就實(shí)現(xiàn)了多任務(wù)
多線程:在計(jì)算機(jī)編程中,一個(gè)基本的概念就是同時(shí)對多個(gè)任務(wù)加以控制。許多程序設(shè)計(jì)問題都要求程序能夠停下手頭的工作,改為處理其他一些問題,再返回主進(jìn)程??梢酝ㄟ^多種途徑達(dá)到這個(gè)目的。最開始的時(shí)候,那些掌握機(jī)器低級語言的程序員編寫一些“中斷服務(wù)例程”,主進(jìn)程的暫停是通過硬件級的中斷實(shí)現(xiàn)的。盡管這是一種有用的方法,但編出的程序很難移植,由此造成了另一類的代價(jià)高昂問題。中斷對那些實(shí)時(shí)性很強(qiáng)的任務(wù)來說是很有必要的。但對于其他許多問題,只要求將問題劃分進(jìn)入獨(dú)立運(yùn)行的程序片斷中,使整個(gè)程序能更迅速地響應(yīng)用戶的請求?! ?br>最開始,線程只是用于分配單個(gè)處理器的處理時(shí)間的一種工具。但假如操作系統(tǒng)本身支持多個(gè)處理器,那么每個(gè)線程都可分配給一個(gè)不同的處理器,真正進(jìn)入“并行運(yùn)算”狀態(tài)。從程序設(shè)計(jì)語言的角度看,多線程操作最有價(jià)值的特性之一就是程序員不必關(guān)心到底使用了多少個(gè)處理器。程序在邏輯意義上被分割為數(shù)個(gè)線程;假如機(jī)器本身安裝了多個(gè)處理器,那么程序會(huì)運(yùn)行得更快,毋需作出任何特殊的調(diào)校。根據(jù)前面的論述,大家可能感覺線程處理非常簡單。但必須注意一個(gè)問題:共享資源!如果有多個(gè)線程同時(shí)運(yùn)行,而且它們試圖訪問相同的資源,就會(huì)遇到一個(gè)問題。舉個(gè)例子來說,兩個(gè)線程不能將信息同時(shí)發(fā)送給一臺(tái)打印機(jī)。為解決這個(gè)問題,對那些可共享的資源來說(比如打印機(jī)),它們在使用期間必須進(jìn)入鎖定狀態(tài)。所以一個(gè)線程可將資源鎖定,在完成了它的任務(wù)后,再解開(釋放)這個(gè)鎖,使其他線程可以接著使用同樣的資源?!?br>多線程是為了同步完成多項(xiàng)任務(wù),不是為了提高運(yùn)行效率,而是為了提高資源使用效率來提高系統(tǒng)的效率。線程是在同一時(shí)間需要完成多項(xiàng)任務(wù)的時(shí)候?qū)崿F(xiàn)的。
一個(gè)采用了多線程技術(shù)的應(yīng)用程序可以更好地利用系統(tǒng)資源。其主要優(yōu)勢在于充分利用了CPU的空閑時(shí)間片,可以用盡可能少的時(shí)間來對用戶的要求做出響應(yīng),使得進(jìn)程的整體運(yùn)行效率得到較大提高,同時(shí)增強(qiáng)了應(yīng)用程序的靈活性。更為重要的是,由于同一進(jìn)程的所有線程是共享同一內(nèi)存,所以不需要特殊的數(shù)據(jù)傳送機(jī)制,不需要建立共享存儲(chǔ)區(qū)或共享文件,從而使得不同任務(wù)之間的協(xié)調(diào)操作與運(yùn)行、數(shù)據(jù)的交互、資源的分配等問題更加易于解決。
進(jìn)程間通信(IPC,Inter-Process Communication),指至少兩個(gè)進(jìn)程或線程間傳送數(shù)據(jù)或信號(hào)的一些技術(shù)或方法。進(jìn)程是計(jì)算機(jī)系統(tǒng)分配資源的最小單位。每個(gè)進(jìn)程都有自己的一部分獨(dú)立的系統(tǒng)資源,彼此是隔離的。為了能使不同的進(jìn)程互相訪問資源并進(jìn)行協(xié)調(diào)工作,才有了進(jìn)程間通信。這些進(jìn)程可以運(yùn)行在同一計(jì)算機(jī)上或網(wǎng)絡(luò)連接的不同計(jì)算機(jī)上。
進(jìn)程間通信技術(shù)包括消息傳遞、同步、共享內(nèi)存和遠(yuǎn)程過程調(diào)用。IPC是一種標(biāo)準(zhǔn)的Unix通信機(jī)制。
使用IPC 的理由:
- 信息共享
- 加速;
- 模塊化;
- 方便; 以及
- 私有權(quán)分離.
主要的 IPC 方法
方法
提供方(操作系統(tǒng)或其他環(huán)境)
文件
多數(shù)操作系統(tǒng)
信號(hào)
多數(shù)操作系統(tǒng)
Socket
多數(shù)操作系統(tǒng)
消息隊(duì)列(en:Message queue)
多數(shù)操作系統(tǒng)
管道(en:Pipe)
所有的 POSIX systems, Windows.
具名管道(en:Named Pipe)
所有的 POSIX 系統(tǒng), Windows.
信號(hào)量(en:Semaphore)
所有的 POSIX 系統(tǒng), Windows.
共享內(nèi)存
所有的 POSIX 系統(tǒng), Windows.
Message passing(en:Message passing)
(不共享)
用于 MPI規(guī)范,Java RMI, CORBA, MSMQ, MailSlot 以及其他.
Memory-mapped file(en:Memory-mapped file)
評論
查看更多