linux 线程流水线,linux线程同步
我是linux和linux線程的新手.我花了一些時間谷歌搜索試圖理解可用于線程同步的所有函數之間的差異.我還有一些問題.
我找到了所有這些不同類型的同步,每個同步都有許多鎖定,解鎖,測試鎖等功能.
gcc原子操作
futexes的
互斥
自旋鎖
seqlocks
rculocks
條件
信號燈
我當前(但可能有缺陷)的理解是這樣的:
信號量是進程范圍的,涉及文件系統(實際上我假設),并且可能是最慢的.
Futexes可能是互斥鎖,自旋鎖,seqlocks和rculocks使用的基本鎖定機制.Futexes可能比基于它們的鎖定機制更快.
自旋鎖不會阻塞,從而避免上下文波動.然而,它們避免了上下文切換,代價是消耗CPU上的所有循環,直到釋放鎖定(旋轉).出于顯而易見的原因,它們應僅應用于多處理器系統.永遠不要睡在螺旋鎖中.
如果作者更改了工作所基于的數據,seq鎖只會告訴您何時完成工作.在這種情況下,您必須返回并重復工作.
原子操作是最快的同步調用,并且可能在所有上述鎖定機制中使用.您不希望對共享數據中的所有字段使用原子操作.當您訪問多個數據字段時,您希望在鎖定標志上使用鎖(互斥鎖,futex,旋轉,seq,rcu)或單個原子操作.
我的問題是這樣的:
到目前為止我對我的假設是否正確?
有誰知道各種選項的cpu周期成本? 我正在為應用添加并行性,因此我們可以獲得更好的響應時間,但每個盒子運行的應用實例更少.表演是最重要的考慮因素.我不想使用上下文切換,旋轉或許多額外的CPU周期來讀取和寫入共享內存.我絕對關心消耗的cpu周期數.
哪個(如果有的話)鎖可以防止調度程序中斷線程或中斷...或者我只是一個白癡,所有同步機制都會這樣做.什么樣的中斷被阻止?我可以阻止鎖定線程的CPU上的所有線程或線程嗎? 這個問題源于我擔心中斷一個線程,該線程持有一個非常常用的函數.我希望調度程序可能會調度任何可能會遇到此函數的其他工作者,然后因為它被鎖定而阻塞.在帶有鎖的線程被重新安排并完成之前,將浪費大量上下文切換.我可以重新編寫這個函數以最小化鎖定時間,但它通常被稱為我想使用鎖來防止中斷...跨所有處理器.
我正在編寫用戶代碼...所以我得到軟件中斷,而不是硬件中斷......對嗎?我應該遠離任何帶有"irq"字樣的功能(旋轉/ seq鎖).
哪些鎖用于編寫內核或驅動程序代碼,哪些用于用戶模式?
有沒有人認為使用原子操作讓多個線程通過鏈表移動是瘋了? 我想通過原子方式將當前項指針更改為列表中的下一個項.如果嘗試有效,則線程可以安全地使用當前項在移動之前指向的數據.現在,其他線程將沿列表移動.
futexes的?有沒有理由使用它們而不是互斥體?
當沒有工作時,是否有比使用條件睡眠線程更好的方法?
當使用gcc原子操作,特別是test_and_set時,我可以通過先進行非原子測試然后使用test_and_set來確認來提高性能嗎? 我知道這將是特定于案例的,所以情況就是如此.有數以千計的工作項目.每個工作項都有一個初始化為0的標志.當一個線程具有對工作項的獨占訪問權時,該標志將為1.會有很多工作線程.一旦線程正在尋找工作,他們就可以非原子地測試1.如果他們讀取1,我們肯定知道工作不可用.如果他們讀零,他們需要執行原子test_and_set來確認.因此,如果原子test_and_set是500個cpu周期,因為它禁用流水線操作,導致cpu通信和L2緩存刷新/填充....并且一個簡單的測試是1個周期....然后只要我有一個更好的比率當它磕磕絆絆已經完成的工作項目時,500比1 ......這將是一場勝利.
我希望使用互斥鎖或自旋鎖來保護代碼段,我希望一次只能訪問SYSTEM(而不是CPU)上的一個線程.我希望謹慎地使用gcc原子操作來選擇工作并盡量減少互斥鎖和自旋鎖的使用.例如:可以檢查工作項中的標志以查看線程是否已經工作(0 =否,1 =是或正在進行中).一個簡單的test_and_set告訴線程它是否有效或需要繼續.我希望在工作時使用條件喚醒線程.
謝謝!
總結
以上是生活随笔為你收集整理的linux 线程流水线,linux线程同步的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux桌面环境知乎,24 个值得尝试
- 下一篇: 龙芯linux内核移植开发板,基于国产龙