官术网_书友最值得收藏!

1.1 多線程的狀態(tài)和線程調(diào)度

線程是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。大部分情況下,線程包含在進(jìn)程中,是進(jìn)程中的實(shí)際運(yùn)作單位。一個(gè)線程指的是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)執(zhí)行多個(gè)線程,每個(gè)線程執(zhí)行不同的任務(wù)。

同一進(jìn)程中的多個(gè)線程共享該進(jìn)程中的全部系統(tǒng)資源,如虛擬地址空間、文件描述符、信號處理等。但同一進(jìn)程中的多個(gè)線程有各自的調(diào)用棧(Call Stack)、寄存器環(huán)境(Register Context),以及獨(dú)立的線程本地存儲(chǔ)(Thread-local Storage)。

在多核或多路處理器以及支持超線程(Hyper-threading)的處理器上使用多線程程序設(shè)計(jì)的好處是顯而易見的,即這樣的設(shè)計(jì)可提高程序的執(zhí)行吞吐率。即使是在單核處理器的計(jì)算機(jī)上,使用多線程技術(shù)也可以把進(jìn)程中負(fù)責(zé)輸入/輸出(I/O)處理、人機(jī)交互而常被阻塞的部分與密集計(jì)算的部分分開執(zhí)行,編寫專門的工作線程執(zhí)行密集計(jì)算,從而提高程序的執(zhí)行效率。

線程從創(chuàng)建、運(yùn)行到結(jié)束包括下面5個(gè)狀態(tài):新建狀態(tài)、就緒狀態(tài)、運(yùn)行狀態(tài)、阻塞狀態(tài)及死亡狀態(tài)。線程狀態(tài)之間的關(guān)系如圖1-1所示。

圖1-1 線程狀態(tài)之間的關(guān)系

一旦線程進(jìn)入可執(zhí)行狀態(tài),就會(huì)在就緒狀態(tài)與運(yùn)行狀態(tài)下轉(zhuǎn)換,同時(shí)也有可能進(jìn)入等待狀態(tài)或死亡狀態(tài)(線程執(zhí)行完畢即進(jìn)入死亡狀態(tài))。如果一個(gè)線程在運(yùn)行狀態(tài)下發(fā)出輸入/輸出請求,該線程將進(jìn)入阻塞狀態(tài);在其等待輸入/輸出結(jié)束時(shí),線程進(jìn)入就緒狀態(tài)。對于阻塞線程來說,即使系統(tǒng)資源空閑,線程依然不能回到運(yùn)行狀態(tài)。當(dāng)run函數(shù)執(zhí)行完畢時(shí),線程進(jìn)入死亡狀態(tài)。

計(jì)算機(jī)通常只有一個(gè)CPU,如果是單核CPU,在任意時(shí)刻只能執(zhí)行一條機(jī)器指令,每個(gè)線程只有獲得CPU的使用權(quán)才能執(zhí)行指令。所謂多線程的并發(fā)運(yùn)行,從宏觀上來看,指各個(gè)線程輪流獲得CPU的使用權(quán),分別執(zhí)行各自的任務(wù)。在運(yùn)行池中,會(huì)有多個(gè)處于就緒狀態(tài)的線程在等待CPU。線程調(diào)度是指按照特定機(jī)制為多個(gè)線程分配CPU的使用權(quán)。

線程調(diào)度有下面兩種方式。

分時(shí)調(diào)度(系統(tǒng)級別):所有線程輪流擁有CPU的使用權(quán),平均分配每個(gè)線程占用 CPU 的時(shí)間。

搶占式調(diào)度(語言級別):優(yōu)先級高的線程先使用CPU,如果可運(yùn)行線程池中的線程優(yōu)先級相同,就隨機(jī)選擇一個(gè)線程,使其占用CPU。處于運(yùn)行狀態(tài)的線程會(huì)一直運(yùn)行,直至其放棄CPU。

主站蜘蛛池模板: 绍兴市| 鄂托克旗| 仙居县| 晋宁县| 廊坊市| 蒙城县| 和静县| 万安县| 绥德县| 克东县| 怀柔区| 洛阳市| 五华县| 左贡县| 墨竹工卡县| 河南省| 广宁县| 从江县| 尼玛县| 忻州市| 环江| 集贤县| 渭源县| 陆丰市| 香河县| 嘉禾县| 鸡东县| 互助| 陕西省| 永春县| 临澧县| 分宜县| 滁州市| 寿宁县| 荥经县| 遂昌县| 泸西县| 宜章县| 寻甸| 潜江市| 鄂温|