linux核心自旋鎖和中斷知識講解
阿新 • • 發佈:2019-01-01
一、併發與競態三個要點
1、只要併發的執行單元同時訪問共享記憶體是就會出現競態
2、解決競態的唯一途徑是保證共享資源的互斥訪問,即一個執行單元在訪問共享資源時,其他的執行單元被禁止訪問。 3、訪問共享資源的程式碼區域被稱為臨界區,臨界區需要被以某種互斥機制加以保護 二、自旋鎖注意事項 1、自旋鎖是一種忙等鎖,當執行臨界區是沒有獲得鎖時,CPU一直迴圈執行“測試並設定”的原子操作,等待鎖的獲得,在等待過程中CPU不會做任何的工作,所以自旋鎖一定要是用在臨界區特別短的,即等待時間會很短,否則會降低系統性能 2、自旋鎖會導致系統出現死鎖,即已經獲得自旋鎖的資源重新再去獲得這個自旋鎖,即自旋鎖的遞迴使用,就會發生死鎖總結:低半部中斷的處理函式tasklet一般要在頂半部經過tasklet_schedule()函式排程在適當的時候執行。執行排程函式後低半部處理函式將掛到該裝置的低半部執行佇列中去。 軟中斷只是中斷低半部的一種處理機制void xxx_do_tasklet(unsight long); DSCLARE_TASKLET(xxx_tasklet,xxx_do_tasklet,0) 中斷處理低半部 void xxx_do_tasklet(unsighned long) { } 中斷處理頂半部 irqreturn_t xxx_interrupt(int irq,void *dev_id) { ........ tasklet_schedule(&xxx_tasklet); } int __init xxx_init(void) { result = request_irq(xxx_irq,xxx_interrupt,0,"xxx",NULL); } void __exit xxx_exit(void){ free_irq(xxx_irq,xxx_interrupt); }