如果說,在操作系統中引入進程的目的是為了使多個程序能并發執行,以提高資源利用率和系統吞吐量,那么在操作系統中再引入線程,則是為了減少程序在并發執行時所付出的時空開銷,使OS(操作系統)具有更好的并發性…
我們再回顧一下進程的兩個基本屬性:
1.進程是一個可擁擁有資源的獨立單位,一個進程要能獨立運行,它必須擁有一定的資源(用于存放程序、數據的磁盤和內存地址空間,以及它在運行時所需要的I/O設備、已打開的文件、信號量等);
2.進程同時是一個可獨立調度和分配的基本單位,一個進程要能獨立運行,它還必須是一個可獨立調用和分派的基本單位。每個進程在系統中由唯一的PCB(Process Control Blck,進程控制塊),系統可根據其PCB感知進程的存在,也可以根據其PCB中的信息,對進程進行調度,還可以將斷點信息保存在其PCB中.反之,再利用進程PCB中的信息來恢復進程運行的現場。
程序并發執行所需付出的時空開銷
為使程序能并發執行,系統必須進行以下的一系列操作:
1.創建進程,系統在創建一個進程時,必須為它分配其所必需的、除處理機以外的所有資源,如內存空間、I/O設備,以及建立相應的PCB;
2.撤消進程,系統在撤銷進程時,又必須先對其所占有的資源執行回收操作,然后在撤銷PCB;
3.進程切換,對進程進行上下文切換時,需要保留當前進程的CPU環境,設置新選中進程的CPU環境,因而須花費不少的處理機時間.
由上可知:由于進程是一個資源的擁有者,因而在創建、撤消和切換中,系統必須為之付出較大的時空開銷.這就限制了系統中所設置進程的數目,而且進程切換也不宜過于頻繁,從而限制了并發程度的進一步提高.
線程------作為調度和分派的基本單位
線程的概念:設法將進程的兩個基本屬性(獨立資源和PCB)分開,由OS分開處理:不把作為調度和分派的基本單位也同時作為擁有資源的單位;對于擁有資源的基本單位,不頻繁的切換.
線程與進程的比較
1.調度的基本單位:
在傳統的OS中,進程是作為獨立調度和分派的基本單位,因而進程是能獨立運行的基本單位.在每次被調度時,都需要進行上下文切換,開銷很大。而在引入線程的OS中,已把線程作為調度和分派的基本單位,因而線程是獨立運行的基本單位.當線程切換時,僅需保存和設置少量寄存器內容,切換代價遠低于進程.在同一進程中,線程的切換不會引起進程的切換,但從一個進程的線程切換到另一個進程中的線程時,必然會引起進程的切換.
2.并發行
在引入線程的OS中,不僅進程之間可以并發執行,而且在一個進程中的多個線程之間亦可并發執行,甚至還允許在一個進程中的所有線程都能并發執行.同樣,不同的線程也能并發執行.這使得OS具有更好的并發性,從而能更加有效地提高系統資源地利用率和系統地吞吐量.
例如:一個網絡服務器經常會接到許多客戶地請求,如果仍采用傳統的單線程的進程來執行該任務,則每次只能為一個客戶服務.但如果在一個進程中可以設置多個線程,將其中的一個專用于監聽客戶的請求,則每當有一個客戶請求時,便立即創建一個線程來處理該客戶的請求.
3.擁有資源
進程可以擁有資源,并作為系統中擁有資源的一個基本單位.然而,線程本身并不擁有系統資源,而僅有一點必不可少的、能夠保證獨立運行的資源.
例如:在每個線程中都應具有一個用于控制線程運行的線程控制塊(TCB,Thread Control Block)、用于指是被執行指令序列的程序計數器、保留局部變量、少數狀態參數和返回地址等的一組寄存器和堆棧.
4.獨立性
在同一進程中的不同線程之間的獨立性要比不同進程之間的獨立性要低得多.這是因為,為防止進程之間彼此干擾和破壞,每個進程都擁有一個獨立的地址空間和其他資源,除了共享全局變量外,不允許其他進程的訪問.但同一進程中的不同線程往往是為了提高并發性以及進行相互之間的合作而創建的,它們共享進程的內存地址空間和資源,如每個線程都可以訪問它們所屬進程地址空間中的所有地址
例如:一個線程的堆棧可以其他線程讀、寫,甚至完全清除.有一個線程打開的文件可以供其他線程讀、寫.
5.系統開銷
在創建或撤消進程時,系統都要為之分配和回收進程控制塊、分配或回收其他資源,如內存空間和I/O設備等.OS為此付出的開銷,明顯大于線程創建或撤消時所付出的開銷
例如:在Solaris 2 OS中,線程的創建要比進程的創建快30倍,而線程上下文切換要比進程上下文切換快5倍.
6.支持多處理機系統
在多處理機系統中,對于傳統的進程,即單線程的進程,不管有多少處理機,該進程只能運行在一個處理機上.但對于多線程進程,就可以將一個進程的多個線程分配到多個處理機上,使它們并發執行,這無疑將加速進程的完成
參考《計算機操作系統》(第4版) P82~P84