第九章 內核同步介紹

1. 隨着2.6版內核的出現,Linux內核已經發展成搶佔式內核,如果不加保護,調度程序可以在任何時刻搶佔正在運行的內核代碼,重新調度其他的進程執行

2. 臨界區或者臨界段:訪問和操作共享數據的代碼段

3. 如果兩個執行線程(指代的是任何正在執行的代碼,如一個在內核執行進程、一個中斷處理程序或者內核線程)處於同一個臨界區中同時執行,就成它是競爭條件(race conditions)

4. 避免併發和防止競爭條件稱爲同步(synchronization)。

5. 忙等待:反覆處於一個循環中,不斷檢測狀態,等待鎖變爲可用

6. 鎖是採用原子操作實現的,而原子操作不存在競爭。

7. 用戶空間併發

  • 用戶程序會被調度程序搶佔和重新調度,是僞併發
  • 信號處理的異步發生,是僞併發
  • 對稱多處理器的機器會導致多個進程真正地在臨界區中同時執行,是真併發

8. 內核空間的併發

  • 中斷——中斷幾乎可以在任何時刻異步發生,也就可能隨時打斷當前正在執行的代碼
  • 軟中斷和tasklet——內核能在任何時刻喚醒或調度軟中斷和tasklet,打斷當前正在執行的代碼
  • 內核搶佔——因爲內核具有搶佔性,故內核中的任務可能會被另一個任務搶佔
  • 睡眠及與用戶空間的同步——在內核執行的進程可能會睡眠,這就會喚醒調度程序,從而導致調度一個新的用戶程序執行
  • 對稱多處理——兩個或多個處理器可以同時執行代碼。兩個處理器絕對不能同時訪問同一共享數據

9. 在編寫代碼的開始階段就要設計恰當的鎖,而不是事後纔想到

10. 中斷安全代碼(interrupt-safe):在中斷處理程序中能避免併發訪問的安全代碼

11. SMP安全代碼(SMP-safe):在對稱多處理的機器中能避免併發訪問的安全代碼

12. 搶佔安全代碼(preempt-safe):在內核搶佔時能避免併發訪問的安全代碼

13. 加鎖保護的對象:要給數據而不是給代碼加鎖

14. 在編寫內核代碼時要考慮如下幾個問題:

  • 這個數據是不是全局的?除了當前線程外,其他線程能不能訪問它?
  • 這個數據會不會在進程上下文和中斷上下文中共享?它是不是要在兩個不同的中斷處理程序中共享?
  • 進程在訪問數據時可不可能被搶佔?被調度的新進程會不會訪問同一數據?
  • 當前進程會不會睡眠在某些資源上,如果是,它會讓共享數據處於何種狀態?
  • 怎樣防止數據失控?
  • 如果這個函數又在另一個處理器上被調度將會發生什麼呢?
  • 如何確保代碼遠離併發威脅呢?

15. 死鎖

  • 有一個或多個執行線程和一個或多個資源(如某個鎖),每個線程都在等待其中的一個資源,但所有的資源都已經被佔用了。所有線程都在相互等待,但它們永遠不會釋放已經佔有的資源。於是任何線程都無法繼續,死鎖便發生了。
  • 防止死鎖:
    • 按順序加鎖——使用嵌套的鎖時必須保證以相同的順序獲取鎖,可以阻止擁抱類型的死鎖。最好能記錄下鎖的順序,以便其他人也能按照次順序使用。在釋放鎖的時候,最好以獲取鎖的相反順序進行。
    • 防止發生飢餓。如設置等待超時,或者try lock
    • 不要重複請求同一個鎖
    • 設計力求簡單——越複雜的加鎖方案越能造成死鎖

16. 加鎖粒度:描述加鎖保護的數據規模

  • 當鎖正在被佔用時,有其他線程試圖獲得該鎖,這個被稱爲鎖的爭用。
  • 當鎖爭用嚴重時,加鎖太粗會降低可擴展性;而鎖爭用不明顯時,加鎖過細會加大系統開銷,帶來浪費。這兩種情況都會降低系統系能。

来自为知笔记(Wiz)

时间: 2024-08-29 06:02:40

第九章 內核同步介紹的相关文章

第一章 Linux內核簡介

1. Linux是類Unix系統,但他不是Unix. 儘管Linux借鑑了Unix的許多設計並且實現了Unix的API(由Posix標準和其他Single Unix Specification定義的),但Linux沒有像其他Unix變種那樣直接使用Unix的源代碼. 2. Linux系統的基礎是內核.C庫.工具集和系統的基本工具,如登錄程序和Shell. 3. 操作系統是指在整個系統中負責完成最基本功能和系統管理的那些部分.這些部分應該包括內核.設備驅動程序.啓動引導程序.命令行Shell或者其

第十章 內核同步的方法

原子操作 1. 原子操作可以保證指令以原子的方式執行--執行過程不被打斷. 2. 兩個原子操作絕對不可能併發地訪問同一個變量.大多數體繫結構會提供支持原子操作的簡單算數指令,即使沒有,也會爲單步執行提供鎖內存總線的指令,確保其他改變內存的操作不會同時發生. 3. 原子操作分爲兩種,一種是針對整數的,另一種是針對單獨的位. 4. 針對單獨位的操作,提供了一套原子操作和一套非原子操作,非原子操作函數的特點函數名字前綴多了兩個下劃線.比如test_bit()對應的非原子形式是__test_bit().

第九章:内核同步介绍

程序员需要留意保护共享资源,防止共享资源禀赋访问,如果多个执行线程同时访问和操作数据,有可能发生各现场之间相互覆盖共享数据的情况,造成被访问数据处于不一致的状态. Linux内核是抢占式内核,意味着调度程序可以在任何时刻抢占正在运行的内核代码,重新调度其他的进程执行. 9.1 临界区竞争条件 所谓临界区就是访问和操作共享数据的代码段. 由于多线程操作共享资源的不安全,为避免在临界区中并发访问,编程者必须保证这些代码时原子性的,就是说操作在结束前不可被打断. 所谓竞争条件:如果两个线程有可能处于同

第二章 從內核出發

1. 內核源碼樹的根目錄描述 目錄 描述 arch 特定體繫結構的代碼 block 塊設備IO層 crypto 加密API Documentation 內核源碼文檔 drivers 設備驅動程序 firmware 使用某些驅動程序而需要的設備固件 fs VFS和各種文件系統 include 內核頭文件 init 內核引導和初始化 ipc 進程間通訊代碼 kernel 像調度程序這樣的核心子系統 lib 通用內核函數 mm 內存管理子系統和VM net 網絡子系統 samples 示例,示範代碼

操作系统思考 第九章 线程

第九章 线程 作者:Allen B. Downey 原文:Chapter 9 Threads 译者:飞龙 协议:CC BY-NC-SA 4.0 当我在2.3节提到线程的时候,我说过线程就是一种进程.现在我会更仔细地解释它. 当你创建进程时,操作系统会创建一块新的地址空间,它包含text段.static段.和堆区.它也会创建新的"执行线程",这包括程序计数器和其它硬件状态,以及运行时栈. 我们目前为止看到的进程都是"单线程"的,也就是说每个地址空间中只运行一个执行线程

PCB成型製程介紹

PCB成型製程在電子構裝中所扮演的角色 下圖是電腦主機的內部組成 我們將以插在主機板上的一片 USB擴充卡來說明PCB成型製 程在電子構裝中所扮演的角色 PCB成型製程的子製程 USB擴充卡要插入主機板上的插槽進行電子訊號的聯結.為了降低板子 插入時的阻力,會在板子的邊緣做出一斜面(如圖所示),要做出這個斜邊, 就要靠斜邊製程. 斜邊製程 要在板邊做出斜邊,主要是以端銑刀對板子邊緣進行旋轉切削. 斜邊製程品質異常範例 斜邊深度大時,會使用二支Spindle作兩段式作業,但二支Spindle的角度

Linux Kernel 排程機制介紹

http://loda.hala01.com/2011/12/linux-kernel-%E6%8E%92%E7%A8%8B%E6%A9%9F%E5%88%B6%E4%BB%8B%E7%B4%B9/ Linux Kernel 排程機制介紹 Linux Kernel 排程機制介紹 [email protected] by loda. 2011/12/2 多核心架構儼然是目前智慧型手機方案的新趨勢,隨著省電與效能上的考量,多核心的架構各家方案也都有所差異.為能讓同一個Linux Kernel在不同效

第九章 C语言在嵌入式中的应用

上章回顾 编码的规范和程序版式 版权管理和申明 头文件结构和作用 程序命名 程序注释和代码布局规范 assert断言函数的应用 与0或NULL值的比较 内存的分配和释放细节,避免内存泄露 常量特性 [email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git 第九章 第九章 C语言在嵌入式中的应用 C语言在嵌入式中的应用 [email protecte

用Razor語法寫範本-RazorEngine組件介紹【转——非常好,可以用它来代替NVelocity】

RazorEngine 官網網址:http://razorengine.codeplex.com 在找到RazorEngine之前曾經想過其他的方案,如T4與V8 Engine載jquery.template,但T4如果要獨立於MSBuild或Visual Studio執行有點麻煩,而V8 Engine我又不想在Class Library專案中放一堆js檔,後來就想到Razor,因為Razor的相關處理都是寫在System.Web.Razor,雖然Namespace叫System.Web,但根本