多線程概念整理

在寫這篇文章之前,對(duì)于很多專業(yè)課里學(xué)過的概念都模糊了,所以特地去把《計(jì)算機(jī)操作系統(tǒng)(第四版)》這本書翻了出來,重新梳理腦子里快忘完的基礎(chǔ)概念。

在說多線程之前我們先來了解一下進(jìn)程,因?yàn)檫M(jìn)程和線程是密切相關(guān)的,在了解了進(jìn)程之后,可以更好地幫助我們理解線程。

一、進(jìn)程的基本概念

在傳統(tǒng)的操作系統(tǒng)中,為了提高資源利用率和系統(tǒng)吞吐量,通常采用多道程序技術(shù),將多個(gè)程序同時(shí)裝入內(nèi)存,并使之并發(fā)運(yùn)行,傳統(tǒng)意義上的程序不能再獨(dú)立運(yùn)行。此時(shí),作為資源分配和獨(dú)立運(yùn)行的基本單位都是進(jìn)程。操作系統(tǒng)所具有的四大特征也都是基于進(jìn)程而形成的,并從進(jìn)程的角度進(jìn)行研究??梢姡诓僮飨到y(tǒng)中,進(jìn)程是一個(gè)極其重要的概念。

1、進(jìn)程(或程序)的順序執(zhí)行和并發(fā)執(zhí)行

1.1 程序順序執(zhí)行

通常一個(gè)應(yīng)用程序由若干個(gè)程序段組成,每一個(gè)程序段完成特定的功能,它們?cè)趫?zhí)行時(shí),都需要按照某種先后次序順序執(zhí)行,僅當(dāng)前一段程序段執(zhí)行完后,才運(yùn)行后一程序段。

例如:

S1: a:=x+y;
S2: b:=a-5;
S3: c:=b+1;

其中,語句S2必須在語句S1后(即a被賦值)才能執(zhí)行,語句S3也只能在b被賦值后才能執(zhí)行,因此,三條語句存在著這樣的前趨關(guān)系:S1-->S2-->S3

由上述可知,在程序順序執(zhí)行時(shí)具有這樣三個(gè)特征:

(1) 順序性:指處理機(jī)嚴(yán)格地按照程序所規(guī)定的順序執(zhí)行,即每一操作必須在下一個(gè)操作開始之前結(jié)束;
(2)封閉性:指程序在封閉的環(huán)境下運(yùn)行,即程序運(yùn)行時(shí)獨(dú)占全機(jī)資源,資源的狀態(tài)(除初始狀態(tài)外)只有本程序才能改變它,程序一旦開始執(zhí)行,其執(zhí)行結(jié)果不受外界因素影響;
(3)可再現(xiàn)性:指只要程序執(zhí)行時(shí)的環(huán)境和初始條件相同,當(dāng)程序重復(fù)執(zhí)行時(shí),不論他是從頭到尾不停頓執(zhí)行,還是“走走停?!钡貓?zhí)行,都可獲得相同的結(jié)果。程序順序執(zhí)行時(shí)的這種特性,為程序員檢測(cè)和校驗(yàn)程序的錯(cuò)誤帶來了很大的方便。
1.2 程序并發(fā)執(zhí)行

程序順序執(zhí)行時(shí),雖然可以給程序員帶來方便,但系統(tǒng)資源的利用率卻很低。為此,在系統(tǒng)中引入了多道程序技術(shù),使程序或程序段間能并發(fā)執(zhí)行。然而并非所有的程序都能并發(fā)執(zhí)行。事實(shí)上,只有不存在前趨關(guān)系的程序之間才有可能并發(fā)執(zhí)行,否則無法并發(fā)執(zhí)行。

例如:

S1: a:=x+2;
S2: b:=y+5;
S3: c:=b+a;
S4: d:=c+b;

通過上面的程序段我們可以看出:S3必須在a和b被賦值后方能執(zhí)行;S4必須在S3之后執(zhí)行;但S1和S2則可以并發(fā)執(zhí)行,因?yàn)樗鼈儽舜嘶ゲ灰蕾嚒?/p>

在引入了程序間的并發(fā)執(zhí)行功能后,雖然提高了系統(tǒng)的吞吐量和資源利用率,但由于它們共享系統(tǒng)資源,以及它們?yōu)橥瓿赏豁?xiàng)任務(wù)而相互合作,致使在這些并發(fā)執(zhí)行的程序之間必將形成相互制約的關(guān)系,由此會(huì)給程序并發(fā)執(zhí)行帶來新的特征。

(1)間斷性:程序在并發(fā)執(zhí)行時(shí),由于它們共享系統(tǒng)資源,以及為完成同一項(xiàng)任務(wù)而相互合作,致使在這些并發(fā)執(zhí)行的程序之間形成了相互制約的關(guān)系,從而形成“執(zhí)行——暫停——執(zhí)行”這種間斷性的活動(dòng)規(guī)律。
(2)失去封閉性:當(dāng)系統(tǒng)中存在著多個(gè)可以并發(fā)執(zhí)行的程序時(shí),系統(tǒng)的各種資源就會(huì)被它們共享,而這些資源的狀態(tài)也由這些程序來改變,致使其中任一程序在運(yùn)行時(shí),其環(huán)境會(huì)受到其它程序的影響。
(3)不可再現(xiàn)性:程序在執(zhí)行并發(fā)時(shí),由于失去了封閉性,也就將導(dǎo)致其失去可再現(xiàn)性。
2、進(jìn)程的概念
1.進(jìn)程的定義

為了使參與并發(fā)執(zhí)行的每個(gè)程序(含數(shù)據(jù))都能獨(dú)立地運(yùn)行,在操作系統(tǒng)中必須為之配置一個(gè)專門的數(shù)據(jù)結(jié)構(gòu),稱之為進(jìn)程控制塊(Progress Control Block,PCB)。系統(tǒng)利用PCB來描述進(jìn)程的基本情況和活動(dòng)過程進(jìn)而控制和管理進(jìn)程。這樣,由程序段、相關(guān)的數(shù)據(jù)段和PCB三部分便構(gòu)成了進(jìn)程實(shí)體(又稱進(jìn)程映像)。一般情況下,我們把進(jìn)程實(shí)體簡(jiǎn)稱為進(jìn)程,例如,所謂的創(chuàng)建進(jìn)程就是創(chuàng)建進(jìn)程實(shí)體中的PCB;而撤銷進(jìn)程實(shí)質(zhì)上是撤銷進(jìn)程的PCB。

對(duì)于進(jìn)程的定義,從不同的角度可以有不同的定義,其中較典型的定義有:
(1)進(jìn)程是程序的一次執(zhí)行。
(2)進(jìn)程是一個(gè)程序及其數(shù)據(jù)在處理機(jī)上順序執(zhí)行時(shí)所發(fā)生的活動(dòng)。
(3)進(jìn)程是具有獨(dú)立功能的程序在一個(gè)數(shù)據(jù)集合上運(yùn)行的過程,它是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位。

在引入進(jìn)程實(shí)體的概念后,我們可以把傳統(tǒng)OS中的進(jìn)程定義為:“進(jìn)程是進(jìn)程實(shí)體的運(yùn)行過程,是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)基本單位?!?/p>

二、線程的基本概念

在20世紀(jì)60年代中期,人們?cè)谠O(shè)計(jì)多道程序OS時(shí),引入了進(jìn)程的概念,從而解決了在單處理機(jī)環(huán)境下的程序并發(fā)執(zhí)行問題。此后長(zhǎng)達(dá)20年的時(shí)間里,在多道程序OS中一直是以進(jìn)程作為能擁有資源和獨(dú)立調(diào)度(運(yùn)行)的基本單位的。直到80年代中期,人們又提出了比進(jìn)程更小的基本單位——線程的概念,試圖用它來提高程序并發(fā)執(zhí)行的程度,以進(jìn)一步改善系統(tǒng)的服務(wù)質(zhì)量。特別是在進(jìn)入20世紀(jì)90年代后,多處理機(jī)系統(tǒng)得到迅速發(fā)展,由于線程能更好地提高程序的并行執(zhí)行程度,因而近幾年推出的多處理機(jī)OS無一例外地都引入了線程,用以改善OS性能。

1.線程的引入

如果說,在OS中引入進(jìn)程的目的是為了使多個(gè)程序能并發(fā)執(zhí)行,以提高資源利用率和系統(tǒng)吞吐量,那么,在操作系統(tǒng)中再引入線程,則是為了減少程序在并發(fā)執(zhí)行時(shí)所付出的時(shí)空開銷,使OS具有更好的并發(fā)性。

2.線程與進(jìn)程的比較

由于線程具有許多傳統(tǒng)進(jìn)程所具有的特征,所以又稱之為輕型進(jìn)程(Light-Weight-Process)或進(jìn)程元,相應(yīng)地,把傳統(tǒng)進(jìn)程稱之為重型進(jìn)程(Heavy-Weight-Process)。它相當(dāng)于只有一個(gè)線程的任務(wù)。

(1)調(diào)度的基本單位

在傳統(tǒng)的OS中,進(jìn)程是作為獨(dú)立調(diào)度和分派的基本單位,因而進(jìn)程是獨(dú)立運(yùn)行的基本單位。在每次被調(diào)度時(shí),都需要進(jìn)行上下文切換,開銷較大。而在引入線程的OS中,已把線程作為調(diào)度和分配的基本單位,因而線程是能獨(dú)立運(yùn)行的基本單位。當(dāng)線程切換時(shí),僅需設(shè)置和保存少量寄存器內(nèi)容,切換代價(jià)遠(yuǎn)低于進(jìn)程。在同一進(jìn)程中,線程的切換不會(huì)引起進(jìn)程的切換,但從一個(gè)進(jìn)程中的線程切換到另一個(gè)進(jìn)程中的線程時(shí),必然就會(huì)引起進(jìn)程的切換。

(2)并發(fā)性

在引入線程的OS中,不僅進(jìn)程直接可以并發(fā)執(zhí)行,而且在一個(gè)進(jìn)程中的多個(gè)線程之間亦可并發(fā)執(zhí)行,甚至還允許在一個(gè)進(jìn)程中的所有現(xiàn)場(chǎng)都能并發(fā)執(zhí)行。同樣,不同進(jìn)程中的線程也能并發(fā)執(zhí)行。這使得OS具有更好的并發(fā)性,從而能更加有效地提高系統(tǒng)的資源利用率和系統(tǒng)的吞吐量。

(3)擁有資源

進(jìn)程可以擁有資源,并作為系統(tǒng)中擁有資源的一個(gè)基本單位。然而,線程本身并不擁有系統(tǒng)資源,而是僅有一點(diǎn)必不可少的,能保證獨(dú)立運(yùn)行的資源。比如,在每個(gè)線程中都保留局部變量。少數(shù)狀態(tài)參數(shù)和返回地址等的一組寄存器和堆棧。

線程除了擁有自己的少量資源外,還允許多個(gè)線程共享該進(jìn)程所擁有的資源,這首先表現(xiàn)在:屬于同一進(jìn)程的所有線程都具有相同的地址空間,這意味著,線程可以訪問該地址空間中的每一個(gè)虛地址;此外,還可以訪問進(jìn)程所擁有的資源,如已打開的文件、定時(shí)器、信號(hào)量機(jī)構(gòu)等的內(nèi)存空間和它所申請(qǐng)到的I/O設(shè)備等。

(4)獨(dú)立性

在同一進(jìn)程中的不同線程之間的獨(dú)立性要比不同進(jìn)程之間的獨(dú)立性低得多。這是因?yàn)椋瑸榉乐惯M(jìn)城之間彼此干擾和破壞,每個(gè)進(jìn)程都擁有一個(gè)獨(dú)立的地址空間和其它資源,除了共享全局變量以外,不允許其它進(jìn)程的訪問。但是同一進(jìn)程中的不同線程往往是為了提高并發(fā)性以及進(jìn)行相互之間的合作而創(chuàng)建的,它們共享進(jìn)程的內(nèi)存地址空間和資源,如每個(gè)線程都可以訪問他們所屬進(jìn)程地址空間中的所有地址,如一個(gè)線程的堆??梢员黄渌€程讀、寫,甚至完全清除。由一個(gè)線程打開的文件可以供其它線程讀、寫。

(5)系統(tǒng)開銷

在創(chuàng)建或撤銷進(jìn)程時(shí),系統(tǒng)都要為之分配和回收進(jìn)程控制塊、分配或回收其他資源,如內(nèi)存空間和I/O設(shè)備等。OS為此所付出的開銷,明顯大于線程創(chuàng)建或撤銷時(shí)所付出的開銷。類似地,在進(jìn)程切換時(shí),涉及到進(jìn)程上下文的切換,而現(xiàn)成的切換代價(jià)也遠(yuǎn)低于進(jìn)程的。

(6)多處理機(jī)系統(tǒng)

在多處理機(jī)系統(tǒng)中,對(duì)于傳統(tǒng)的進(jìn)程,即單線程進(jìn)程,不管有多處理機(jī),該進(jìn)程只能運(yùn)行在一個(gè)處理機(jī)上。單對(duì)于多線程進(jìn)程,就可以將一個(gè)進(jìn)程中的多個(gè)線程分配到多個(gè)處理機(jī)上,是它們并行執(zhí)行,這無疑將加速進(jìn)程的完成。因此,現(xiàn)代多處理機(jī)OS都無一例外地引入了多線程。

總結(jié):進(jìn)程是系統(tǒng)中可以獨(dú)立執(zhí)行和調(diào)度的基本單位,線程則是基于進(jìn)程的最小調(diào)度單位,如果把進(jìn)程看作一個(gè)生產(chǎn)車間,那么線程就是這個(gè)車間里分工合作的生產(chǎn)線,相互合作也相互制約,目的是為了提高效率。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. 簡(jiǎn)介 用戶打開瀏覽器,其實(shí)就是打開了瀏覽器應(yīng)用程序。那么什么是程序呢?我們常說瀏覽器是多線程的,JS 是單線...
    love丁酥酥閱讀 3,667評(píng)論 0 6
  • 又來到了一個(gè)老生常談的問題,應(yīng)用層軟件開發(fā)的程序員要不要了解和深入學(xué)習(xí)操作系統(tǒng)呢? 今天就這個(gè)問題開始,來談?wù)劜?..
    tangsl閱讀 4,322評(píng)論 0 23
  • 1.內(nèi)存的頁面置換算法 (1)最佳置換算法(OPT)(理想置換算法):從主存中移出永遠(yuǎn)不再需要的頁面;如無這樣的...
    杰倫哎呦哎呦閱讀 3,595評(píng)論 1 9
  • 線程 操作系統(tǒng)線程理論 線程概念的引入背景 進(jìn)程 之前我們已經(jīng)了解了操作系統(tǒng)中進(jìn)程的概念,程序并不能單獨(dú)運(yùn)行,只有...
    go以恒閱讀 1,796評(píng)論 0 6
  • 一. 操作系統(tǒng)概念 操作系統(tǒng)位于底層硬件與應(yīng)用軟件之間的一層.工作方式: 向下管理硬件,向上提供接口.操作系統(tǒng)進(jìn)行...
    月亮是我踢彎得閱讀 6,162評(píng)論 3 28

友情鏈接更多精彩內(nèi)容