linux核心程式設計-可睡眠鎖之srcu
define_srcu
define_srcu_static
static修飾的定義只能在該c檔案中使用,用於保護命名空間。
如果乙個函式裡面使用了static,這是相當與乙個全域性變數,但是他的有效範圍只能在該函式內,其他地方不能使用。 /*
* define and init a srcu struct at build time.
* dont't call init_srcu_struct() nor cleanup_srcu_struct() on it.
*/#define define_srcu(name)\
static define_per_cpu(struct srcu_struct_array, name##_srcu_array);\
struct srcu_struct name = __srcu_struct_init(name);
#define define_static_srcu(name)\
static define_per_cpu(struct srcu_struct_array, name##_srcu_array);\
static struct srcu_struct name = __srcu_struct_init(name);
sudo echo >/var/log/messages
srcu中實驗一下是否可以睡眠
老師證明是可行的
但是我的機器上面會出問題,rmmod的時候
記得在rcu的時候,也是會在rmmod的時候出問題。
難道是死鎖?
檢查:a.開啟config_lockdep
死鎖等一些鎖非法情況的檢查,debug功能
b.臨界區的區域性變數
memcpy()如果引發page——fault的時候就會睡眠
表現在訪問使用者空間記憶體的時候
臨時變數 在棧裡頭。 (
應該是區域性變數 我把臨界區里區域性變數的宣告刪除之後就不再出現死鎖了
所以 我把臨時變數的記憶體memcpy到kmalloc申請的記憶體的時候 發生了睡眠
)
Linux核心無鎖程式設計
多核多執行緒已經成為當下乙個時髦的話題,而無鎖程式設計更是這個時髦話題中的熱點話題。linux核心可能是當今最大最複雜的並行程式之一,為我們分析多核多執行緒提供了絕佳的範例。核心設計者已經將最新的無鎖程式設計技術帶進了2。6系統核心中,本文以2。6。10版本為藍本,帶領您領略多核多執行緒程式設計的真...
Linux核心之RCU鎖
rcu全程read only update rcu機制 rcu記錄了所有指向共享資料的指標的使用者,當要修改共享資料的時候,首先建立乙個副本,在副本中修改。所有讀執行緒都離開讀臨界區之後,指標指向新的修改後副本的指標,並且刪除舊資料。include include include include i...
Linux 網路協議棧之核心鎖(二) 核心搶占
一 核心搶占 早期的linux核心是不可搶占的。它的排程方法是 乙個程序可以通過schedule 函式自願地啟動一次排程。非自願的強制性排程只能發生在每次從系統呼叫返回的前夕以及每次從中斷或異常處理返回到使用者空間的前夕。但是,如果在系統空間發生中斷或異常是不會引起排程的。這種方式使核心實現得以簡化...