核心同步 (來自chinaunix總結)

2021-06-10 00:59:22 字數 2095 閱讀 7522

核心同步

搶占式核心特有的切換:

優缺點:

禁用、使能、檢查使能

搶占發生時機:

搶占使能後,呼叫preempt_schedule函式:

為了使可延函不需同步:

指令級的同步

侷限:

動態:alloc_precpu (type), free_percpu (pointer) per_cpu_ptr(pointer, cpu-id)

操作碼有「lock」位元組: 執行時鎖住記憶體匯流排,其他cpu不能訪問;適用於多cpu系統。

缺點:它不能保證cpu不會亂序執行。

記憶體屏障 - cpu流水,亂序執行相關。前面的指令執行完畢後,再執行後面的指令。

c**中的巨集:

僅多cpu用的:加smp_字首.

稍複雜的同步

資料結構:spinlock_t

如果需要排程,開啟搶占,排程一下。

spin_unlock: 簡單給slock置1 (x86的寫操作都是原子的),並使能搶占。

搶占式核心的:spin_lock巨集 (源**:build_lock_ops)

設定break_lock, 使能搶占。

不斷執行pause指令,直到鎖被開啟 或 break_lock變成0(只有cond_resched_lock會把break_lock清0)

返回開始。

非搶占式核心的spin_lock

讀寫自旋鎖 rwlock_t:結構與操作方式與spinlock類似,區別在於:

_raw_read_trylock, _raw_write_trylock 代替 _raw_spin_trylock。

侷限:

資料多分拷貝:rcu (讀,拷貝更新)

介面:

寫資料完成後,調call_rcu(rcu_head). rcu_head一般內嵌在資料

每個tick, 會檢查本地cpu是否進入靜止狀態。如果進入了,本地的rcu_tasklet會呼叫rcu_head內的函式釋放資料。

由於__up需要根據count來判斷,是否有阻塞的程序

還原**:

spin_lock的作用:

讀寫訊號量

結構

wait_list: 等待列隊,每乙個元素都乙個標識, 說明讀者還是寫者。

wait_lock: 互斥鎖

介面 完成

wait_queue_head_t wait; 等待列隊

介面:

系統級的同步

延時函式禁用

如何選取同步方式:高層併發,底層同步,且能少用就少用

公用資料的指令

單一處理器

多處理器附加的機制

異常訊號量(產生同步問題的異常一般時系統呼叫。大多是資源相關,用等待列隊方便。搶占不會產生問題,唯一需要禁止搶占的是訪問per-cpu變數的時候。)無中斷

中斷禁用(只有中斷禁用可以勝任)

自旋鎖可延時函式(softirqs)

無(單一cpu上,可延時函式只能序列執行。)

自旋鎖(同一softirq可以同時在不同cpu上執行)

可延時函式(同乙個tasklet)

無(同上)

無(因為同乙個tasklet不能同時在不同cpu上執行,所以沒有同步問題)

可延時函式(不同tasklet共用)

無(同上)

自旋鎖(不用tasklet同一時間可在不同cpu上執行)

異常+中斷處理

中斷禁止(處理異常時可能來中斷,但中斷處理不可能被異常打斷)

自旋鎖(關注其他cpu上的中斷和異常。快速處理完的中斷,用自旋鎖。系統呼叫的異常,用訊號量好)

異常+可延遲函式

可延遲函式禁止(可延遲函式類似與異常,所以該處類似"異常+中斷處理")

自旋鎖中斷+可延遲函式

中斷禁用(可延遲函式內可能有產生中斷,反之不成立。所以,可延遲函式內禁止中斷即可)

自旋鎖異常+中斷+可延遲函式

中斷禁用(異常處理、可延函都被中斷打斷,反之不成立)

自旋鎖

自己調schedule時,要放棄鎖;但被搶占時,不能放棄鎖

preempt_schedule_irq中:

Linux核心同步

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

核心同步介紹

1.臨界區和競爭條件 所謂臨界區 critical region 就是訪問和操作共享資料的 段。為了避免在臨界區中併發訪問,必須保證這些 是原子地執行,即 在執行結束前不可被打斷,就如同整個臨界區是乙個不可分割的指令一樣。如果兩個執行執行緒有可能處於同乙個臨界區中,稱為競爭條件 race condi...

Linux核心 同步

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