Linux線程屬性有(you)哪些?看了(le)這個就(jiu)知道
時間:2018-08-17 來源(yuan):未知(zhi)
線(xian)程屬性標識符:pthread_attr_t 包含在 pthread.h 頭文件中。
[c]view plaincopy
1. //線程屬性(xing)結(jie)構如(ru)下(xia):
2. typedefstruct
3. {
4.intetachstate;//線(xian)程的分離狀(zhuang)態
5.intschedpolicy;//線程調度策(ce)略(lve)
6.structsched_paramschedparam;//線程(cheng)的調(diao)度參數(shu)
7.intinheritsched;//線程(cheng)的繼承性
8.intscope;//線程(cheng)的作用域
9.size_tguardsize;//線程棧末(mo)尾的警戒(jie)緩沖區大小
10.intstackaddr_set; //線(xian)程(cheng)的棧設(she)置
11. void*stackaddr;//線(xian)程棧的位置
12.size_tstacksize;//線(xian)程(cheng)棧(zhan)的大小(xiao)
13.}pthread_attr_t;
屬性值(zhi)不(bu)能直(zhi)接設置,須使用相關函(han)數進行操作,初始化的函(han)數為
pthread_attr_init,這(zhe)個函數(shu)必須在pthread_create函數(shu)之前調用(yong)。之后須用(yong)pthread_attr_destroy函數(shu)來釋放資源。線程屬性主要包括如(ru)下屬性:作用(yong)域(yu)(scope)、棧尺(chi)寸(stack size)、棧地址(stack address)、優先級
(priority)、分離的狀態(detached state)、調(diao)度策略和參(can)數(scheduling policy and parameters)。默認的屬(shu)性為非(fei)(fei)綁定、非(fei)(fei)分離、缺省(sheng)1M的堆棧、與父進程(cheng)同樣級別的優先級。
一、線程的作(zuo)用(yong)域(scope)
作用域屬(shu)性描述(shu)特(te)定線(xian)程(cheng)將與哪(na)些(xie)線(xian)程(cheng)競(jing)爭(zheng)資源(yuan)。線(xian)程(cheng)可以在兩種競(jing)爭(zheng)域內(nei)競(jing)爭(zheng)資源(yuan):
1. 進(jin)程域(process scope):與(yu)同一進(jin)程內的其他線程。
2. 系統域(yu)(system scope):與系統中(zhong)的(de)所有線(xian)程。一個具有系統域(yu)的(de)線(xian)程將與整個系統中(zhong)所有具有系統域(yu)的(de)線(xian)程按照優先(xian)級競爭(zheng)處理器資源,進行(xing)調度。
3. Solaris系(xi)統,實(shi)際上,從 Solaris 9 發行(xing)版(ban)開始,系(xi)統就不再(zai)區(qu)分這兩(liang)個范圍(wei)。
二、線程(cheng)的綁定狀態(binding state)
輕進(jin)(jin)程(cheng)(cheng)(cheng)(cheng)(LWP:Light Weight Process)關于(yu)線(xian)(xian)程(cheng)(cheng)(cheng)(cheng)的(de)綁定,牽涉(she)到另外(wai)一個(ge)概念:輕進(jin)(jin)程(cheng)(cheng)(cheng)(cheng)(LWP:Light Weight Process):輕進(jin)(jin)程(cheng)(cheng)(cheng)(cheng)可以理(li)解為(wei)內核(he)線(xian)(xian)程(cheng)(cheng)(cheng)(cheng),它位于(yu)用戶(hu)層和系統層之間(jian)。系統對線(xian)(xian)程(cheng)(cheng)(cheng)(cheng)資源的(de)分配(pei)、對線(xian)(xian)程(cheng)(cheng)(cheng)(cheng)的(de)控(kong)制是通(tong)過輕進(jin)(jin)程(cheng)(cheng)(cheng)(cheng)來實(shi)現的(de),一個(ge)輕進(jin)(jin)程(cheng)(cheng)(cheng)(cheng)可以控(kong)制一個(ge)或多個(ge)線(xian)(xian)程(cheng)(cheng)(cheng)(cheng)。
1. 非綁定狀(zhuang)態(tai)
默(mo)認狀況(kuang)(kuang)下,啟動(dong)多少(shao)輕進(jin)程(cheng)、哪些輕進(jin)程(cheng)來(lai)控制(zhi)哪些線(xian)程(cheng)是由系(xi)統(tong)來(lai)控制(zhi)的,這(zhe)種狀況(kuang)(kuang)即(ji)稱為非綁定的。
2. 綁定狀(zhuang)態
綁(bang)定(ding)狀(zhuang)況下,則顧名思義(yi),即某個(ge)線(xian)(xian)程(cheng)固(gu)定(ding)的(de)"綁(bang)"在一(yi)個(ge)輕(qing)(qing)進(jin)程(cheng)之上。被綁(bang)定(ding)的(de)線(xian)(xian)程(cheng)具有較(jiao)高的(de)響應速度,這是因(yin)為CPU時(shi)間(jian)片的(de)調度是面向(xiang)輕(qing)(qing)進(jin)程(cheng)的(de),綁(bang)定(ding)的(de)線(xian)(xian)程(cheng)可(ke)(ke)以(yi)保(bao)證在需要(yao)的(de)時(shi)候它總有一(yi)個(ge)輕(qing)(qing)進(jin)程(cheng)可(ke)(ke)用。通過設置被綁(bang)定(ding)的(de)輕(qing)(qing)進(jin)程(cheng)的(de)優先級和調度級可(ke)(ke)以(yi)使得綁(bang)定(ding)的(de)線(xian)(xian)程(cheng)滿足(zu)諸如實時(shi)反應之類的(de)要(yao)求。
三、線(xian)程的分(fen)離狀態(detached state)
1. 線程的分(fen)離狀態決(jue)定一個(ge)線程以什么樣的方(fang)式來終止(zhi)自己。
2. 非分離狀態(tai)
線(xian)程的(de)默認屬性是非分離狀態,這種情況下,原有的(de)線(xian)程等待創建的(de)線(xian)程結束。只有當pthread_join()函數返回(hui)時(shi),創建的(de)線(xian)程才算終止,才能釋放自己占用的(de)系統資源。
3. 分離(li)狀態(tai)
分離線(xian)程(cheng)(cheng)沒有(you)被其他的線(xian)程(cheng)(cheng)所等(deng)待,自(zi)己運行結束了(le),線(xian)程(cheng)(cheng)也(ye)就終止了(le),馬上釋放系統(tong)資源(yuan)。應(ying)該(gai)根據自(zi)己的需要(yao),選擇(ze)適當的分離狀態。
4. 線程分離狀(zhuang)態的函數:pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)。
第二個參數可(ke)選為(wei)PTHREAD_CREATE_DETACHED(分離(li)線程)和 PTHREAD _CREATE_JOINABLE(非分離(li)線程)。
這(zhe)(zhe)里要(yao)(yao)注(zhu)意(yi)的(de)一(yi)點(dian)是(shi),如果設(she)(she)置(zhi)一(yi)個(ge)線(xian)(xian)程(cheng)(cheng)(cheng)為分離線(xian)(xian)程(cheng)(cheng)(cheng),而這(zhe)(zhe)個(ge)線(xian)(xian)程(cheng)(cheng)(cheng)運行(xing)又非常(chang)快(kuai),它(ta)很(hen)可(ke)能在pthread_create函(han)數(shu)返回(hui)之前就終止了,它(ta)終止以(yi)后(hou)就可(ke)能將線(xian)(xian)程(cheng)(cheng)(cheng)號和(he)系(xi)統資(zi)源移交給(gei)其(qi)他的(de)線(xian)(xian)程(cheng)(cheng)(cheng)使(shi)用(yong)(yong),這(zhe)(zhe)樣調用(yong)(yong)pthread_create的(de)線(xian)(xian)程(cheng)(cheng)(cheng)就得(de)到(dao)了錯誤(wu)的(de)線(xian)(xian)程(cheng)(cheng)(cheng)號。要(yao)(yao)避免(mian)這(zhe)(zhe)種情況可(ke)以(yi)采(cai)取一(yi)定的(de)同(tong)步(bu)措(cuo)施,最(zui)簡單的(de)方法之一(yi)是(shi)可(ke)以(yi)在被創建的(de)線(xian)(xian)程(cheng)(cheng)(cheng)里調用(yong)(yong)pthread_cond_timewait函(han)數(shu),讓(rang)這(zhe)(zhe)個(ge)線(xian)(xian)程(cheng)(cheng)(cheng)等待一(yi)會兒,留(liu)出足夠(gou)的(de)時間讓(rang)函(han)數(shu)pthread_create返回(hui)。設(she)(she)置(zhi)一(yi)段等待時間,是(shi)在多(duo)線(xian)(xian)程(cheng)(cheng)(cheng)編(bian)程(cheng)(cheng)(cheng)里常(chang)用(yong)(yong)的(de)方法。但是(shi)注(zhu)意(yi)不(bu)要(yao)(yao)使(shi)用(yong)(yong)諸如wait()之類的(de)函(han)數(shu),它(ta)們是(shi)使(shi)整個(ge)進程(cheng)(cheng)(cheng)睡眠,并(bing)不(bu)能解決線(xian)(xian)程(cheng)(cheng)(cheng)同(tong)步(bu)的(de)問(wen)題。
四、線程的(de)優先級(priority)
1. 新線程(cheng)的優先級為(wei)默認為(wei)0。
2. 新線(xian)程不繼(ji)承父線(xian)程調度優先級(PTHREAD_EXPLICIT_SCHED)
3. 僅當調度(du)策(ce)略為(wei)實時(shi)(即SCHED_RR或SCHED_FIFO)時(shi)才有效,并(bing)可以(yi)在運(yun)行時(shi)通過(guo)pthread_setschedparam()函(han)數(shu)來改變,缺(que)省為(wei)0。
五、線程的棧(zhan)地(di)址(stack address)
1. POSIX.1定義了兩個常(chang)量_POSIX_THREAD_ATTR_STACKADDR 和(he)_POSIX_THREAD_ATTR_STACKSIZE檢測系統是否支持棧屬性。
2. 也(ye)可以(yi)給(gei)sysconf函數傳遞_SC_THREAD_ATTR_STACKADDR或(huo)
_SC_THREAD_ATTR_STACKSIZE來(lai)進行檢(jian)測。
3. 當進程棧(zhan)地(di)(di)址(zhi)(zhi)(zhi)空間不(bu)夠用時,指定(ding)新建線程使(shi)用由malloc分配的空間作為自己的棧(zhan)空間。通過pthread_attr_setstackaddr和(he)(he)pthread_attr_getstackaddr兩個函數分別設(she)置和(he)(he)獲取(qu)線程的棧(zhan)地(di)(di)址(zhi)(zhi)(zhi)。傳給(gei)pthread_attr_setstackaddr函數的地(di)(di)址(zhi)(zhi)(zhi)是(shi)緩(huan)沖區的低地(di)(di)址(zhi)(zhi)(zhi)(不(bu)一定(ding)是(shi)棧(zhan)的開始地(di)(di)址(zhi)(zhi)(zhi),棧(zhan)可(ke)能從高地(di)(di)址(zhi)(zhi)(zhi)往低地(di)(di)址(zhi)(zhi)(zhi)增長)。
六、線程的棧(zhan)大小(stack size)
1. 當(dang)系(xi)統中有很多線程時,可能需要減小每個(ge)線程棧的默認大小,防止進程的地(di)址空間不夠用
2. 當線程調用(yong)(yong)的(de)函(han)數(shu)會分配很大的(de)局部變量(liang)或者函(han)數(shu)調用(yong)(yong)層次很深時,可能(neng)需要增大線程棧的(de)默認大小。
3. 函數pthread_attr_getstacksize和 pthread_attr_setstacksize提(ti)供設置。
七、線程的棧保護區(qu)大小(stack guard size)
1. 在(zai)線程棧頂留出(chu)一段空間,防(fang)止棧溢出(chu)。
2. 當棧指針(zhen)進入這段(duan)保護區時,系統會發出錯誤,通常是發送信號給(gei)線程。
3. 該屬(shu)性(xing)默認值是PAGESIZE大小,該屬(shu)性(xing)被(bei)設置時,系統會(hui)自動將該屬(shu)性(xing)大小補齊(qi)為頁大小的整數倍。
4. 當改變(bian)棧地址(zhi)屬性時(shi),棧保護區大小通常清(qing)零。
八、線程的調度策(ce)略(schedpolicy)
POSIX標準指定(ding)了三種(zhong)調度策略(lve):先入先出策略(lve) (SCHED_FIFO)、循環(huan)策略(lve) (SCHED_RR) 和自(zi)定(ding)義策略(lve) (SCHED_OTHER)。SCHED_FIFO 是基于隊(dui)列的調度程(cheng)序,對于每(mei)個(ge)優先級都會使用(yong)不(bu)同(tong)的隊(dui)列。SCHED_RR 與 FIFO 相似,不(bu)同(tong)的是前者的每(mei)個(ge)線程(cheng)都有一(yi)個(ge)執行時間配(pei)額。SCHED_FIFO 和 SCHED_RR 是對 POSIX Realtime 的擴展。SCHED_OTHER 是缺省的調度策略(lve)。
1. 新線(xian)(xian)程(cheng)默(mo)認使用 SCHED_OTHER 調度策(ce)略。線(xian)(xian)程(cheng)一旦開始(shi)運行,直到被搶占(zhan)或者直到線(xian)(xian)程(cheng)阻塞或停止為止。
2. SCHED_FIFO
如果調用(yong)進程具有有效(xiao)的用(yong)戶 ID 0,則(ze)爭用(yong)范圍為系統
(PTHREAD_SCOPE_SYSTEM) 的(de)先(xian)入先(xian)出線程(cheng)(cheng)屬于實時 (RT) 調度(du)(du)類。如果這些(xie)線程(cheng)(cheng)未被優先(xian)級更高(gao)的(de)線程(cheng)(cheng)搶占(zhan),則(ze)會繼(ji)續處(chu)理該線程(cheng)(cheng),直(zhi)到該線程(cheng)(cheng)放棄(qi)或阻塞(sai)為止(zhi)。對于具(ju)有進程(cheng)(cheng)爭用范(fan)圍 (PTHREAD_SCOPE_PROCESS)) 的(de)線程(cheng)(cheng)或其(qi)調用進程(cheng)(cheng)沒有有效用戶 ID 0 的(de)線程(cheng)(cheng),請使用 SCHED_FIFO,SCHED_FIFO 基于 TS 調度(du)(du)類。
3. SCHED_RR
如果(guo)調(diao)用進(jin)程具有(you)有(you)效(xiao)的用戶 ID 0,則爭用范圍為(wei)系統(tong)
(PTHREAD_SCOPE_SYSTEM)) 的循環線(xian)(xian)程屬(shu)于實時 (RT) 調度類。如果(guo)這(zhe)些(xie)線(xian)(xian)程未被優先級更(geng)高(gao)的線(xian)(xian)程搶占,并且這(zhe)些(xie)線(xian)(xian)程沒有放(fang)棄或阻塞,則(ze)在系統確(que)定的時間段內將(jiang)一直(zhi)執行這(zhe)些(xie)線(xian)(xian)程。對于具有進程爭用范圍 (PTHREAD_SCOPE_PROCESS)
的(de)(de)線程(cheng),請使用 SCHED_RR(基于 TS 調(diao)度類)。此外,這些線程(cheng)的(de)(de)調(diao)用進程(cheng)沒有(you)有(you)效的(de)(de)用戶 ID 0。
九、線程并(bing)行(xing)級別(concurrency)
應用程(cheng)序(xu)使用 pthread_setconcurrency() 通(tong)知系統其所需(xu)的(de)并發級別。