排斥調用

排斥調用

調用是將程式的執行交給其他的代碼段,通常是一個子例程,同時保存必要的信息,從而使被調用段執行完畢後返回到調用點繼續執行。排斥調用是要調用的程式或函式之間是互斥的,它們之間一次只有一個能執行。如果同時調用,會造成死鎖或讀寫不統一。最常見的例子是一個進程同時調用讀寫函式,屬於典型的排斥調用。

基本介紹

  • 中文名:排斥調用
  • 外文名:Exclusion call
  • 學科:計算機科學
  • 定義:調用的程式或函式之間是互斥
  • 有關術語:調用、互斥
  • 領域:作業系統
簡介,系統調用,進程控制類系統調用,檔案操縱類系統調用,進程通信類系統調用,實現,互斥,示例,

簡介

在計算機系統中,通常運行著兩類程式:系統程式和應用程式,為了保證系統程式不被應用程式有意或無意地破壞,為計算機設定了兩種狀態:系統態(也稱為管態或核心態)和用戶態(也稱為目態)。作業系統在系統態運行,而應用程式只能在用戶態運行。
調用一般分為系統調用和一般調用。一般的過程調用,其調用程式和被調用程式都運行在相同的狀態——系統態或用戶態;而系統調用與一般調用的最大區別就在於:調用程式是運行在用戶態,而被調用程式是運行在系統態。排斥調用即調用的程式或函式之間是互斥的,它們之間一次只有一個能執行,在一般調用和系統調用過程都有存在。不過排斥調用主要發生在系統調用過程中,這這與計算機的資源有關。

系統調用

系統調用(英語:system call),又稱為系統呼叫,指運行在使用者空間的程式作業系統核心請求需要更高許可權運行的服務。系統調用提供用戶程式與作業系統之間的接口。大多數系統互動式操作需求在核心態執行。如設備IO操作或者進程間通信。
由於各 OS 的性質不同,在不同的 OS 中所提供的系統調用之間也會有一定的差異。對於一般通用的 OS 而言,可將其所提供的系統調用分為:進程控制、檔案操縱、通信管理和系統維護等幾大類。

進程控制類系統調用

這類系統調用主要用於對進程的控制,如創建一個新的進程和終止一個進程的運行,獲得和設定進程屬性等。

檔案操縱類系統調用

對檔案進行操縱的系統調用數量較多,有創建檔案、刪除檔案、打開檔案、關閉檔案、讀檔案、寫檔案、建立目錄、移動檔案的讀/寫指針、改變檔案的屬性等。

進程通信類系統調用

在 OS 中經常採用兩種進程通信方式,即訊息傳遞方式和共享存儲區方式。 當系統中採用訊息傳遞方式時,在通信前,必須先打開一個連線。為此,應由源進程發出一條打開連線的系統調用 open connection,而目標進程則應利用接受連線的系統調用 accept connection表示同意進行通信;然後,在源和目標進程之間便可開始通信。可以利用傳送訊息的系統調用 send message 或者用接收訊息的系統調用 receive message 來交換信息。通信結束後,還須再利用關閉連線的系統調用 close connection 結束通信。用戶在利用共享存儲區進行通信之前,須先利用建立共享存儲區的系統調用來建立一個共享存儲區,再利用建立連線的系統調用將該共享存儲區連線到進程自身的虛地址空間上,然後便可利用讀和寫共享存儲區的系統調用實現相互通信。

實現

Linux 的系統調用通過 int 80h 實現,用系統調用號來區分入口函式。作業系統實現系統調用的基本過程是:
應用程式調用庫函式(API);
API 將系統調用號存入 EAX,然後通過中斷調用使系統進入核心態;
核心中的中斷處理函式根據系統調用號,調用對應的核心函式(系統調用);
系統調用完成相應功能,將返回值存入 EAX,返回到中斷處理函式;
中斷處理函式返回到 API 中;
API 將 EAX 返回給應用程式。
應用程式調用系統調用的過程是:
把系統調用的編號存入 EAX;
把函式參數存入其它通用暫存器;
觸發 0x80 號中斷(int 0x80)。

互斥

在邏輯學中,互斥(Mutually Exclusive)是一種邏輯關係,指幾個變數或事件之中的任一個不可能與其它一個或多個同時為真,或同時發生的情況。對於邏輯函式,其變數互斥,意味著兩個以上變數為真(包括都不為真)的情況會導致函式值為假。對於事件,其所有條件的互斥意味著,任兩個條件的實現都將阻止事件的產生。同樣可以引申到程式編寫及其它關係。
比如一個最簡單的情況下,投擲一枚硬幣,硬幣不可能同時出現既為正也為反;兩個結果互斥。

示例

Web伺服器收到客戶端的http請求,會針對每一次請求,分別創建一個用於代表請求的request對象和代表回響的response對象。
request和response對象既然代表請求和回響,那我們要獲取客戶機提交過來的數據,只需要找request對象就行了。要向客戶機輸出數據,只需要找response對象即可。
HttpServletResponse對象伺服器的回響。這個對象中封裝了向客戶端傳送回響狀態碼(即回響行)、傳送回響頭、傳送數據的方法。
查看servlet文檔的HttpServletResponse中主要方法有:
setStatus()// 傳送狀態碼
setHeader() //傳送回響頭
getWriter()//傳送字元流數據,從父對象繼承的方法,Servlet程式可以按字元形式輸出回響正文。
getOutputStream() //傳送位元組流數據,從父對象繼承的方法,位元組流可以寫任何數據,但是字元流只能寫字元串。比如電影只能通過位元組流寫出。
其中getOutputStream和getWriter這兩個方法互相排斥,調用了其中的任何一個方法後,就不能再調用另一方法。 getOutputStream方法返回的位元組輸出流對象的類型為ServletOutputStream,它可以直接輸出位元組數組中的二進制數據。 getWriter方法將Servlet引擎的數據緩衝區包裝成PrintWriter類型的字元輸出流對象後返回,PrintWriter對象可以直接輸出字元文本內容。 Servlet程式向ServletOutputStream或PrintWriter對象中寫入的數據將被Servlet引擎獲取,Servlet引擎將這些數據當作回響訊息的正文,然後再與回響狀態行和各回響頭組合後輸出到客戶端。 Serlvet的service方法結束後,Servlet引擎將檢查getWriter或getOutputStream方法返回的輸出流對象是否已經調用過close方法,如果沒有,Servlet引擎將調用close方法關閉該輸出流對象。

相關詞條

熱門詞條

聯絡我們