linux下c編程特點 typeof 取變數類型 GNU c對比ANSI c做了很多擴展,例如動態數組 第7章 Linux設備驅動中的併發控制 造成竟態的原因 多核 進程和中斷形成的多路徑(linux2.6以後,禁止了中斷嵌套) 編譯亂序 執行亂序 解決竟態的辦法 中斷屏蔽:只能屏蔽本核的 原子操作 ...
linux下c編程特點
- typeof 取變數類型
- GNU c對比ANSI c做了很多擴展,例如動態數組
第7章 Linux設備驅動中的併發控制
造成竟態的原因
- 多核
- 進程和中斷形成的多路徑(linux2.6以後,禁止了中斷嵌套)
- 編譯亂序
- 執行亂序
解決竟態的辦法
- 中斷屏蔽:只能屏蔽本核的
- 原子操作:依賴cpu指令
- 自旋鎖:自旋鎖 + 中斷屏蔽可以完全解決竟態問題(中斷程式中調用自旋鎖,進程/線程中調用關中斷+自旋鎖)
- 互斥鎖:互斥鎖允許臨界區阻塞,而自旋鎖不可以
第8章 Linux設備驅動中的阻塞與非阻塞I/O
等待隊列
等待隊列一般用於同步訪問設備時,當不滿足讀寫時,將進程掛入設備的等待隊列,當可以讀寫時,將通過調用wakeup來喚醒進程。
globalfifo實現
註意:使用mutex互斥的地方,獲取到lock的一方發現設備不可訪問時,再schedule前需釋放lock,在被喚醒後重新獲取Lock
第10章 中斷與時鐘
中斷分為上下半部,下半部機制有tasklet, 工作隊列、軟中斷和線程化irq
- tasklet:運行在中斷上下文,基於軟中斷實現
- 工作隊列:運行在進程上下文
- 軟中斷:包括TIMER_SOFTIRQ, NEXT_TX/RX_SOFTIRQ, SCSI_SOFTIRQ, TASKLET_SOFTIRQ
第11章 記憶體與I/O訪問
內核記憶體管理
- 伙伴演算法解決頁外碎片,管理2^n個物理頁
- slab從buddy演算法拿到2^n個物理頁後,進行二次管理,類似於用戶態的ptmalloc這一類管理
原理有點像free queue,在free queue上做了進一步封裝
- 記憶體池
- 大頁記憶體:減少缺頁中斷