線程的基本概念
引入進程的目的,是為了使多道程序并發(fā)執(zhí)行,以提高資源利用率和系統(tǒng)吞吐量;而引入線程,則是為了減小程序在并發(fā)執(zhí)行時所付出的時空開銷,提高操作系統(tǒng)的并發(fā)性能。
線程最直接的理解就是“輕量級進程”,它是一個基本的CPU執(zhí)行單元,也是程序執(zhí)行流的最小單元,由線程ID、程序計數(shù)器、寄存器集合和堆棧組成。線程是進程中的一個實體,是被系統(tǒng)獨立調(diào)度和分派的基本單位,線程自己不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其他線程共享進程所擁有的全部資源。
一個線程可以創(chuàng)建和撤銷另一個線程,同一進程中的多個線程之間可以并發(fā)執(zhí)行。由于線程之間的相互制約,致使線程在運行中呈現(xiàn)出間斷性。線程也有就緒、阻塞和運行三種基本狀態(tài)。
引入線程后,進程的內(nèi)涵發(fā)生了改變,進程只作為除CPU以外系統(tǒng)資源的分配單元,線程則作為處理機的分配單元。
線程與進程的比較
1) 調(diào)度
在傳統(tǒng)的操作系統(tǒng)中,擁有資源和獨立調(diào)度的基本單位都是進程。在引入線程的操作系統(tǒng)中,線程是獨立調(diào)度的基本單位,進程是資源擁有的基本單位。在同一進程中,線程的切換不會引起進程切換。在不同進程中進行線程切換,如從一個進程內(nèi)的線程切換到另一個進程中的線程時,會引起進程切換。2) 擁有資源
不論是傳統(tǒng)操作系統(tǒng)還是設(shè)有線程的操作系統(tǒng),進程都是擁有資源的基本單位,而線程不擁有系統(tǒng)資源(也有一點必不可少的資源),但線程可以訪問其隸屬進程的系統(tǒng)資源。3) 并發(fā)性
在引入線程的操作系統(tǒng)中,不僅進程之間可以并發(fā)執(zhí)行,而且多個線程之間也可以并發(fā)執(zhí)行,從而使操作系統(tǒng)具有更好的并發(fā)性,提高了系統(tǒng)的吞吐量。4) 系統(tǒng)開銷
由于創(chuàng)建或撤銷進程時,系統(tǒng)都要為之分配或回收資源,如內(nèi)存空間、 I/O設(shè)備等,因此操作系統(tǒng)所付出的開銷遠大于創(chuàng)建或撤銷線程時的開銷。類似地,在進行進程切換時,涉及當(dāng)前執(zhí)行進程CPU環(huán)境的保存及新調(diào)度到進程CPU環(huán)境的設(shè)置,而線程切換時只需保存和設(shè)置少量寄存器內(nèi)容,開銷很小。此外,由于同一進程內(nèi)的多個線程共享進程的地址空間,因此,這些線程之間的同步與通信非常容易實現(xiàn),甚至無需操作系統(tǒng)的干預(yù)。5) 地址空間和其他資源(如打開的文件)
進程的地址空間之間互相獨立,同一進程的各線程間共享進程的資源,某進程內(nèi)的線程對于其他進程不可見。6) 通信方面
進程間通信(IPC)需要進程同步和互斥手段的輔助,以保證數(shù)據(jù)的一致性,而線程間可以直接讀/寫進程數(shù)據(jù)段(如全局變量)來進行通信。
線程的實現(xiàn)方式
線程的實現(xiàn)可以分為三類:用戶級線程(User-LevelThread, ULT)、內(nèi)核級線程(Kemel-LevelThread, KLT)(內(nèi)核支持的線程)和組合方式。
1) 用戶級線程
在用戶級線程中,有關(guān)線程管理的所有工作都由應(yīng)用程序完成,內(nèi)核意識不到線程的存在。應(yīng)用程序可以通過使用線程庫設(shè)計成多線程程序。通常,應(yīng)用程序從單線程起始,在該線程中開始運行,在其運行的任何時刻,可以通過調(diào)用線程庫中的派生例程創(chuàng)建一個在相同進程中運行的新線程。2) 內(nèi)核級線程
在內(nèi)核級線程中,線程管理的所有工作由內(nèi)核完成,應(yīng)用程序沒有進行線程管理的代碼,只有一個到內(nèi)核級線程的編程接口。內(nèi)核為進程及其內(nèi)部的每個線程維護上下文信息,調(diào)度也是在內(nèi)核基于線程架構(gòu)的基礎(chǔ)上完成。-
3) 組合方式
在一些系統(tǒng)中,使用組合方式的多線程實現(xiàn)。線程創(chuàng)建完全在用戶空間中完成,線程的調(diào)度和同步也在應(yīng)用程序中進行。一個應(yīng)用程序中的多個用戶級線程被映射到一些(小于或等于用戶級線程的數(shù)目)內(nèi)核級線程上。
多線程模型
有些系統(tǒng)同時支持用戶線程和內(nèi)核線程由此產(chǎn)生了不同的多線程模型,即實現(xiàn)用戶級線程和內(nèi)核級線程的連接方式。
1) 多對一模型
將多個用戶級線程映射到一個內(nèi)核級線程,線程管理在用戶空間完成。此模式中,用戶級線程對操作系統(tǒng)不可見(即透明)。
優(yōu)點:線程管理是在用戶空間進行的,因而效率比較高。
缺點:當(dāng)一個線程在使用內(nèi)核服務(wù)時被阻塞,那么整個進程都會被阻塞;多個線程不能并行地運行在多處理機上。2) 一對一模型
將每個用戶級線程映射到一個內(nèi)核級線程。
優(yōu)點:當(dāng)一個線程被阻塞后,允許另一個線程繼續(xù)執(zhí)行,所以并發(fā)能力較強。
缺點:每創(chuàng)建一個用戶級線程都需要創(chuàng)建一個內(nèi)核級線程與其對應(yīng),這樣創(chuàng)建線程的開銷比較大,會影響到應(yīng)用程序的性能。3) 多對多模型
將 n 個用戶級線程映射到 m 個內(nèi)核級線程上,要求 m <= n。
特點:在多對一模型和一對一模型中取了個折中,克服了多對一模型的并發(fā)度不高的缺點,又克服了一對一模型的一個用戶進程占用太多內(nèi)核級線程,開銷太大的缺點。又擁有多對一模型和一對一模型各自的優(yōu)點,可謂集兩者之所長。
