1. 程式人生 > >幾句話總結核心中的鎖

幾句話總結核心中的鎖

原子操作(atomic):

        通過在彙編操作碼字首加個lock(0xf0)來給記憶體總線上鎖(其他CPU無法訪問這個記憶體單元),直到這條指令完成。atomic_t型別為volatile int

自旋鎖(spinlock/spinlock_irqsave):

        spinlock:獲取時“忙等”,進入臨界區後禁止搶佔,“忙等”期間可搶佔和中斷。         spinlock_irqsave:獲取時“忙等”,進入臨界區後禁止中斷和搶佔,“忙等”期間可搶佔和中斷。   spinlock_bh:獲取時“忙等”,進入臨界區後禁止軟中斷,“忙等”期間可搶佔和中斷。並且注意,當spin_unlock_bh時,如果有softirq掛起,則會執行do_softirq將這些掛起的softirq執行.
   自旋鎖分為臨界區中關中斷和開中斷兩種型別(臨界區中都會禁止搶佔)。在單核系統上,自旋鎖只起到禁止和開啟核心搶佔的作用。

讀寫自旋鎖(rwlock):

        讀寫鎖中包含讀鎖(讀資料鎖)和寫鎖(寫資料鎖),一個讀寫鎖同時只能有一個寫者或多個讀者,不能同時既有讀者又有寫者。與自旋鎖一樣獲取時會“忙等”,“忙等”期間可搶佔,讀鎖和寫鎖進入臨界區後都禁止核心搶佔。

順序自旋鎖(seqlock):

        讀寫鎖的變種,寫的優先順序高於讀。臨界區中可同時擁有讀者和寫者,導致讀者讀資料前後都要檢查順序計數器的值,如果值為奇數則繼續讀取資料。順序計數器的值只加不減,寫者寫過程中,計數器為奇數,釋放寫鎖後會偶數。讀臨界區不會禁止核心搶佔,寫會禁止核心搶佔。

RCU(讀-拷貝-更新):

        RCU允許多個讀者和多個寫者併發執行,並不使用鎖。RCU只保護被動態分配記憶體並通過指標引用的資料結構。寫者在訪問時首先會拷貝一個副本,然後對副本進行修改,最後使用一個回撥機制在適當的時機把指向原來資料的指標重新指向新的被修改的資料。這個時機就是所有引用該資料的CPU都退出對共享資料的操作。在臨界區中禁止核心搶佔。

訊號量(semaphore):

        臨界區忙時獲取訊號量的程序會被睡眠(掛起到一個等待佇列中,狀態為TASK_UNINTERRUPTIBLE),因此在中斷上下文中不能使用核心訊號量。同時只能有一個路徑進入臨界區的訊號量稱為互斥鎖(mutex)。在臨界區的程序可以睡眠和被排程.

讀寫訊號量:

        與讀寫自旋鎖類似,只是臨界區忙時獲取鎖不是“忙等”而是睡眠(掛起)。

相關推薦

總結核心中的

原子操作(atomic):         通過在彙編操作碼字首加個lock(0xf0)來給記憶體總線上鎖(其他CPU無法訪問這個記憶體單元),直到這條指令完成。atomic_t型別為volatile int。 自旋鎖(spinlock/spinlock_irqsave):      

搞懂URI、URL、URN之間的關系

source span tor strong 命名 ide 資源定位 定義 之間 1、URI,是uniform resource identifier,統一資源標識符,用來唯一的標識一個資源。 2、RL是uniform resource locator,統一資源定位器,它是

Python之禪中的--傳說中的蛇宗總綱

也不能 cit 美的 AC com utc 不能 beats 命名空間 Simple is better than complex. 簡潔勝於復雜。 Now is better than never. Although never is often better than

了解Zookeeper工作原理

思想 觀察者 返回結果 一輪 編號 設置 兩個 規範 創建 1、Zookeeper的角色 領導者(leader),負責進行投票的發起和決議,更新系統狀態。 學習者(learner),包括跟隨者(follower)和觀察者(observer),follower用於接受客戶端請

夠用一輩子的

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

聊聊我們公司的“加班文化”

今天週六,不出意外又加班了,閒來無事,分析一下我們的加班文化,純屬個人見解。 我們的加班有幾個特點: 1、師出無名,政策就是不分情況一律加班,可能個別模組確實緊急,需要加班趕進度,但是也有人手腳麻利,bug都已經清完了,也得一起加班。 2、在第1條的基礎下,我們的加班是長期持續性的“說好三年,過了三年又

讀懂動態規劃:動態規劃與數學歸納法

昨天晚上 今天凌晨在寫動態規劃的練習題 從兩點折騰到四點一連折騰了兩個小時有看了一會參考書還是沒有搞明白。 整什麼無向圖啊路徑啊一點也不新手友好。 但後來慢慢的看了看題目和原始碼,今天下午突然反應過來: 這不就是數學歸納法麼 跟大家分享一下。 首先,我們來回顧一下數學歸納法:

闡述清楚log4j、slf4j、logback、tinylog之間的區別

1.早期,jdk不提供日誌功能,所以程式設計師要想輸出相關資訊,基本上都使用 System.out.println( ); 2.在這個背景下,一位偉大的程式設計師,暫且稱呼為 偉員, 設計了一套系統的日誌功能程式碼,也就是log4j,廣受程式設計師歡迎 3.在這之後,log4j表示jdk可以

身為程式設計師的你是不是經常說這呢?

1.還不行嗎,你用的什麼瀏覽器,版本多少? 2.重啟試試,強刷試試,清快取試試,其它瀏覽器呢! 3.介面掛了吧,抓包了嗎? 4.在我電腦上是好的… 5.見鬼了,昨天還好好的 6.只改了一行程式碼,不會影響其它程式的。 7.剛剛那個bug,我這裡沒出現,不信你看….(其實自

javascript 快速找出字串內指定字元的下標。

今天在和朋友討論如何快速找出字串內指定字元的下標 於是就出現了下面的寫法:  寫法1 var str ="this is javascript" var resault ={index:"",count:0}; while ( true ){ var index =

寫給未來的自己

今後在這裡每天記錄我的讀書筆記,怎樣的筆記才是好筆記了?筆記就是記錄自己學習的過程。好的筆記具備一定的參考價值,不好的記錄也是有意與我今後的學習和思考。 未來少說多做,腳踏實地的走。 下面是我自己寫給未來的十句話 1.求職過程中要自信,要準備好,要麼你做過這個行業,要

STM32中的最後面的意思

/* Uncomment the line below to expanse the “assert_param” macro in the Standard Peripheral Library drivers code */ /* #define USE

給年輕程式設計師的

我收到了不少新手的來信,他們都希望能成長為一名真正的程式設計師。我絕對不是第一個談論這個話題的人,所以,我不知道應該做哪方面的補充。不管怎樣,下面的是一些一直記在我心頭的、有必要讀一下的建議: 找其他開發人員合作開發。我們正處在科技歷史上第一個絕好的時代,你幾乎不用在意在

總結JAVA泛型萬用字元(PECS)

在JAVA的泛型集合中,預設都可以新增null,除此以外,還有以下三條規則。 1. “?”不能新增元素 以“?”宣告的集合,不能往此集合中新增元素,所以它只能作為生產者(亦即它只能被迭代),如下: List<?> names = Lis

概括atl thunk技術

ATL的thunk技術過一段時間不看就忘記他是怎麼實現的,現在概括為幾句話,方便記憶. CreateWindow時,第一個callback是在同一個堆疊裡的,不是非同步的.所以可以得到視窗對應的類的this指標.後續的callback則是非同步的,得不到對應的視窗物件指標.怎麼辦呢,這時就用到thunk技術

Linux進程間通信的種方式總結--linux內剖析(七)

字節流 標準 包含 down pro trac posix共享內存 ++ 實現 進程間通信概述 進程通信的目的 傳輸數據 一個進程須要將它的數據發送給還有一個進程。發送的數據量在一個字節到幾M字節之間 共享數據 多個進程想要操作共享

經驗之談:優化演算法兩精煉總結

之前,我的部落格中寫了幾種經典的優化演算法和機器學習領域的方法: 學習完畢這麼多優化演算法後,我們可以發現它們的思路無外乎兩個: Exploration,群優化,全域性搜尋,避免陷入區域性最優。 Exploitation,區域

linux心中socket的建立過程原始碼分析(總結性質)

http://www.jianshu.com/p/5d82a685b5b6 在漫長地分析完socket的建立原始碼後,發現一片漿糊,所以特此總結,我的部落格中同時有另外一篇詳細的原始碼分析,核心版本為3.9,建議在閱讀本文後若還有興趣再去看另外一篇博文。絕對不要單獨看另外

MySQL 只能做小專案?鬆哥要說公道

鬆哥上學那會,很多人對 MySQL 有一些偏見,偏見主要集中在以下幾方面: MySQL 不支援事務(事實上 MyISAM 有表鎖,但是效率比較低) MySQL 儲存的資料量比較小,適合小專案,大專案還是得上 Oracle、DB2 等 這麼多年過去了,鬆哥自己在開發中一直是以 MySQL 為主,我覺得我有必

C#打開SDE數據庫的種方式總結

tex 用戶 ops 總結 param word editor conn tor 轉自謝燦軟件原文 C#打開SDE數據庫的幾種方式總結 1.通過指定連接屬性參數打開數據庫 /// <param name="server">數據庫服務器名&