新聞中心
在操作系統(tǒng)中,線程是一種輕量級的執(zhí)行單元,它能夠在不同的執(zhí)行環(huán)境中運行,并與其他線程共享系統(tǒng)資源。在Linux中,創(chuàng)建線程需要使用pthread庫,并且可以通過設(shè)置優(yōu)先級來控制線程的執(zhí)行順序。

成都創(chuàng)新互聯(lián)于2013年開始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元達日做網(wǎng)站,已為上家服務(wù),為達日各地企業(yè)和個人服務(wù),聯(lián)系電話:028-86922220
本文將介紹Linux中創(chuàng)建線程的方法,并詳細(xì)介紹如何設(shè)置線程的優(yōu)先級來控制其執(zhí)行順序。
一、創(chuàng)建線程的方法
Linux中,創(chuàng)建線程的方法是使用pthread庫中的pthread_create()函數(shù)。函數(shù)原型如下:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
在pthread_create()函數(shù)中,之一個參數(shù)thread是指向線程ID的指針,在線程創(chuàng)建成功后,該指針會被設(shè)置為新線程的ID;第二個參數(shù)attr是指向線程屬性的指針,可以用來設(shè)置線程的屬性,如優(yōu)先級、堆棧大小等;第三個參數(shù)start_routine是線程啟動時要執(zhí)行的函數(shù)指針;最后一個參數(shù)arg是傳遞給線程函數(shù)的參數(shù)。
下面是一個簡單的創(chuàng)建線程的例子:
#include
#include
#include
void *thread_func(void *arg)
{
int id = *(int*)arg;
printf(“Hello from thread %d\n”, id);
pthread_exit(NULL);
}
int mn()
{
pthread_t threads[3];
int ids[3] = {1, 2, 3};
int i;
for (i = 0; i
pthread_create(&threads[i], NULL, thread_func, (void*)&ids[i]);
}
for (i = 0; i
pthread_join(threads[i], NULL);
}
return 0;
}
在上面的例子中,創(chuàng)建了3個線程,每個線程執(zhí)行的函數(shù)是thread_func(),并傳遞了一個整數(shù)參數(shù)作為線程ID。線程ID是在主線程中創(chuàng)建,并且使用pthread_join()函數(shù)等待線程執(zhí)行完畢。
二、設(shè)置線程的優(yōu)先級
在Linux中,線程的優(yōu)先級是通過調(diào)整線程調(diào)度策略和調(diào)度參數(shù)來控制的。在pthread庫中,可以使用pthread_attr_t類型的對象來設(shè)置線程屬性,并通過pthread_create()函數(shù)的attr參數(shù)傳遞給新創(chuàng)建的線程。
下面是一個設(shè)置線程優(yōu)先級的例子:
#include
#include
#include
#include
void *thread_func(void *arg)
{
int id = *(int*)arg;
int policy, priority;
struct sched_param param;
pthread_getschedparam(pthread_self(), &policy, ¶m);
priority = param.sched_priority;
printf(“Thread %d: policy=%d priority=%d\n”, id, policy, priority);
pthread_exit(NULL);
}
int mn()
{
pthread_t threads[3];
pthread_attr_t attr;
int ids[3] = {1, 2, 3};
int i;
pthread_attr_init(&attr);
pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
for (i = 0; i
pthread_create(&threads[i], &attr, thread_func, (void*)&ids[i]);
pthread_setschedpolicy(threads[i], SCHED_FIFO);
pthread_setschedprio(threads[i], i + 1);
}
for (i = 0; i
pthread_join(threads[i], NULL);
}
pthread_attr_destroy(&attr);
return 0;
}
在上面的例子中,創(chuàng)建了3個線程,并使用pthread_attr_setinheritsched()函數(shù)設(shè)置線程屬性繼承機制為顯示繼承,即繼承主線程的調(diào)度策略和調(diào)度參數(shù)。使用pthread_setschedpolicy()函數(shù)和pthread_setschedprio()函數(shù)設(shè)置線程的調(diào)度策略為SCHED_FIFO,并通過i+1設(shè)置線程的優(yōu)先級,其中i的范圍為0~2。
線程的調(diào)度策略有SCHED_FIFO、SCHED_RR、SCHED_OTHER三種,優(yōu)先級范圍為1~99,值越小表示優(yōu)先級越高。線程的調(diào)度參數(shù)可以通過struct sched_param類型的對象sched_param來設(shè)置。
三、
相關(guān)問題拓展閱讀:
- linux應(yīng)用與內(nèi)核通信有幾種方式?linux有幾種調(diào)度方式?linux有多少任務(wù)優(yōu)先級?
- linux進程、線程及調(diào)度算法(三)
linux應(yīng)用與內(nèi)核通信有幾種方式?linux有幾種調(diào)度方式?linux有多少任務(wù)優(yōu)先級?
通信方式主要有:文件加共享內(nèi)存,管道,SOCKET。一般都用SOCKET,可液陵襲移植性強。
調(diào)度方式:時間片,優(yōu)先級,還有就是時間片加優(yōu)先級混合,默認(rèn)是第三種。
線程優(yōu)先鬧兄級是汪羨1~99,值越大優(yōu)先級越高。
通訊方式:文件以及共享內(nèi)存,管道,SOCKET。一般使用的SOCKET,便攜性。的
調(diào)度的時間片,優(yōu)先級,有時間片加優(yōu)先喊胡襲級的鄭兄混合,默認(rèn)的是第三個。
線程的優(yōu)先級為1到99,做瞎值越大優(yōu)先級越高。
你這么問,真心建議你看看《unix環(huán)境高級編程》系統(tǒng)了解下。當(dāng)然,考試什么的就算了。
linux進程、線程及調(diào)度算法(三)
調(diào)度策略值得是大家都在ready時,并且CPU已經(jīng)被調(diào)度時,決定誰來運行,誰來被調(diào)度。
兩者之間有一定矛盾。
響應(yīng)的優(yōu)化,意味著高優(yōu)先級會搶占優(yōu)先級,會花時間在上下文切換,會影響吞吐。
上下文切換的時間是很短的,幾微妙就能搞定。上下文切換本身對吞吐并多大影響,
重要的是,切換后引起的cpu 的 cache miss.
每次切換APP, 數(shù)據(jù)都要重新load一次。
Linux 會盡可能的在響應(yīng)與吞吐之間尋找平衡。比如在編譯linux的時候,會讓你選擇 kernal features -> Preemption model.
搶占模型會影響linux的調(diào)度算法。
所以 ARM 的架構(gòu)都是big+LITTLE, 一個很猛CPU+ 多個 性能較差的 CPU, 那么可以把I/O型任務(wù)的調(diào)度指源 放在 LITTLE CPU上。需要計算的放在big上。
早期2.6 內(nèi)核將優(yōu)先級劃分了bit的優(yōu)先級。數(shù)值越低,優(yōu)先級越高。0-99優(yōu)先級 都是 RT(即時響應(yīng))的 ,都是非RT的,即normal。
調(diào)度的時候 看哪個bitmap 中的 優(yōu)先級上有任務(wù)ready。可能多個任務(wù)哦。
在普通優(yōu)先級線程調(diào)度中,高優(yōu)先級并不代表對低優(yōu)先級的絕對優(yōu)勢。會在不同優(yōu)先級進行輪轉(zhuǎn)。
就是比101高,101也會比102高,但100 不會堵著101。
眾絲進程在輪轉(zhuǎn)時,優(yōu)先級高的:
初始唯并態(tài)設(shè)置nice值為0,linux 會探測 你是喜歡睡眠,還是干活。越喜歡睡,linux 越獎勵你,優(yōu)先級上升(nice值減少)。越喜歡干活,優(yōu)先級下降(nice值增加)。所以一個進程在linux中,干著干著 優(yōu)先級越低,睡著睡著 優(yōu)先級越高。
后期linux補丁中
紅黑樹,數(shù)據(jù)結(jié)構(gòu), 左邊節(jié)點小于右邊節(jié)點
同時兼顧了 CPU/IO 和 nice。
數(shù)值代表著 進程運行到目前為止的virtual runtime 時間。
(pyhsical runtime) / weight * 1024(系數(shù))。
優(yōu)先調(diào)度 節(jié)點值(vruntime)最小的線程。權(quán)重weight 其實有nice 來控制。
一個線程一旦被調(diào)度到,則物理運行時間增加,vruntime增加,往左邊走。
weight的增加,也導(dǎo)致vruntime減小,往右邊走。
總之 CFS讓線程 從左滾到右,從右滾到左。即照顧了I/O(喜歡睡,分子小) 也 照顧了 nice值低(分母高).所以 由喜歡睡,nice值又低的線程,最容易被調(diào)度到。
自動調(diào)整,無需向nice一樣做出獎勵懲罰動作,個人理解權(quán)重其實相當(dāng)于nice
但是 此時 來蔽拍一個 0-99的線程,進行RT調(diào)度,都可以瞬間秒殺你!因為人家不是普通的,是RT的!
一個多線程的進程中,每個線程的調(diào)度的策略 如 fifo rr normal, 都可以不同。每一個的優(yōu)先級都可以不一樣。
實驗舉例, 創(chuàng)建2個線程,同時開2個:
運行2次,創(chuàng)建兩個進程
sudo renice -n -5(nice -5級別) -g(global), 會明顯看到 一個進程的CPU占用率是另一個的 3倍。
為什么cpu都已經(jīng)達到200%,為什么系統(tǒng)不覺得卡呢?因為,我們的線程在未設(shè)置優(yōu)先級時,是normal調(diào)度模式,且是
CPU消耗型
調(diào)度級別其實不高。
利用chrt工具,可以將進程 調(diào)整為 50 從normal的調(diào)度策略 升為RT (fifo)級別的調(diào)度策略,會出現(xiàn):
chrt , nice renice 的調(diào)度策略 都是以線程為單位的,以上 設(shè)置的將進程下的所有線程進行設(shè)置nice值
線程是調(diào)度單位,進程不是,進程是資源封裝單位!
兩個同樣死循環(huán)的normal優(yōu)先級線程,其中一個nice值降低,該線程的CPU 利用率就會比另一個CPU的利用率高。
關(guān)于linux創(chuàng)建線程優(yōu)先級的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
創(chuàng)新互聯(lián)成都網(wǎng)站建設(shè)公司提供專業(yè)的建站服務(wù),為您量身定制,歡迎來電(028-86922220)為您打造專屬于企業(yè)本身的網(wǎng)絡(luò)品牌形象。
成都創(chuàng)新互聯(lián)品牌官網(wǎng)提供專業(yè)的網(wǎng)站建設(shè)、設(shè)計、制作等服務(wù),是一家以網(wǎng)站建設(shè)為主要業(yè)務(wù)的公司,在網(wǎng)站建設(shè)、設(shè)計和制作領(lǐng)域具有豐富的經(jīng)驗。
當(dāng)前題目:Linux中創(chuàng)建線程的優(yōu)先級設(shè)置(linux創(chuàng)建線程優(yōu)先級)
標(biāo)題網(wǎng)址:http://m.fisionsoft.com.cn/article/ccoiihc.html


咨詢
建站咨詢
