前言
一個(gè)進(jìn)程內(nèi)有多個(gè)線(xiàn)程,線(xiàn)程有自己的寄存器,程序計(jì)數(shù)器,堆棧,狀態(tài)。但是線(xiàn)程間是沒(méi)有保護(hù)的,可以共享地址空間,打開(kāi)文件集,子進(jìn)程,定時(shí)器以及相關(guān)信號(hào)量。為什么沒(méi)有保護(hù),原因是:不可能,也沒(méi)必要。不同進(jìn)程可能來(lái)自不同用戶(hù),它們之間彼此可能有敵意,用戶(hù)所持有的資源以進(jìn)程為單位。
與傳統(tǒng)進(jìn)程一樣,線(xiàn)程也擁有運(yùn)行,阻塞,就緒終止?fàn)顟B(tài),正在運(yùn)行的線(xiàn)程獨(dú)占CPU并且活躍。與進(jìn)程狀態(tài)切換一致,這里就不介紹了。
每個(gè)線(xiàn)程堆棧都有一幀,在該棧幀存放了局部變量和過(guò)程調(diào)用后的返回地址。
在多線(xiàn)程情況下,進(jìn)程通常會(huì)從當(dāng)前的單個(gè)線(xiàn)程開(kāi)始,也就是主線(xiàn)程,該線(xiàn)程會(huì)調(diào)用庫(kù)函數(shù)(thread_create)來(lái)創(chuàng)建新線(xiàn)程。一般來(lái)說(shuō),線(xiàn)程之間是平等的。這里介紹其它庫(kù)函數(shù):
pthread_exit:線(xiàn)程運(yùn)行結(jié)束時(shí),退出,線(xiàn)程消失。
pthread_join:一個(gè)線(xiàn)程可以阻塞等待另一個(gè)線(xiàn)程退出。
pthread_yield:允許線(xiàn)程自動(dòng)放棄CPU讓給其它線(xiàn)程。
4. pthread_attr_init:創(chuàng)建并初始化一個(gè)線(xiàn)程的屬性結(jié)構(gòu)。
5. pthread_attr_destroy:刪除一個(gè)線(xiàn)程的屬性結(jié)構(gòu)。
pthread.h
在用戶(hù)態(tài)實(shí)現(xiàn)線(xiàn)程
在用戶(hù)空間管理線(xiàn)程時(shí),每個(gè)進(jìn)程都會(huì)有一個(gè)線(xiàn)程表,用來(lái)跟蹤該進(jìn)程中的線(xiàn)程。這些表和內(nèi)核空間中的進(jìn)程表相似,不過(guò)它僅記錄線(xiàn)程的屬性。
用戶(hù)線(xiàn)程中,每個(gè)進(jìn)程都有其相關(guān)調(diào)度算法,可擴(kuò)展性高,這是因?yàn)閮?nèi)核線(xiàn)程需要固定的表格和堆棧空間。
但是,由于用戶(hù)線(xiàn)程沒(méi)有時(shí)鐘中斷,導(dǎo)致某線(xiàn)程想要運(yùn)行時(shí),只能依靠前一個(gè)線(xiàn)程主動(dòng)放棄CPU,所以沒(méi)有輪轉(zhuǎn)的說(shuō)法。
在內(nèi)核中使用線(xiàn)程
當(dāng)內(nèi)核支持管理線(xiàn)程時(shí),進(jìn)程中就沒(méi)有線(xiàn)程表了,相反,在內(nèi)核中就有一張線(xiàn)程表,線(xiàn)程想要?jiǎng)?chuàng)建新線(xiàn)程時(shí),通過(guò)系統(tǒng)調(diào)用來(lái)對(duì)線(xiàn)程表更新。另外,內(nèi)核還維護(hù)了傳統(tǒng)的進(jìn)程表。
在上述情況下,當(dāng)一個(gè)線(xiàn)程阻塞時(shí),就可以通過(guò)系統(tǒng)調(diào)用(內(nèi)核中的線(xiàn)程表)來(lái)切換線(xiàn)程了。
在內(nèi)核回收和創(chuàng)建線(xiàn)程代價(jià)是比較大的,所以回收時(shí),一般會(huì)將線(xiàn)程標(biāo)記為不可運(yùn)行(并不是真正的回收),需要時(shí)再啟動(dòng)。用戶(hù)態(tài)線(xiàn)程不需要。
雖然內(nèi)核線(xiàn)程可以解決很多問(wèn)題,但不是能解決所有問(wèn)題。比如信號(hào)問(wèn)題,創(chuàng)建新進(jìn)程問(wèn)題等......
混合實(shí)現(xiàn)
人們研究出了采用多個(gè)用戶(hù)線(xiàn)程對(duì)應(yīng)一個(gè)內(nèi)核線(xiàn)程的方法,多個(gè)用戶(hù)線(xiàn)程多路復(fù)用。
彈出式線(xiàn)程
在分布式系統(tǒng)中,線(xiàn)程經(jīng)常使用,通常下,服務(wù)接受到消息后,該服務(wù)所對(duì)應(yīng)的線(xiàn)程會(huì)阻塞并receive,但是彈出式線(xiàn)程會(huì)創(chuàng)建一個(gè)新的線(xiàn)程去處理收到的消息。
在一些OS中,協(xié)作的進(jìn)程可能共享一些彼此都能讀寫(xiě)的公共存儲(chǔ)區(qū)。該存儲(chǔ)區(qū)可能是一個(gè)數(shù)據(jù)結(jié)構(gòu),可能是一個(gè)共享文件。
審核編輯:劉清
-
寄存器
+關(guān)注
關(guān)注
31文章
5372瀏覽量
121336 -
計(jì)數(shù)器
+關(guān)注
關(guān)注
32文章
2276瀏覽量
95079 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3256瀏覽量
115474
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論