日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux内核锁机制学习

發布時間:2025/4/14 linux 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux内核锁机制学习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  在現代操作系統里,同一時間可能有多個內核執行流在執行,因此內核其實象多進程多線程編程一樣也需要一些同步機制來同步各執行單元對共享數據的訪問。尤其是在多處理器系統上,更需要一些同步機制來同步不同處理器上的執行單元對共享的數據的訪問。

  在主流的Linux內核中包含了幾乎所有現代的操作系統具有的同步機制,這些同步機制包括:原子操作、信號量(semaphore)、讀寫信號量(rw_semaphore)、spinlock、BKL(Big Kernel Lock)、rwlock、brlock(只包含在2.4內核中)、RCU(只包含在2.6內核中)和seqlock(只包含在2.6內核中)。

?

原子操作

  原子操作就是指某一個操作在執行過程中不可以被打斷,要么全部執行,要不就一點也不執行。
? ? 原子整數操作只對atomic_t類型的數據進行操作,不能對C語言的int進行操作,

 ? 原子操作API包括:
  原子讀,返回原子類型的變量v的值;
  設置原子類型的變量v的值為i;
? ? ? ?給原子類型的變量v增加值i;
? ? ? ?從原子類型的變量v中減去i;
? ? ? ?從原子類型的變量v中減去i,并判斷結果是否為0;
? ? ? ?對原子類型變量v原子地增加1;
? ? ? ?對原子類型的變量v原子地減1;
? ? ? ?對原子類型的變量v原子地減1,并判斷結果是否為0;
? ? ? ?對原子類型的變量v原子地增加1,并判斷結果是否為0;
? ? ? ?對原子類型的變量v原子地增加I,并判斷結果是否為負數;
? ? ? ?對原子類型的變量v原子地增加i,并且返回指向v的指針;
? ? ? ?從原子類型的變量v中減去i,并且返回指向v的指針;
? ? ? ?對原子類型的變量v原子地增加1并且返回指向v的指針;
? ? ? ?對原子類型的變量v原子地減1并且返回指向v的指針;


自旋鎖
  Linux自旋鎖保證了任意時刻只能有一個執行線程進入臨界區,其他試圖進入臨界區的線程將一直進行嘗試(即自旋),直到獲得該鎖。
  自旋鎖的本質是對內存區域的一個整數的操作,任何線程進入臨界區之前都必須檢查該整數,可用則進入,都則一直忙循環等待。
? ? Linux自旋鎖主要應用與多核處理器中,單CPU中不會進行自旋鎖操作。
? ? 何時使用自旋鎖?不允許睡眠的上下文且臨界區操作較短時使用自旋鎖。

BKL(Big Kernel Lock)
  BKL即全局內核鎖,也稱大內核鎖,它是一個全局自旋鎖。大內核鎖也是用來保護臨界區資源的,避免出現多個處理器上的進程同時訪問同一區域,整個內核中只有一個大內核鎖。
  BKL是一個名為kernel_flag的自旋鎖,持有該鎖的進程仍可以睡眠,當睡眠時持有的鎖將被自動釋放,該進程被喚醒時重新持有該鎖。Linux允許一個進程可以遞歸的持有BKL,BKL是一個遞歸鎖。
? ? 自旋鎖加鎖的對象一般是一個全局變量,大內核鎖加鎖的對象是一段代碼,里面可能包含多個全局變量。

mutex(互斥鎖)
  定義在:/linux/include/linux/mutex.h

  struct mutex {
? ? ? ? atomic_t count;
? ? ? ? spinlock_t wait_lock;
? ? ? ? struct list_head wait_list;
? ? ? ? #ifdef CONFIG_DEBUG_MUTEXES
? ? ? ? struct thread_info *owner;
? ? ? ? const char *name;
? ? ? ? void *magic;
? ? ? ? #endif
? ? ? ? #ifdef CONFIG_DEBUG_LOCK_ALLOC
? ? ? ? struct lockdep_map dep_map;
? ? ? ? #endif
? ? };

? ? 互斥鎖主要用于實現內核中的互斥訪問功能。內核互斥鎖是在原子API之上實現的,但這對于內核用戶是不可見的。
? ? 互斥鎖不能進行遞歸鎖定或解鎖。一個互斥鎖對象必須通過其API初始化,而不能使用memset或復制初始化。一個任務在持有互斥鎖的時候是不能結束的。
? ? atomic_t count:指示互斥鎖的狀態:1沒有上鎖,可以獲得;0被鎖定,不能獲得;負數被鎖定,且可能在該鎖上有等待進程初始化為沒有上鎖。
? ? spinlock_t wait_lock:等待獲取互斥鎖中使用的自旋鎖;在獲取互斥鎖的過程中,操作會在自旋鎖的保護中進行;初始化為為鎖定;
? ? struct list_head wait_list:等待互斥鎖的進程隊列。

順序鎖
  順序鎖為寫者賦予更高的優先級,寫者永遠不會等待讀者。
  順序鎖的數據結構中除了有spinlock外,還有一個順序號。

總結

以上是生活随笔為你收集整理的linux内核锁机制学习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。