System-Calls

慢速系統呼叫和快速系統呼叫的區別

  • June 3, 2011

慢速系統呼叫和快速系統呼叫有什麼區別?我了解到如果程序捕捉到一些信號,慢速系統呼叫會阻塞,因為捕捉到的信號可能會喚醒阻塞的系統呼叫,但我不能完全理解這種機制。任何範例將不勝感激。

系統呼叫實際上有三個層次。

  1. 一些系統呼叫會立即返回。“立即”意味著他們唯一需要的是一點處理器時間。它們可以花費多長時間沒有硬性限制(實時系統除外),但是一旦它們被安排足夠長的時間,這些呼叫就會返回。

這些呼叫通常稱為非阻塞。非阻塞呼叫的範例是僅讀取一點系統狀態或對系統狀態進行簡單更改的呼叫,例如getpid、或。根據情況,一些系統呼叫可以是阻塞的或非阻塞的;例如,如果文件是支持非阻塞讀取的管道或其他類型並且設置了標誌,則從不阻塞。gettimeofdaygetuidsetuidreadO_NONBLOCK 2. 一些系統呼叫可能需要一段時間才能完成,但不會永遠完成。一個典型的例子是sleep。 3. 在某些外部事件發生之前,某些系統呼叫不會返回。這些呼叫被稱為阻塞。例如,read在阻塞文件描述符上呼叫是阻塞的,wait.

“快”和“慢”系統呼叫之間的區別接近於非阻塞與阻塞,但這次是從核心實現者的角度來看。快速系統呼叫是已知能夠在不阻塞或等待的情況下完成的系統呼叫。當核心遇到快速系統呼叫時,它知道它可以立即執行系統呼叫並保持同一個程序的調度。(在一些具有非搶占式多任務處理的作業系統中,快速系統呼叫可能是非搶占式的;這在普通的 unix 系統中並非如此。)另一方面,慢速系統呼叫可能需要等待另一個任務完成,因此核心必須準備暫停呼叫程序並執行另一個任務。

有些案例有點灰色地帶。例如,磁碟讀取(read從正常文件)通常被認為是非阻塞的,因為它不等待另一個程序;它只是在等待磁碟,通常只需要一點時間來回答,但不會永遠(所以上面的情況 2)。但是從核心的角度來看,該程序必須等待磁碟驅動程序完成,所以它肯定是一個緩慢的系統呼叫。

引用自:https://unix.stackexchange.com/questions/14293