【轉】spin_lock、spin_lock_irq、spin_lock_irqsave區別

為什么80%的碼農都做不了架構師?>>> ??hot3.png

轉自:http://blog.csdn.net/luckywang1103/article/details/42083613

void spin_lock(spinlock_t *lock);void spin_lock_irq(spinlock_t *lock);void spin_lock_irqsave(spinlock_t *lock, unsigned long flags);

spin_lock與spin_lock_irq區別

在Linux內核中何時使用spin_lock,何時使用spin_lock_irqsave很容易混淆。首先看一下代碼是如何實現的。

spin_lock的調用關系

spin_lock |+ ----->  raw_spin_lock |+------>  _raw_spin_lock|+--------> __raw_spin_lock
static inline void __raw_spin_lock(raw_spinlock_t *lock)  
{  preempt_disable();  spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);  LOCK_CONTENDED(lock, do_raw_spin_trylock, do_raw_spin_lock);  
}  

spin_lock_irq的調用關系

    spin_lock_irq|+-------> raw_spin_lock_irq|+---------> _raw_spin_lock_irq|+------------> __raw_spin_lock_irq
static inline void __raw_spin_lock_irq(raw_spinlock_t *lock)  
{  local_irq_disable();  preempt_disable();  spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);  LOCK_CONTENDED(lock, do_raw_spin_trylock, do_raw_spin_lock);  
}  

可以看出來他們兩者只有一個差別:是否調用local_irq_disable()函數, 即是否禁止本地中斷。

在任何情況下使用spin_lock_irq都是安全的。因為它既禁止本地中斷,又禁止內核搶占。

spin_lock比spin_lock_irq速度快,但是它并不是任何情況下都是安全的。

舉個例子:進程A中調用了spin_lock(&lock)然后進入臨界區,此時來了一個中斷(interrupt),

該中斷也運行在和進程A相同的CPU上,并且在該中斷處理程序中恰巧也會spin_lock(&lock)

試圖獲取同一個鎖。由于是在同一個CPU上被中斷,進程A會被設置為TASK_INTERRUPT狀態,

中斷處理程序無法獲得鎖,會不停的忙等,由于進程A被設置為中斷狀態,schedule()進程調度就

無法再調度進程A運行,這樣就導致了死鎖!

但是如果該中斷處理程序運行在不同的CPU上就不會觸發死鎖。 因為在不同的CPU上出現中斷不會導致

進程A的狀態被設為TASK_INTERRUPT,只是換出。當中斷處理程序忙等被換出后,進程A還是有機會

獲得CPU,執行并退出臨界區。

所以在使用spin_lock時要明確知道該鎖不會在中斷處理程序中使用。

spin_lock_irq與spin_lock_irqsave區別

spin_lock_irqsave在進入臨界區前,保存當前中斷寄存器flag狀態,關中斷,進入臨界區,在退出臨界區時,把保存的中斷狀態寫回到中斷寄存器。

spin_lock_irq在進入臨界區前不保存中斷狀態,關中斷,進入臨界區,在退出臨界區時,開中斷。

spin_lock_irqsave鎖返回時,中斷狀態不會被改變,調用spin_lock_irqsave前是開中斷返回就開中斷。

spin_lock_irq鎖返回時,永遠都是開中斷,即使spin_lock_irq前是關中斷

轉載于:https://my.oschina.net/chuqq/blog/1574545

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/392778.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/392778.shtml
英文地址,請注明出處:http://en.pswp.cn/news/392778.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

七年級計算機上教學計劃,初一教學計劃模板錦集5篇

初一教學計劃模板錦集5篇時光在流逝,從不停歇,我們又將迎來新的教學工作,我們要好好計劃今后的教育教學方法。那么一份同事都拍手稱贊的教學計劃是什么樣的呢?以下是小編為大家整理的初一教學計劃5篇,僅供參考&#xf…

程序員實際情況_程序員實際上是做什么的?

程序員實際情況What do programmers actually do? What can they be working on?程序員實際上是做什么的? 他們可以做什么? In this video from an Airbnb software engineer, you will learn about what programmers do on a day-to-day basis. She …

leetcode 1365. 有多少小于當前數字的數字(排序)

給你一個數組 nums&#xff0c;對于其中每個元素 nums[i]&#xff0c;請你統計數組中比它小的所有數字的數目。 換而言之&#xff0c;對于每個 nums[i] 你必須計算出有效的 j 的數量&#xff0c;其中 j 滿足 j ! i 且 nums[j] < nums[i] 。 以數組形式返回答案。 示例 1&…

spring整合springmvc案例

面試遇到過上機操作&#xff0c;不知道小伙伴們遇到過沒。 案例。 1、新建web項目&#xff0c;找到相關的jar包。 轉載于:https://www.cnblogs.com/sjzxs/p/11158116.html

我的世界服務器玩家在線時間,將公布上線時間?我的世界中國版網易520前瞻

【17173專稿&#xff0c;轉載請注明出處】《我的世界》中國版最近一段時間動作不斷。網易CEO丁磊在財報電話會議上公布了《我的世界》手游版會在7月份推出&#xff0c;結合《我的世界》中國版的公告提及&#xff1a;”《我的世界》中國版即將在暑期上線“。如此看來手游版和PC版…

ftpwebrequest 無法加載或初始化請求的服務提供程序_jvm之類加載機制

什么是類加載每個編寫的".java"拓展名類文件都存儲著需要執行的程序邏輯&#xff0c;這些".java"文件經過Java編譯器編譯成拓展名為".class"的文件&#xff0c;".class"文件中保存著Java代碼經轉換后的虛擬機指令&#xff0c;當需要使…

【284天】我愛刷題系列(43)

叨叨兩句 身體是靈魂的載體&#xff0c;靈魂是身體的指引&#xff0c;用心維護、馴化你的身體&#xff0c;構建通道&#xff0c;指引它將力量與情緒宣泄在你想做出成績的領域&#xff0c;神奇的事情就會發生&#xff0c;哈哈。牛客網——java專項練習023 1 SuppressWarnings(“…

基于python滲透測試_Python中基于屬性的測試簡介

基于python滲透測試by Shashi Kumar Raja由Shashi Kumar Raja Python中基于屬性的測試簡介 (Intro to property-based testing in Python) In this article we will learn a unique and effective approach to testing called property-based testing. We will use Python , p…

leetcode144. 二叉樹的前序遍歷(迭代)

給定一個二叉樹&#xff0c;返回它的 前序 遍歷。示例:輸入: [1,null,2,3] 1\2/3 輸出: [1,2,3]代碼 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val…

矩陣的理解經典博客

矩陣理解一&#xff1a;https://blog.csdn.net/myan/article/details/647511 矩陣理解二&#xff1a;https://blog.csdn.net/myan/article/details/649018 矩陣理解三&#xff1a;https://blog.csdn.net/myan/article/details/1865397 關鍵結論&#xff1a; 1. 首先有空間&…

推斷圖片格式

Linux/Unix下系統推斷文件類型并不根據文件名稱&#xff0c;也即不會根據文件后綴來推斷文件的類型。從網上下載了一個圖片&#xff0c;沒有后綴&#xff0c;希望可以正確推斷出格式。以便于共享到其它平臺&#xff0c;該怎么辦呢&#xff1f; 不同文件類型的文件頭部信息不同&…

云服務器怎么設置域名,云服務器域名設置在哪里

可能不同的云服務廠商域名設置的方式略有不同&#xff0c;不過&#xff0c;大體來講&#xff0c;方法應該都差不多的。下面我們以1.打開瀏覽器&#xff0c;搜索西部數碼官網并登陸賬號密碼&#xff0c;到會員中心。2.進入管理中心后&#xff0c;在左側的業務管理中找到3.點擊服…

RHCE 學習筆記(9) 網絡管理

n這一節本來按照教學大綱應該是學習SSH&#xff0c;不過SSH有很多網絡相關的知識&#xff0c;因此老師把網絡內容提前了一些。網絡的基本知識例如IP&#xff0c;DNS&#xff0c;DHCP&#xff0c;路由協議等常識就不在此解釋了。 RHEL查看網卡的相關信息很容易&#xff0c;ifcon…

leetcode 1207. 獨一無二的出現次數(map+set)

給你一個整數數組 arr&#xff0c;請你幫忙統計數組中每個數的出現次數。 如果每個數的出現次數都是獨一無二的&#xff0c;就返回 true&#xff1b;否則返回 false。 示例 1&#xff1a; 輸入&#xff1a;arr [1,2,2,1,1,3] 輸出&#xff1a;true 解釋&#xff1a;在該數組…

地圖上繪制任意角度的橢圓_地圖上的總橢圓

地圖上繪制任意角度的橢圓或者&#xff0c;如何選擇下班后去海灘的最佳方式 (Or, how to choose the best way to walk to the beach after work) It was a cool autumn evening when Hila Kloper and I were thinking of going to the beach after work. The beach is about 2…

【NOI2014】起床困難綜合癥 貪心

從高到低按位貪心&#xff0c;討論一下初始0或1&#xff0c;分別暴力算出結果是什么 如果一開始0就能得1當然直接ans壘起來 如果1能得1而且當前m夠用&#xff0c;那也壘起來&#xff0c;同時m減掉 否則gg 2min的代碼 1 #include <bits/stdc.h>2 #define miaom(x,y) ((x &…

用原生js封裝get方法

get方法的封裝 首先我們看一下用原生js來發送請求的步驟: 1.創建請求對象 .var xhrnew XMLHttpRequest(); 2.創建open方法確認請求方式和地址 xhr.open(get,url) ps(記住get方法有參數的話在url后面用?符號連接再加上參數如:url?num3,多個參數用&符號連接); 3.監聽事件…

10一個應用阻止關機貼吧_手機該不該每天關機一次?看完才知道這么多年白用了...

晚上習慣關機睡覺的朋友們在哪里&#xff1f;舉起你們的手讓小編看看&#xff01;那么問題來了&#xff0c;你為啥要關機睡覺&#xff1f;是擔心手機“睡眠不足”&#xff0c;還是擔心屏亮會讓你忍不住的熬夜&#xff1f;然而&#xff0c;有朋友認為手機應該每天關機一次&#…

老王學linux-ftp

FTP&#xff1a;File TransferProtocol 21/tcp: 文件共享服務&#xff1a;應用層&#xff0c;ftp NFS:Network File System (RPC: Remote Procedure Call, 遠程過程調用) Samba:CIFS/SMB FTP: tcp, 兩個連接 命令連接&#xff0c;控制連接&#xff1a;21/tcp 數據連接: 主動模式…

leetcode 129. 求根到葉子節點數字之和(先序遍歷)

給定一個二叉樹&#xff0c;它的每個結點都存放一個 0-9 的數字&#xff0c;每條從根到葉子節點的路徑都代表一個數字。例如&#xff0c;從根到葉子節點路徑 1->2->3 代表數字 123。計算從根到葉子節點生成的所有數字之和。說明: 葉子節點是指沒有子節點的節點。示例 1:輸…