前文所說(shuō)剑梳,線程是一組任務(wù)執(zhí)行序列的組合唆貌,執(zhí)行序列是一個(gè)抽象的概念,不好控制垢乙,而線程是一個(gè)實(shí)體的概念锨咙,用線程來(lái)關(guān)聯(lián)一組執(zhí)行序列,將抽象概念實(shí)體化追逮。我們下面來(lái)看看操作系統(tǒng)是怎么來(lái)管理線程的酪刀。
第一節(jié)的隱喻中,我們說(shuō)到線程就是生產(chǎn)流水線(線程)钮孵,但是這個(gè)流水線是沒(méi)有傳送帶的骂倘,它自己是不會(huì)動(dòng)的。那流水線上面的環(huán)節(jié)(任務(wù)執(zhí)行序列)怎么執(zhí)行呢巴席?咱們就來(lái)一步步揭開(kāi)這個(gè)核心問(wèn)題的面紗历涝。
線程是個(gè)實(shí)體概念,操作系統(tǒng)用PCB(Process Control Block漾唉,進(jìn)程(線程)控制塊)來(lái)表示線程的實(shí)體荧库,里面就有線程的名稱,線程優(yōu)先級(jí)赵刑,線程當(dāng)前狀態(tài)等各種信息分衫。那么操作系統(tǒng)有一個(gè)PCB表(其實(shí)是隊(duì)列),上面記錄這當(dāng)前所有PCB般此,也就是記錄了所有的線程蚪战,先標(biāo)記為All_T_T(All Thread Table);除了這個(gè)表之外恤煞,還有一個(gè)就緒的線程的表(也是隊(duì)列)屎勘,標(biāo)記為Ready_T_T(Ready_Thread_Table)。說(shuō)一下線程的狀態(tài):Ready居扒,Running概漱,Waiting等。只有Ready狀態(tài)的喜喂,才會(huì)放到Ready_T_T中瓤摧,其他狀態(tài)包括Running都放在All_T_T中。操作系統(tǒng)拿著這兩個(gè)表玉吁,坐在最前面照弥,大喊,線程2进副,你的時(shí)間片到了这揣,你從CPU上下來(lái)悔常,線程3,該你上CPU了给赞。線程2在下來(lái)之前(因?yàn)橹挥性贑PU上的時(shí)候机打,才能有動(dòng)作發(fā)出),如果自己現(xiàn)在還是在可執(zhí)行狀態(tài)片迅,就把自己的Running狀態(tài)修改為Ready残邀,并把自己加到Ready_T_T中,這時(shí)候線程3是沒(méi)上CPU的柑蛇,他自己是沒(méi)有辦法修改自己狀態(tài)的芥挣,這時(shí)候操作系統(tǒng)修改以下它,將它從Ready_T_T移出來(lái)耻台,并把All_T_T中的線程3狀態(tài)修改為Running空免。
所以,隱喻的例子沒(méi)有辦法展示上面的場(chǎng)景粘我,但是上面的場(chǎng)景才是真正的CPU任務(wù)調(diào)度場(chǎng)景鼓蜒。線程就在那里等著,它自己是死物征字,是CPU在后面全局控制著這一切都弹。舉一個(gè)例子,線程是一個(gè)個(gè)漂浮的靈魂匙姜,CPU是軀殼畅厢,靈魂是沒(méi)辦法拿起重物,沒(méi)辦法干活的氮昧,只有靈魂裝進(jìn)了軀殼里面框杜,才是一個(gè)完整的人,就可以開(kāi)動(dòng)干活了袖肥,但是這個(gè)軀殼是多個(gè)靈魂共享的咪辱,哎,多么悲慘的事啊椎组。
所以油狂,隱喻可以解釋一個(gè)片段的概念,但是沒(méi)辦法解釋整體的概念寸癌,如果隱喻能夠解釋整體的概念专筷,那么只能是被解釋的事物和隱喻中的事物是一個(gè),否則兩個(gè)概念內(nèi)涵完全一致的事物蒸苇,有必要花功夫去做隱喻的解釋嗎磷蛹?
總結(jié)一下。
PCB用來(lái)表示線程/進(jìn)程溪烤,然后操作系統(tǒng)通過(guò)PCB表來(lái)指揮誰(shuí)上CPU味咳,CPU就可以執(zhí)行PCB對(duì)應(yīng)的線程的任務(wù)執(zhí)行序列了庇勃。