引言
在傳統(tǒng)上,并發(fā)多任務的實現(xiàn)采用的是在操作系統(tǒng)級運行多個進程,由操作系統(tǒng)按照一定的策略(優(yōu)先級、循環(huán)等),調(diào)度各個進程的執(zhí)行,以限度的利用計算機的各種資源。在這種實現(xiàn)方法中最基本的調(diào)度單位是操作系統(tǒng)級上的進程。由于各個進程擁有自己獨立的運行環(huán)境(寄存器和地址空間等)。進程與進程之間的耦合關(guān)系差,并發(fā)性粒度過于粗糙,并發(fā)實現(xiàn)也不太容易。所以,除非特殊需要,一般的應用設計都不采用這種技術(shù)。
為了克服這些問題,近年來逐步發(fā)展了并發(fā)多線程的程序設計技術(shù)。從并發(fā)Ada、并發(fā)C等各種并發(fā)多任務的程序設計語言(這些語言中采用的雖然不是線程這個術(shù)語,但其基本思想是一樣的),到Mach、Chorus、Solaris System等各種采用了線程技術(shù)的系統(tǒng),多線程技術(shù)得到了迅速發(fā)展和日益廣泛的應用。IEEE也推出了有關(guān)多線程程序設計的標準POSIX1003.4a。特別是在Window NT和Windows 98等流行操作系統(tǒng)中,采用了線程作為基本的調(diào)度單位,其API中也提供了有關(guān)線程操作的用戶程序接口。所有這些無疑都會促進多線程技術(shù)在程序設計中被日益廣泛的采用。
多線程技術(shù)的概念
所謂線程(或稱線索,thread),指程序中的以單一的順序控制流。線程按順序執(zhí)行,即在一個線程中,一個時刻只能由一個執(zhí)行點。顯然,按傳統(tǒng)方法設計的程序,無論是單道執(zhí)行的程序,還是由多個進程并發(fā)執(zhí)行的多道程序,就每個程序本身而言,都是由單線程組成的。
多線程程序設計,就是使單個程序中包含并發(fā)執(zhí)行的多個線程。當多線程程序執(zhí)行時,在該程序?qū)倪M程中就有多個控制流在同時運行,即具有并發(fā)執(zhí)行的多個線程。在一個進程中包含并發(fā)執(zhí)行的多個控制流,而不是把多個控制流一一分散在多個進程中,這是多線程程序設計與并發(fā)多進程程序設計截然不同之處。這就決定了二者之間雖然在概念上有許多相通之處,但實現(xiàn)方法則是完全不同。
分別示意了把一個任務按兩個并發(fā)進程和兩個并發(fā)線程分解后的情況。比較這兩張圖中進程與進程之間、線程與線程之間的關(guān)系可以看出,進程之間的關(guān)系比較疏遠,各個進程是在自己獨有的地址空間內(nèi)執(zhí)行,不但寄存器和堆棧是獨有的,動態(tài)數(shù)據(jù)堆、靜態(tài)數(shù)據(jù)區(qū)和程序代碼也相互獨立。而線程之間的關(guān)系則要緊密的多。雖然各線程為保持自己的控制流而獨有寄存器和堆棧,但由于各線程從屬于同一進程,它們共享同一地址空間,所以動態(tài)堆、靜態(tài)數(shù)據(jù)區(qū)及程序代碼則是各線程共有的。
許多多任務操作系統(tǒng)限制用戶能擁有的最多進程數(shù)目,如很多Unix版本的典型值為20個左右,這對許多并發(fā)應用來說遠遠不夠。而對多線程技術(shù)來說,不存在這樣的數(shù)目限額。
在傳統(tǒng)上,并發(fā)多任務的實現(xiàn)采用的是在操作系統(tǒng)級運行多個進程,由操作系統(tǒng)按照一定的策略(優(yōu)先級、循環(huán)等),調(diào)度各個進程的執(zhí)行,以限度的利用計算機的各種資源。在這種實現(xiàn)方法中最基本的調(diào)度單位是操作系統(tǒng)級上的進程。由于各個進程擁有自己獨立的運行環(huán)境(寄存器和地址空間等)。進程與進程之間的耦合關(guān)系差,并發(fā)性粒度過于粗糙,并發(fā)實現(xiàn)也不太容易。所以,除非特殊需要,一般的應用設計都不采用這種技術(shù)。
為了克服這些問題,近年來逐步發(fā)展了并發(fā)多線程的程序設計技術(shù)。從并發(fā)Ada、并發(fā)C等各種并發(fā)多任務的程序設計語言(這些語言中采用的雖然不是線程這個術(shù)語,但其基本思想是一樣的),到Mach、Chorus、Solaris System等各種采用了線程技術(shù)的系統(tǒng),多線程技術(shù)得到了迅速發(fā)展和日益廣泛的應用。IEEE也推出了有關(guān)多線程程序設計的標準POSIX1003.4a。特別是在Window NT和Windows 98等流行操作系統(tǒng)中,采用了線程作為基本的調(diào)度單位,其API中也提供了有關(guān)線程操作的用戶程序接口。所有這些無疑都會促進多線程技術(shù)在程序設計中被日益廣泛的采用。
多線程技術(shù)的概念
所謂線程(或稱線索,thread),指程序中的以單一的順序控制流。線程按順序執(zhí)行,即在一個線程中,一個時刻只能由一個執(zhí)行點。顯然,按傳統(tǒng)方法設計的程序,無論是單道執(zhí)行的程序,還是由多個進程并發(fā)執(zhí)行的多道程序,就每個程序本身而言,都是由單線程組成的。
多線程程序設計,就是使單個程序中包含并發(fā)執(zhí)行的多個線程。當多線程程序執(zhí)行時,在該程序?qū)倪M程中就有多個控制流在同時運行,即具有并發(fā)執(zhí)行的多個線程。在一個進程中包含并發(fā)執(zhí)行的多個控制流,而不是把多個控制流一一分散在多個進程中,這是多線程程序設計與并發(fā)多進程程序設計截然不同之處。這就決定了二者之間雖然在概念上有許多相通之處,但實現(xiàn)方法則是完全不同。
分別示意了把一個任務按兩個并發(fā)進程和兩個并發(fā)線程分解后的情況。比較這兩張圖中進程與進程之間、線程與線程之間的關(guān)系可以看出,進程之間的關(guān)系比較疏遠,各個進程是在自己獨有的地址空間內(nèi)執(zhí)行,不但寄存器和堆棧是獨有的,動態(tài)數(shù)據(jù)堆、靜態(tài)數(shù)據(jù)區(qū)和程序代碼也相互獨立。而線程之間的關(guān)系則要緊密的多。雖然各線程為保持自己的控制流而獨有寄存器和堆棧,但由于各線程從屬于同一進程,它們共享同一地址空間,所以動態(tài)堆、靜態(tài)數(shù)據(jù)區(qū)及程序代碼則是各線程共有的。
許多多任務操作系統(tǒng)限制用戶能擁有的最多進程數(shù)目,如很多Unix版本的典型值為20個左右,這對許多并發(fā)應用來說遠遠不夠。而對多線程技術(shù)來說,不存在這樣的數(shù)目限額。