可重入核心在ulk(深入理解linux核心)中的定義是指若干個程序可以同時在核心態下執行,也就是說多個程序可以在核心態下併發執行核心**。在單處理器上,只能實現
微觀上的序列,巨集觀上的並行,即任意時刻,只有乙個進**正執行,其他程序處於阻塞或者等待狀態。這裡的可重入,是指可以多個程序進入核心,並不是重複/重新進入核心
對於linux來說,可重入核心**包含可重入函式和非可重入函式。
可重入函式是指執行時只改變區域性資料結構,不改變全域性資料結構;
不可重入函式是指執行該函式時也需要改變全域性資料結構。
如果有多個程序進入不可重入函式時,需要相應的鎖機制(互斥鎖,自旋鎖)來保證同一時刻只有乙個程序改變涉及到的全域性資料。
可重入函式的理解其實比較麻煩,可以從以下闡述:
1.可重入是與多執行緒無關的,乙個函式被同乙個執行緒呼叫2次以上,得到的結果具有可再現性。則這個函式是可重入的。
2.可重入講究的是結果可再現性,因此,使用全域性(靜態)變數的函式,再次呼叫其函式的結果是不可再現的,這就是前面說的為何要求該函式只修改區域性變數
故可重入函式,描述的是函式被多次呼叫但是結果具有可再現性
可重入函式條件:
1,不在函式內部使用靜態或者全域性資料
2,不返回靜態或者全域性資料,所有的資料都由函式呼叫者提供
3,使用本地資料,或者通過製作全域性資料的本地拷貝來保護全域性資料
4, 如果必須訪問全域性資料,使用互斥鎖(自旋鎖)來保護
5,不呼叫不可重入函式
6,可重入函式必須是執行緒安全的
補充一點,可重入函式必定是執行緒安全的,但是執行緒安全的,不一定是可重入的。不可重入函式,函式呼叫結果不具有可再現性,可以通過互斥鎖等機制,使之能安全的同時被多個執行緒呼叫,那麼,這個不可重入函式就是轉換成了執行緒安全。
可重入函式主要用於多工環境中,乙個可重入的函式簡單來說就是可以被中斷的函式,也就是說,可以在這個函式執行的任何時刻中斷它,轉入os排程下去執行另外一段**,而返回控制時不會出現什麼錯誤;而不可重入的函式由於使用了一些系統資源,比如全域性變數區,中斷向量表等,所以它如果被中斷的話,可能會出現問題,這類函式是不能執行在多工環境下的。
可重入函式也可以這樣理解,重入即表示重複進入,首先它意味著這個函式可以被中斷,其次意味著它除了使用自己棧上的變數以外不依賴於任何環境(包括 static),這樣的函式就是purecode(純**)可重入,可以允許有該函式的多個副本在執行,由於它們使用的是分離的棧,所以不會互相干擾。
可重入函式 可重入核心
可重入函式這一概念早有接觸,但一直未有系統的理解,最近閱讀 apue 訊號一章時,其中講解很到位,故總結如下。訊號作為一種軟中斷,能夠被程序給捕獲,因而也就中斷程序的正常執行,轉而去執行訊號處理程式,最後再返回到原程序繼續正常執行。然而,當程序正在執行 malloc 動態記憶體分配時,訊號產生從而轉...
可重入核心
所有的unix核心都是可重入的,這意味著若干個程序可以同時在核心態下執行 提供可重入的一種方式是編寫函式,以編寫這些函式只能修改區域性變數,而不能修改全域性資料結構,這樣的函式叫可重入函式。但是可重入核心不僅僅侷限於這樣的可重入函式。相反,可重入核心可以包含非重入函式,並且利用鎖機制保證一次只有乙個...
可重入函式
在實時系統的設計中,經常會出現多個任務呼叫同乙個函式的情況。如果這個函式不幸被設計成為不可重入的函式的話,那麼不同任務呼叫這個函式時可能修改其他任務呼叫這個函式的資料,從而導致不可預料的後果。那麼什麼是可重入函式呢?所謂可重入函式是指乙個可以被多個任務呼叫的過程,任務在呼叫時不必擔心資料是否會出錯。...