2016-08-08 42 views
1

對不起,如果這是非常基本的。這是我正在做的簡化版本。我正在編寫一個內核模塊。當它運行時,會有兩個線程,一個兩個不同的物理CPU。我正在使用全局變量在這些線程之間進行某些通信。奇怪的是,有時一個線程的寫入不會被另一個線程看到。可能是什麼原因?爲什麼一個CPU寫入的值不被另一個CPU寫入?

我懷疑它有記憶障礙,也許緩存同步做的,所以我一直在使用smp_wmb()寫操作後嘗試過,但似乎並沒有幫助。據我所知,我不能明確地控制緩存同步。所以我有點卡住了。

任何想法?

編輯:說清楚的描述是一個簡化版本。

+0

可能是很多事情。由於內核模塊讓我假設C,你是否聲明變量volatile? –

+0

@GabeSechan是的,我試過了。 – TFC

+0

遵循其他內核代碼使用的模式。另外,除非你做了非常不尋常的事情,否則寫入內存屏障應該在寫入之前。這個價值是什麼意思? –

回答

-1

我想你是因爲編譯器優化而面臨的問題。

您是否嘗試過使用volatile?我認爲volatile將適用於你的情況。

volatile關鍵字適用於需要使用並行不同步的操作是在一個可變來自多於一個源(處理)來執行。如果該變量被聲明爲volatile,那麼所有進程將始終直接從其存儲器位置訪問該變量,而不是將該變量複製到微處理器的高速緩存中並從那裏訪問該變量。

+0

volatile限定符通常不會影響變量的值是在緩存中還是在內存中。它通常隻影響變量的值是否暫時保存在寄存器中。 –

0

首先,你做錯了。 CPU之間的適當同步非常複雜,並且非常適合架構特定的問題。您應該使用一些現有的內核機制進行線程同步。除非您有一些特定的性能需求,否則只需使用自旋鎖。然後,如果需要,您可以詳細瞭解不同的同步機制,並找到最適合您工作負載的機制。

更直接地回答你的問題 - 還有你可能會面臨這裏至少有兩個問題:通過這通常是由編譯器的障礙照顧編譯 1.指令重新排序(即barrier())。 2. CPU執行的亂序執行和緩存一致性,通常由內存屏障處理。

細節架構和用例具體的,但你沒有提供任何代碼或架構的細節,我們可以分析一下。所以您可能需要使用至少barrier(),smp_wmb(),smp_rmb()smp_read_barrier_depends()中的任意一個和全部。

相關問題