簡體   English   中英

設備驅動程序內存緩沖區處理器高速緩存問題

[英]device driver memory buffer processor cache issue

我有一台使用USB中的兩個不同的批量通道發送圖像數據和視頻幀的設備。

我的工作站處理器高速緩存有點大,足以容納大約100個視頻幀,但沒有圖像數據。

我對圖像和視頻數據使用相同的緩沖區,該緩沖區大約有50個塊,一個塊的大小為1MB。 視頻幀很快出現,然后是圖像幀。

我的問題是,在以下secnario中是否存在內存損壞問題? 知道處理器高速緩存的人可以為我提供幫助。

  • 由於視頻幀較小,因此寫入視頻幀的內存緩沖區中的頁面幾乎在高速緩存中。 由於視頻數據以流的形式出現,因此它永遠不會被沖洗掉。
  • 但是當圖像數據到來時,將使用大面積的存儲緩沖區,然后將刷新視頻存儲頁面。 但是排定要刷新但仍未寫入物理內存。
  • 現在,圖像數據已寫入內存,我在那里使用了volatile
  • 並且在寫入圖像數據后刷新數據時,緩存刷新將破壞該數據。

這會發生嗎? 因此,我也將volatile應用於視頻數據寫入,這個問題似乎消失了。 但是我需要報告,因此上述情況有可能發生嗎?

注釋是贈品:兩個線程和volatile被濫用為線程機制。

兩個線程可以在兩個CPU內核上運行。 盡管內核通常共享內存,但它們通常不共享L1緩存。 中間緩存有所不同。 結果,在兩個CPU內核上取消引用相同的指針可能會得出不同的結果。 對於在線程之間正確共享的變量來說,這不是問題。 編譯器將使用正確的指令。 但是該關鍵字已正確共享。

在這里,我們遇到了一個小問題,您已經將問題標記為C和C ++,因為在線程標准化之前,這兩種語言都以這兩種語言進行了標准化。 但是,這兩種線程機制故意相似,因此編譯器對可以(作為擴展)定義C線程和C ++線程如何交互。 您需要為此查閱文檔。

libusb線程包裝在您自己的代碼中可能會更容易,這樣您就可以在沒有線程問題的情況下接收數據,然后將代碼從代碼分派到同樣受您控制的其他線程。

回到您看到的內存損壞:您可能看到的是,一個線程正在寫出其內存視圖,事實證明這是其緩存中的陳舊數據。 如果您使用了互斥鎖之類的東西,那么這些過時的數據將被記錄下來並緩存同步。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM