操作系统原理第四章:线程
目錄
- 1 線(xiàn)程的引入
- 1.1 線(xiàn)程的由來(lái)
- 1.2 線(xiàn)程的特點(diǎn)
- 1.3 線(xiàn)程的定義
- 1.4 進(jìn)程和線(xiàn)程的比較
- 2 內(nèi)核線(xiàn)程和用戶(hù)線(xiàn)程
- 2.1 內(nèi)核線(xiàn)程
- 2.2 用戶(hù)線(xiàn)程
- 2.3 兩者比較
- 3 線(xiàn)程模型
1 線(xiàn)程的引入
1.1 線(xiàn)程的由來(lái)
前面章節(jié)提到,引入進(jìn)程是為了解決程序并發(fā)所出現(xiàn)的一些問(wèn)題,進(jìn)程具有兩個(gè)基本的屬性:
- 進(jìn)程是一個(gè)擁有資源的獨(dú)立單位:它可獨(dú)立分配虛地址空間、主存和其它;
- 進(jìn)程是一個(gè)可獨(dú)立調(diào)度和分派的基本單位。
正是因?yàn)檫M(jìn)程具有這兩個(gè)基本屬性,所以進(jìn)程成為并發(fā)執(zhí)行的基本單位, 在一些早期的OS中,比如大多數(shù)UNIX系統(tǒng)、Linux等,進(jìn)程同時(shí)具有這二個(gè)屬性,由于 進(jìn)程是一個(gè)資源的擁有者 ,因而在進(jìn)程創(chuàng)建、撤銷(xiāo)、調(diào)度切換時(shí),系統(tǒng)需要付出較大的時(shí)空開(kāi)銷(xiāo),所以進(jìn)程的數(shù)目不宜過(guò)多,進(jìn)程切換頻率不宜過(guò)高,否則會(huì)限制并發(fā)程度,操作系統(tǒng)的設(shè)計(jì)目標(biāo)是提高并發(fā)度,減小系統(tǒng)開(kāi)銷(xiāo),顯然進(jìn)程還不能做到完全的高效,所以引入了線(xiàn)程的概念。
那么有沒(méi)有一種方法能夠既提高系統(tǒng)并發(fā),還能減少系統(tǒng)開(kāi)銷(xiāo)呢,我們采用的方法是將進(jìn)程的兩個(gè)基本屬性分開(kāi),對(duì)于擁有資源的基本單位,不對(duì)其進(jìn)行頻繁切換,對(duì)于調(diào)度的基本單位,不作為擁有資源的單位,“輕裝上陣”,引入線(xiàn)程以小的開(kāi)銷(xiāo)來(lái)提高進(jìn)程內(nèi)的并發(fā)程度。
在沒(méi)有引入線(xiàn)程之前,進(jìn)程作為資源分配單位(存儲(chǔ)器、文件)和CPU調(diào)度單位。當(dāng)引入線(xiàn)程后把線(xiàn)程作為作為CPU調(diào)度單位,而進(jìn)程只作為其他資源分配單位。相比進(jìn)程,線(xiàn)程只擁有必不可少的資源,如:線(xiàn)程狀態(tài)、程序計(jì)數(shù)器、寄存器上下文和棧,線(xiàn)程同樣具有就緒、阻塞和執(zhí)行三種基本狀態(tài),一個(gè)進(jìn)程可以創(chuàng)建多個(gè)線(xiàn)程,線(xiàn)程與同屬一個(gè)進(jìn)程的其它線(xiàn)程共享進(jìn)程擁有的全部資源,并且這些線(xiàn)程可以并發(fā)執(zhí)行。
1.2 線(xiàn)程的特點(diǎn)
減小并發(fā)執(zhí)行的時(shí)間和空間開(kāi)銷(xiāo)(線(xiàn)程的創(chuàng)建、退出和調(diào)度),因此容許在系統(tǒng)中建立更多的線(xiàn)程來(lái)提高并發(fā)程度,因?yàn)榫€(xiàn)程有如下特點(diǎn):
- 線(xiàn)程的創(chuàng)建時(shí)間比進(jìn)程短;
- 線(xiàn)程的終止時(shí)間比進(jìn)程短;
- 同進(jìn)程內(nèi)的線(xiàn)程切換時(shí)間比進(jìn)程短;
- 由于同進(jìn)程內(nèi)線(xiàn)程間共享內(nèi)存和文件資源,可直接進(jìn)行不通過(guò)內(nèi)核的通信;
- 一個(gè)多線(xiàn)程的應(yīng)用在執(zhí)行中,即使其中的某個(gè)線(xiàn)程阻塞,其他的線(xiàn)程還可繼續(xù)執(zhí)行,從而提高響應(yīng)速度
- 同一進(jìn)程的多個(gè)線(xiàn)程共享該進(jìn)程的內(nèi)存等資源
- 創(chuàng)建和切換線(xiàn)程的開(kāi)銷(xiāo)要低于進(jìn)程。比如,Solaris中進(jìn)程創(chuàng)建時(shí)間是線(xiàn)程創(chuàng)建的30倍,進(jìn)程切換時(shí)間是線(xiàn)程切換的5倍
- 多線(xiàn)程更適用于多處理機(jī)結(jié)構(gòu)
1.3 線(xiàn)程的定義
線(xiàn)程(輕型進(jìn)程)是CPU運(yùn)用的一個(gè)基本單元,包括:
- 程序計(jì)數(shù)器 (program counter)
- 寄存器集 (register set)
- 棧空間 (stack space)
一個(gè)線(xiàn)程與它的對(duì)等線(xiàn)程共享如下內(nèi)容:
- 代碼段 (code section)
- 數(shù)據(jù)段 (data section)
- 操作系統(tǒng)資源 (operating-system resources)
傳統(tǒng)的或重型進(jìn)程等價(jià)于只有一個(gè)線(xiàn)程的任務(wù),下圖是單線(xiàn)程和多線(xiàn)程的對(duì)比,可以從圖中看到多個(gè)線(xiàn)程共享code,data,files,并且每個(gè)線(xiàn)程有自己的registers,stack:
1.4 進(jìn)程和線(xiàn)程的比較
- 并發(fā)性:在引入線(xiàn)程的OS中,不僅進(jìn)程之間可以并發(fā)執(zhí)行,而且在一個(gè)進(jìn)程中的多個(gè)線(xiàn)程之間亦可并發(fā)執(zhí)行,因而使OS具有更好的并發(fā)性,從而能更有效地使用系統(tǒng)資源和提高系統(tǒng)吞吐量;
- 擁有資源:進(jìn)程是擁有資源的獨(dú)立單位,而線(xiàn)程只擁有一些必不可少的資源;
- 系統(tǒng)開(kāi)銷(xiāo):在創(chuàng)建或撤消進(jìn)程時(shí),系統(tǒng)都要為之分配或回收資源,如內(nèi)存空間、I/O設(shè)備等。因此,OS所付出的開(kāi)銷(xiāo)將明顯地大于在創(chuàng)建或撤消線(xiàn)程時(shí)的開(kāi)銷(xiāo);
- 地址空間和其他資源(如打開(kāi)文件):進(jìn)程間相互獨(dú)立,同一進(jìn)程的各線(xiàn)程間共享,某進(jìn)程內(nèi)的線(xiàn)程在其他進(jìn)程不可見(jiàn);
- 通信:進(jìn)程間通信IPC,線(xiàn)程間可以直接讀寫(xiě)進(jìn)程數(shù)據(jù)段(如全局變量)來(lái)進(jìn)行通信,需要進(jìn)程同步和互斥手段的輔助,以保證數(shù)據(jù)的一致性;
- 調(diào)度:線(xiàn)程上下文切換比進(jìn)程上下文切換要快得多,下圖是線(xiàn)程切換和進(jìn)程切換的示意圖,當(dāng)單線(xiàn)程進(jìn)程需要切換的時(shí)候,整塊內(nèi)容都需要切換,當(dāng)多線(xiàn)程進(jìn)行切換的時(shí)候,只需要切換單個(gè)線(xiàn)程內(nèi)容,即虛線(xiàn)框內(nèi)的內(nèi)容。
2 內(nèi)核線(xiàn)程和用戶(hù)線(xiàn)程
線(xiàn)程是一個(gè)輕型的進(jìn)程,引入線(xiàn)程是為了進(jìn)一步提高系統(tǒng)并發(fā),從而提高系統(tǒng)效率,線(xiàn)程在實(shí)現(xiàn)的時(shí)候分為兩種:
- 內(nèi)核支持的線(xiàn)程 (Kernel-supported threads)
- 用戶(hù)級(jí)線(xiàn)程 (User-level threads):在內(nèi)核之上,通過(guò)用戶(hù)級(jí)的庫(kù)調(diào)用
2.1 內(nèi)核線(xiàn)程
內(nèi)核線(xiàn)程由內(nèi)核支持,在內(nèi)核空間執(zhí)行線(xiàn)程創(chuàng)建、調(diào)度和管理,當(dāng)線(xiàn)程是內(nèi)核線(xiàn)程時(shí),才真正的是CPU調(diào)度的基本單位,這么說(shuō)是因?yàn)楹竺嬉v到的用戶(hù)線(xiàn)程并不是CPU調(diào)度的基本單位。內(nèi)核線(xiàn)程是依賴(lài)于操作系統(tǒng)的,這個(gè)時(shí)候內(nèi)核維護(hù)進(jìn)程和線(xiàn)程的上下文信息,線(xiàn)程切換由內(nèi)核完成,一個(gè)線(xiàn)程發(fā)起系統(tǒng)調(diào)用而阻塞,不會(huì)影響其他線(xiàn)程的運(yùn)行,時(shí)間片分配給線(xiàn)程,所以多線(xiàn)程的進(jìn)程獲得更多CPU時(shí)間(線(xiàn)程作為CPU調(diào)度的基本單位,每個(gè)線(xiàn)程都會(huì)分得時(shí)間片,所以線(xiàn)程越多的進(jìn)程,分到的CPU時(shí)間越多)。
2.2 用戶(hù)線(xiàn)程
用戶(hù)線(xiàn)程是由用戶(hù)級(jí)線(xiàn)程庫(kù)進(jìn)行管理的線(xiàn)程,這個(gè)時(shí)候線(xiàn)程庫(kù)提供對(duì)線(xiàn)程創(chuàng)建\調(diào)度和管理的支持,無(wú)需內(nèi)核支持,因此用戶(hù)線(xiàn)程不是CPU調(diào)度的基本單位,此時(shí)進(jìn)程是CPU調(diào)度的基本單位。
由于用戶(hù)線(xiàn)程不依賴(lài)于 OS 核心,應(yīng)用進(jìn)程利用線(xiàn)程庫(kù)提供創(chuàng)建、同步、調(diào)度和管理線(xiàn)程的函數(shù)來(lái)控制用戶(hù)線(xiàn)程。調(diào)度由應(yīng)用軟件內(nèi)部進(jìn)行,通常采用非搶先式和更簡(jiǎn)單的規(guī)則,也無(wú)需用戶(hù)態(tài)核心態(tài)切換,所以速度特別快 。
用戶(hù)線(xiàn)程的維護(hù)由應(yīng)用進(jìn)程完成,內(nèi)核不了解用戶(hù)線(xiàn)程的存在,用戶(hù)線(xiàn)程切換不需要內(nèi)核特權(quán),用戶(hù)線(xiàn)程的缺點(diǎn)是如果內(nèi)核是單線(xiàn)程的,那么一個(gè)用戶(hù)線(xiàn)程發(fā)起系統(tǒng)調(diào)用而阻塞,則整個(gè)進(jìn)程阻塞,此時(shí)時(shí)間片分配給進(jìn)程,多線(xiàn)程則每個(gè)線(xiàn)程就慢。
2.3 兩者比較
- 調(diào)度方式:內(nèi)核線(xiàn)程的調(diào)度和切換與進(jìn)程的調(diào)度和切換十分相似,用戶(hù)線(xiàn)程的調(diào)度不需OS的支持;
- 調(diào)度單位:用戶(hù)線(xiàn)程的調(diào)度以進(jìn)程為單位進(jìn)行,在采用時(shí)間片輪轉(zhuǎn)調(diào)度算法時(shí),每個(gè)進(jìn)程分配相同的時(shí)間片。對(duì)內(nèi)核級(jí)線(xiàn)程,每個(gè)線(xiàn)程分配時(shí)間片
3 線(xiàn)程模型
用戶(hù)線(xiàn)程是在用戶(hù)空間去實(shí)現(xiàn)的,有關(guān)于用戶(hù)線(xiàn)程的所有操作都是在用戶(hù)空間里實(shí)現(xiàn)的,那么這樣的用戶(hù)線(xiàn)程如果要用到操作系統(tǒng)提供的功能的時(shí)候,它通常是要映射到內(nèi)核空間去,就要在用戶(hù)線(xiàn)程和內(nèi)核線(xiàn)程之間做映射,在映射過(guò)程中有以下三種模式:
- 多對(duì)一 (Many-to-One):多個(gè)用戶(hù)線(xiàn)程映射到內(nèi)核線(xiàn)程上,如下圖,任一時(shí)刻只能有一個(gè)線(xiàn)程可以訪(fǎng)問(wèn)內(nèi)核(并發(fā)性低),一個(gè)用戶(hù)線(xiàn)程發(fā)起系統(tǒng)調(diào)用而阻塞,則整個(gè)進(jìn)程阻塞:
- 一對(duì)一 (One-to-One):每個(gè)用戶(hù)線(xiàn)程對(duì)應(yīng)一個(gè)內(nèi)核線(xiàn)程,如下圖,提供了更好的并發(fā)性,一個(gè)用戶(hù)線(xiàn)程發(fā)起系統(tǒng)調(diào)用而阻塞時(shí)允許另一個(gè)線(xiàn)程運(yùn)行,每創(chuàng)建一個(gè)用戶(hù)級(jí)線(xiàn)程需創(chuàng)建一個(gè)相應(yīng)的內(nèi)核線(xiàn)程,帶來(lái)了額外開(kāi)銷(xiāo),所以許多系統(tǒng)限制應(yīng)用中的線(xiàn)程數(shù)目:
- 多對(duì)多 (Many-to-Many):為了克服上述兩種方式的缺點(diǎn),引入了多對(duì)多模型,不限制應(yīng)用的線(xiàn)程數(shù)、多個(gè)線(xiàn)程可以并發(fā),如下圖:
總結(jié)
以上是生活随笔為你收集整理的操作系统原理第四章:线程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 操作系统原理第三章:进程
- 下一篇: 操作系统原理第五章:CPU调度