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

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


咨詢(xún)
建站咨詢(xún)
