亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標題: 如何提高線程切換和通信速度? [打印本頁]

作者: zhutroy    時間: 2011-04-20 23:24
標題: 如何提高線程切換和通信速度?
本帖最后由 zhutroy 于 2011-04-20 23:26 編輯

有兩個線程,
一個是producer,有一段任務代碼, 現(xiàn)在交給consumer執(zhí)行。
一個是consumer,收到消息后執(zhí)行代碼。

consumer使用 SCHED_RR, 優(yōu)先級是1, 兩個線程使用pthread_cond_wait 和pthread_signal
做通信, 感覺速度比較慢,

如果producer自己執(zhí)行consumer中的程序, 會快很多。

consumer的程序如下類似:

//consumer is a higher priority waiting thread.
consumer{       
        while(1)  //可以這樣做嗎?
        {
               
                pthread_mutex_lock(&mutex);
                if(empty)
                        pthread_cond_wait(&cond_full, &mutex);
                //execute some code
                pthread_cond_signal(&cond_empty);               
                pthread_mutex_unlock(&mutex);
        }       
}

//producer is call by high level application.
producer
{
        pthread_mutex_lock(&mutex);
        if(full)
                pthread_cond_wait(&cond_empty, &mutex);
        //execute some code
        pthread_cond_signal(&cond_full);
        pthread_mutex_unlock(&mutex);
}
作者: nketc    時間: 2011-04-21 08:25
感覺你這兩個條件變量可以去掉一個。
作者: zesu    時間: 2011-04-21 09:58
去掉也快不了多少吧。。。
我覺得這樣用注定要慢的,即使是SCHED_RR。
作者: l2y3n2    時間: 2011-04-21 10:14
你幾個CPU的?

單CPU當然速度要慢,比起直接執(zhí)行還多了信號同步這一步。
作者: zhutroy    時間: 2011-04-21 10:15
我不希望要執(zhí)行的一部分程序被普通任務打斷

可以由高優(yōu)先級任務代勞實現(xiàn), 效率有點低, 有沒有別的方式哪?
作者: cskyrain    時間: 2011-04-21 11:27
感覺速度比較慢,

如何確定慢的呢,直觀感覺嗎?不會慢到這種程度吧。
作者: beyonder2015    時間: 2011-04-21 11:39
感覺速度比較慢,

如何確定慢的呢,直觀感覺嗎?不會慢到這種程度吧。
cskyrain 發(fā)表于 2011-04-21 11:27


同問?
怎么個慢法?
作者: GFree_Wind    時間: 2011-04-21 12:28
你感覺慢,那么得找出瓶頸在哪?感覺不會是線程切換的問題。
很可能是你的producer和consumer的處理或許有問題
作者: zhutroy    時間: 2011-04-21 17:17
感謝上面的關(guān)注.
詳細情況是:
幾乎一個數(shù)量級的慢, 以前生產(chǎn)者直接執(zhí)行每秒能直接執(zhí)行500次
現(xiàn)在每秒大約50次操作, 每一次同步通信耗時約20毫秒.

另外: 應用環(huán)境是單核ARM926, kernel是2.6.18。

我認為每次生產(chǎn)者與消費者模型,完成一次生產(chǎn)與消費大約需要20毫秒時間。 而不是1-2毫秒甚至忽略不計。
作者: JohnBull    時間: 2011-04-21 17:59
不要以為用了RR效果就會好,很可能適得其反,因為引入了不必要的上下文切換。
作者: zhutroy    時間: 2011-04-21 18:54
回復 10# JohnBull
There are two threads
thread1 always call ioctl one time every second.
thread2 always call two steps ioctl  one time every second.

thread2 require two step must not be interrupted by thread1's ioctl
The operations as the following is not permitted.
ioctl //thread2
ioctl //thread1 interrupted
ioctl //thread2

I want to use pthread_mutex, semaphore, cond_wait .... but because thread1 is a lib.and it can't not be changed.
So how can I protect two steps ioctl, guarantee it will not be interrupted by thread1?
Thanks very much.


和上面的情況類似。
只有運行在實時線程的上下文才不會被0優(yōu)先級的普通任務打斷。 所以另開一個SCHED_RR, priority=1的線程。
作者: JohnBull    時間: 2011-04-22 17:17
利用優(yōu)先級實現(xiàn)是可以的,但是隨之而來的效率下降也是必然的(因為引入了額外的切換)

非開源軟件的話,沒辦法...

下下策是在內(nèi)核里動手術(shù),把thr2的兩個ioctl合并成一個系統(tǒng)調(diào)用。
作者: caravsapm70    時間: 2014-01-15 11:17
本帖最后由 caravsapm70 于 2014-01-15 11:19 編輯

剛發(fā)現(xiàn),有時候pthread_cond_signal的執(zhí)行時間能到3ms。很要命的……

作者: shan_ghost    時間: 2014-01-15 13:57
線程切換本來就很慢。除非請求資源得不到滿足,否則總得讓人家跑滿一個時間片吧。
作者: shan_ghost    時間: 2014-01-15 15:21
適合使用多線程/多進程的問題是:

1、兩段邏輯可并行執(zhí)行
典型如A從磁盤讀數(shù)據(jù)、B把數(shù)據(jù)通過網(wǎng)卡發(fā)送出去

2、A邏輯不希望出現(xiàn)阻塞,所以用另一個線程B去執(zhí)行可能導致阻塞的部分邏輯
典型如super pi,計算pi值時不希望UI鎖死

3、幾個邏輯互不相關(guān),但需要“同時”執(zhí)行
典型如網(wǎng)絡(luò)服務的業(yè)務邏輯和心跳邏輯


————————————————————————————
典型的生產(chǎn)者-消費者問題,不是生產(chǎn)者產(chǎn)生1個資源,消費者馬上處理1個資源——如果是這樣,寫成順序邏輯效率豈不更高、邏輯豈不更簡單?

實際情況是: 1生產(chǎn)者不停產(chǎn)生資源---2資源加入緩沖區(qū)---3消費者從緩沖區(qū)取得1個資源---4消費者處理資源

其中,1和4是可以并行的;2和3不能并行,必須通過進/線程同步機制做好保護(緩沖區(qū)可看做一個list,生產(chǎn)者在這個list中追加元素,消費者取出生產(chǎn)者追加的元素并進一步處理:兩個處理過程不應該加鎖,因為兩者處理的元素是不同的;但操作list就必須加鎖)。

用偽碼表示,就是:
生產(chǎn)者:
1、產(chǎn)生資源
2、鎖定資源緩沖區(qū)
3、把資源加入緩沖區(qū)
4、解鎖資源緩沖區(qū)
5、跳轉(zhuǎn)第一步

消費者:
1、鎖定資源緩沖區(qū)
2、取得1個資源
3、解鎖資源緩沖區(qū)
4、處理資源
5、跳轉(zhuǎn)第一步


生產(chǎn)者的步驟1和消費者的步驟4并行。

要保證這個邏輯的效率,鎖定資源的時間就一定要短,不必保護的指令絕不要放到臨界區(qū)執(zhí)行。否則,鎖沖突的幾率就太大了,甚至輕易就能抵消硬件并行的優(yōu)勢。
這個原則,也是所有多進/線程算法優(yōu)化的第一要素。


而樓主的程序,很顯然,基本上所有的代碼都在臨界區(qū)——除了循環(huán)跳轉(zhuǎn)對應的loop這一條指令。
這種設(shè)計,不頻繁出現(xiàn)鎖沖突才怪。

另外,看樓主的邏輯,full和empty兩個信號似乎是每次都設(shè)置,并不存在任務隊列/緩沖區(qū)。
而線程切換的前提是:
1、線程時間片到(但由于只有1條指令在保護區(qū)外,所以時間片到也不可能正確切換到另一個線程)
2、資源得不到滿足(在pthread_cond_wait處,pthread_cond_wait會自動為mutex解鎖,條件滿足時再自動加鎖)
3、即便線程切換了,也未必(或者說,肯定)會第一時間切換到你的另一個線程上——好多進/線程都在等著呢。

于是,你的程序在實質(zhì)上,成了“用鎖強制邏輯按A-B-A-B”的順序執(zhí)行——不僅沒得到任何并行方面的好處,反而引入線程切換的開銷。


當然,這些只是從你的簡化代碼看到的東西,可能并不同于你的實際情況。




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2