中斷上下文中為何不能使用信號量?

因為:信號量會導致睡眠,而中斷服務程序中又不允許睡眠。

中斷髮生以後,CPU跳到內核設置好的中斷處理代碼中去,由這部分內核代碼來處理中斷。這個處理過程中的上下文就是中斷上下文。

為什麼可能導致睡眠的函數都不能在中斷上下文中使用呢? 首先睡眠的含義是將進程置於“睡眠”狀態,在這個狀態的進程不能被調度執行。然後,在一定的時機,這個進程可能會被重新置為“運行”狀態,從而可能被調度執行。 可見,“睡眠”與“運行”是針對進程而言的,代表進程的task_struct結構記錄著進程的狀態。內核中的“調度器”通過task_struct對進程進行調度。

但是,中斷上下文卻不是一個進程,它並不存在task_struct,所以它是不可調度的。所以,在中斷上下文就不能睡眠。

那麼,中斷上下文為什麼不存在對應的task_struct結構呢?

中斷的產生是很頻繁的(至少每毫秒(看配置,可能10毫秒或其他值)會產生一個時鐘中斷),並且中斷處理過程會很快。如果為中斷上下文維護一個對應的task_struct結構,那麼這個結構頻繁地分配、回收、並且影響調度器的管理,這樣會對整個系統的吞吐量有所影響。

中斷上下文中為何不能使用信號量?


分享到:


相關文章: