1. 程式人生 > >中斷中為何不能使用訊號量,中斷上下文為何不能睡眠

中斷中為何不能使用訊號量,中斷上下文為何不能睡眠

不論是書上還是網上,對這塊的解釋,總是很凌亂,  讓人不好理清。   大部分開發者可能也只知其然,不知所以然。

在網上找到一篇對此解釋言簡意賅,一看就懂的文章,故分享過來。


1、中斷中為何不能使用訊號量?

答: 訊號量會導致睡眠。


2、中斷上下為何不能睡眠?

以下為轉載: http://blog.chinaunix.NET/uid-7332782-id-3213376.html


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

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

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

     但是在某些追求實時性的嵌入式linux中,中斷也可能被賦予task_struct結構。這是為了避免大量中斷不斷的巢狀,導致一段時間內CPU總是執行在中斷上下文,使得某些優先順序非常高的程序得不到執行。這種做法能夠提高系統的實時性,但是代價中吞吐量的降低

不論是書上還是網上,對這塊的解釋,總是很凌亂,  讓人不好理清。   大部分開發者可能也只知其然,不知所以然。

在網上找到一篇對此解釋言簡意賅,一看就懂的文章,故分享過來。


1、中斷中為何不能使用訊號量?

答: 訊號量會導致睡眠。


2、中斷上下為何不能睡眠?

以下為轉載: http://blog.chinaunix.NET/uid-7332782-id-3213376.html


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

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

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

     但是在某些追求實時性的嵌入式linux中,中斷也可能被賦予task_struct結構。這是為了避免大量中斷不斷的巢狀,導致一段時間內CPU總是執行在中斷上下文,使得某些優先順序非常高的程序得不到執行。這種做法能夠提高系統的實時性,但是代價中吞吐量的降低