linux學習筆記 核心同步

2021-10-02 12:21:49 字數 1379 閱讀 5777

臨界區就是訪問、操作共享資源的**段。

為什麼需要進行同步?

是因為存在任務的搶占和重新排程,或者多核處理器的併發導致多個程序可以同時進入臨界區修改共享資源。

可能造成併發的原因:

1)中斷;

2)軟中斷和tasklet,核心可以在任何時候環形或者排程軟中斷和tasklet打斷當前正在執行的**;

3)核心搶占;

4)程序進入睡眠狀態;

5)多個處理器同時執行**。

同步過程中常見的幾個bug:

1)核心在臨界區休眠;

2)中斷發生,被中斷程序正處於臨界區,而中斷服務程式正要訪問該臨界區;

3)程序正在臨界區的時候發生搶占;

4)多核併發訪問臨界區。

總結:程序在臨界區的執行過程不能被打斷。

死鎖問題:

我理解的死鎖就是乙個程序嘗試去獲取乙個不可能施放的鎖,進而陷入擁塞狀態。比如自鎖:程序想要獲取自己已經獲取的乙個鎖。互鎖(abba):程序1有鎖a想要獲取鎖b,程序2持有鎖b而想要獲取鎖a。

如何解決死鎖:

1.按順序獲取鎖,並按照相反順序施放鎖;

2.在程序開始就嘗試獲取它所需要的全部鎖,如果沒有辦法獲取那麼久不執行;

3.防止飢餓:如果乙個程序阻塞,就隱性的施放他所持有的所有鎖;

4.鎖的設計應當力求簡單,越是複雜的鎖越是容易出現問題。

常用同步手段

因為比較熟悉了,下面對比的來說三種鎖:

訊號量的結構體:

struct semaphore ;--

----

----

----

----

----

----

----

----

----

----

----

----

----

----

-struct __wait_queue_head

;typedef

struct __wait_queue_head wait_queue_head_t;

轉化一下:

struct semaphore 

;

互斥體:

struct mutex 

;

config_debug_mutexesconfig_debug_lock_alloc為編譯選項,他們置位之後就會對mutex產生很多約束:包括mutex只能為單值;在該執行緒中獲取的mutex必須在mutex中施放;禁止遞迴上鎖;禁止在中斷服務程式中上鎖等。其他的可以發現,訊號量與互斥體的結構基本是一樣的。

Linux核心學習筆記 核心同步

linux核心中執行的程式,時刻都要防止併發引起的競態。這將會導致資料結構被破壞,嚴重的時候會引起核心崩潰。所以核心同步技術對核心開發的驅動程式來說非常重要。不懂核心同步技術的人,是寫不出安全健壯的核心驅動程式來的。在學習核心同步技術之前需要掌握一下幾個概念。1 並行,併發與競態 在smp執行的li...

Linux核心同步

在linux核心裡記憶體可以和硬碟空間通用的,當記憶體利用很少時,資料可以存到記憶體裡,反之硬碟空間可以用來當記憶體用但是有個共同點資料總是現在記憶體裡操作再寫回到硬碟上的。由於這個原因,塊儲存裝置被當成後備儲存器。linux 提供了兩種操作的方法 1 後台程序不停的檢查系統記憶體週期性的寫操作 2...

Linux核心 同步

核心同步方法 2.自旋鎖 3.訊號量 4.互斥體 5.順序和屏障 6.其它 1.從2.0開始,linux開始支援多處理器 2.所謂臨界區就是訪問和操作共享資料的 段 3.我們應該不讓兩個執行執行緒在同乙個臨界區同時執行 4.i 的機器指令步驟 5.核心為我們實現了一些原子操作的介面 6.乙個鎖被高度...