日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux线程属性总结 http://blog.csdn.net/zsf8701/article/details/7842392

發(fā)布時間:2024/5/14 linux 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux线程属性总结 http://blog.csdn.net/zsf8701/article/details/7842392 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?

Linux線程屬性總結(jié)

分類:?Linux ? 3657人閱讀? 評論(2)? 收藏? 舉報 linux thread solaris concurrency system 多線程

目錄(?)[+]

線程屬性標識符:pthread_attr_t 包含在 pthread.h 頭文件中。

[c]? view plain copy
  • //線程屬性結(jié)構(gòu)如下:??
  • typedef?struct??
  • {??
  • ????int???????????????????etachstate;??????//線程的分離狀態(tài)??
  • ????int???????????????????schedpolicy;?????//線程調(diào)度策略??
  • ????structsched_param?????schedparam;??????//線程的調(diào)度參數(shù)??
  • ????int???????????????????inheritsched;????//線程的繼承性??
  • ????int???????????????????scope;???????????//線程的作用域??
  • ????size_t????????????????guardsize;???????//線程棧末尾的警戒緩沖區(qū)大小??
  • ????int???????????????????stackaddr_set;???//線程的棧設(shè)置??
  • ????void*?????????????????stackaddr;???????//線程棧的位置??
  • ????size_t????????????????stacksize;???????//線程棧的大小??
  • }pthread_attr_t;??
  • 屬性值不能直接設(shè)置,須使用相關(guān)函數(shù)進行操作,初始化的函數(shù)為pthread_attr_init,這個函數(shù)必須在pthread_create函數(shù)之前調(diào)用。之后須用pthread_attr_destroy函數(shù)來釋放資源。線程屬性主要包括如下屬性:作用域(scope)、棧尺寸(stack size)、棧地址(stack address)、優(yōu)先級(priority)、分離的狀態(tài)(detached state)、調(diào)度策略和參數(shù)(scheduling policy and parameters)。默認的屬性為非綁定、非分離、缺省1M的堆棧、與父進程同樣級別的優(yōu)先級。

    一、線程的作用域(scope)

    作用域?qū)傩悦枋鎏囟ň€程將與哪些線程競爭資源。線程可以在兩種競爭域內(nèi)競爭資源:

  • 進程域(process scope):與同一進程內(nèi)的其他線程。
  • 系統(tǒng)域(system scope):與系統(tǒng)中的所有線程。一個具有系統(tǒng)域的線程將與整個系統(tǒng)中所有具有系統(tǒng)域的線程按照優(yōu)先級競爭處理器資源,進行調(diào)度。
  • Solaris系統(tǒng),實際上,從 Solaris 9 發(fā)行版開始,系統(tǒng)就不再區(qū)分這兩個范圍。
  • 二、線程的綁定狀態(tài)(binding state)

    輕進程(LWP:Light Weight Process)關(guān)于線程的綁定,牽涉到另外一個概念:輕進程(LWP:Light Weight Process):輕進程可以理解為內(nèi)核線程,它位于用戶層和系統(tǒng)層之間。系統(tǒng)對線程資源的分配、對線程的控制是通過輕進程來實現(xiàn)的,一個輕進程可以控制一個或多個線程。

  • 非綁定狀態(tài)
    默認狀況下,啟動多少輕進程、哪些輕進程來控制哪些線程是由系統(tǒng)來控制的,這種狀況即稱為非綁定的。
  • 綁定狀態(tài)
    綁定狀況下,則顧名思義,即某個線程固定的"綁"在一個輕進程之上。被綁定的線程具有較高的響應(yīng)速度,這是因為CPU時間片的調(diào)度是面向輕進程的,綁定的線程可以保證在需要的時候它總有一個輕進程可用。通過設(shè)置被綁定的輕進程的優(yōu)先級和調(diào)度級可以使得綁定的線程滿足諸如實時反應(yīng)之類的要求。
  • 三、線程的分離狀態(tài)(detached state)

  • 線程的分離狀態(tài)決定一個線程以什么樣的方式來終止自己。
  • 非分離狀態(tài)
    線程的默認屬性是非分離狀態(tài),這種情況下,原有的線程等待創(chuàng)建的線程結(jié)束。只有當pthread_join()函數(shù)返回時,創(chuàng)建的線程才算終止,才能釋放自己占用的系統(tǒng)資源。
  • 分離狀態(tài)
    分離線程沒有被其他的線程所等待,自己運行結(jié)束了,線程也就終止了,馬上釋放系統(tǒng)資源。應(yīng)該根據(jù)自己的需要,選擇適當?shù)姆蛛x狀態(tài)。
  • 線程分離狀態(tài)的函數(shù):pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)。
    第二個參數(shù)可選為PTHREAD_CREATE_DETACHED(分離線程)和 PTHREAD _CREATE_JOINABLE(非分離線程)。
    這里要注意的一點是,如果設(shè)置一個線程為分離線程,而這個線程運行又非常快,它很可能在pthread_create函數(shù)返回之前就終止了,它終止以后就可能將線程號和系統(tǒng)資源移交給其他的線程使用,這樣調(diào)用pthread_create的線程就得到了錯誤的線程號。要避免這種情況可以采取一定的同步措施,最簡單的方法之一是可以在被創(chuàng)建的線程里調(diào)用pthread_cond_timewait函數(shù),讓這個線程等待一會兒,留出足夠的時間讓函數(shù)pthread_create返回。設(shè)置一段等待時間,是在多線程編程里常用的方法。但是注意不要使用諸如wait()之類的函數(shù),它們是使整個進程睡眠,并不能解決線程同步的問題。
  • 四、線程的優(yōu)先級(priority)

  • 新線程的優(yōu)先級為默認為0。
  • 新線程不繼承父線程調(diào)度優(yōu)先級(PTHREAD_EXPLICIT_SCHED)
  • 僅當調(diào)度策略為實時(即SCHED_RR或SCHED_FIFO)時才有效,并可以在運行時通過pthread_setschedparam()函數(shù)來改變,缺省為0。
  • 五、線程的棧地址(stack address)

  • POSIX.1定義了兩個常量_POSIX_THREAD_ATTR_STACKADDR 和_POSIX_THREAD_ATTR_STACKSIZE檢測系統(tǒng)是否支持棧屬性。
  • 也可以給sysconf函數(shù)傳遞_SC_THREAD_ATTR_STACKADDR或 _SC_THREAD_ATTR_STACKSIZE來進行檢測。
  • 當進程棧地址空間不夠用時,指定新建線程使用由malloc分配的空間作為自己的棧空間。通過pthread_attr_setstackaddr和pthread_attr_getstackaddr兩個函數(shù)分別設(shè)置和獲取線程的棧地址。傳給pthread_attr_setstackaddr函數(shù)的地址是緩沖區(qū)的低地址(不一定是棧的開始地址,棧可能從高地址往低地址增長)。
  • 六、線程的棧大小(stack size)

  • 當系統(tǒng)中有很多線程時,可能需要減小每個線程棧的默認大小,防止進程的地址空間不夠用
  • 當線程調(diào)用的函數(shù)會分配很大的局部變量或者函數(shù)調(diào)用層次很深時,可能需要增大線程棧的默認大小。
  • 函數(shù)pthread_attr_getstacksize和 pthread_attr_setstacksize提供設(shè)置。
  • 七、線程的棧保護區(qū)大小(stack guard size)

  • 在線程棧頂留出一段空間,防止棧溢出。
  • 當棧指針進入這段保護區(qū)時,系統(tǒng)會發(fā)出錯誤,通常是發(fā)送信號給線程。
  • 該屬性默認值是PAGESIZE大小,該屬性被設(shè)置時,系統(tǒng)會自動將該屬性大小補齊為頁大小的整數(shù)倍。
  • 當改變棧地址屬性時,棧保護區(qū)大小通常清零。
  • 八、線程的調(diào)度策略(schedpolicy)

    POSIX標準指定了三種調(diào)度策略:先入先出策略 (SCHED_FIFO)、循環(huán)策略 (SCHED_RR) 和自定義策略 (SCHED_OTHER)。SCHED_FIFO 是基于隊列的調(diào)度程序,對于每個優(yōu)先級都會使用不同的隊列。SCHED_RR 與 FIFO 相似,不同的是前者的每個線程都有一個執(zhí)行時間配額。SCHED_FIFO 和 SCHED_RR 是對 POSIX Realtime 的擴展。SCHED_OTHER 是缺省的調(diào)度策略。

  • 新線程默認使用 SCHED_OTHER 調(diào)度策略。線程一旦開始運行,直到被搶占或者直到線程阻塞或停止為止。
  • SCHED_FIFO
    如果調(diào)用進程具有有效的用戶 ID 0,則爭用范圍為系統(tǒng) (PTHREAD_SCOPE_SYSTEM) 的先入先出線程屬于實時 (RT) 調(diào)度類。如果這些線程未被優(yōu)先級更高的線程搶占,則會繼續(xù)處理該線程,直到該線程放棄或阻塞為止。對于具有進程爭用范圍 (PTHREAD_SCOPE_PROCESS)) 的線程或其調(diào)用進程沒有有效用戶 ID 0 的線程,請使用 SCHED_FIFO,SCHED_FIFO 基于 TS 調(diào)度類。
  • SCHED_RR
    如果調(diào)用進程具有有效的用戶 ID 0,則爭用范圍為系統(tǒng) (PTHREAD_SCOPE_SYSTEM)) 的循環(huán)線程屬于實時 (RT) 調(diào)度類。如果這些線程未被優(yōu)先級更高的線程搶占,并且這些線程沒有放棄或阻塞,則在系統(tǒng)確定的時間段內(nèi)將一直執(zhí)行這些線程。對于具有進程爭用范圍 (PTHREAD_SCOPE_PROCESS) 的線程,請使用 SCHED_RR(基于 TS 調(diào)度類)。此外,這些線程的調(diào)用進程沒有有效的用戶 ID 0。
  • 九、線程并行級別(concurrency)

    應(yīng)用程序使用 pthread_setconcurrency() 通知系統(tǒng)其所需的并發(fā)級別。

    版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。

    總結(jié)

    以上是生活随笔為你收集整理的Linux线程属性总结 http://blog.csdn.net/zsf8701/article/details/7842392的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。