版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系我們

[科普中國(guó)]-排斥調(diào)用

科學(xué)百科
原創(chuàng)
科學(xué)百科為用戶提供權(quán)威科普內(nèi)容,打造知識(shí)科普陣地
收藏

簡(jiǎn)介

在計(jì)算機(jī)系統(tǒng)中,通常運(yùn)行著兩類程序:系統(tǒng)程序和應(yīng)用程序,為了保證系統(tǒng)程序不被應(yīng)用程序有意或無意地破壞,為計(jì)算機(jī)設(shè)置了兩種狀態(tài):系統(tǒng)態(tài)(也稱為管態(tài)或核心態(tài))和用戶態(tài)(也稱為目態(tài))。操作系統(tǒng)在系統(tǒng)態(tài)運(yùn)行,而應(yīng)用程序只能在用戶態(tài)運(yùn)行。

調(diào)用一般分為系統(tǒng)調(diào)用和一般調(diào)用。一般的過程調(diào)用,其調(diào)用程序和被調(diào)用程序都運(yùn)行在相同的狀態(tài)——系統(tǒng)態(tài)或用戶態(tài);而系統(tǒng)調(diào)用與一般調(diào)用的最大區(qū)別就在于:調(diào)用程序是運(yùn)行在用戶態(tài),而被調(diào)用程序是運(yùn)行在系統(tǒng)態(tài)。排斥調(diào)用即調(diào)用的程序或函數(shù)之間是互斥的,它們之間一次只有一個(gè)能執(zhí)行,在一般調(diào)用和系統(tǒng)調(diào)用過程都有存在。不過排斥調(diào)用主要發(fā)生在系統(tǒng)調(diào)用過程中,這這與計(jì)算機(jī)的資源有關(guān)。

系統(tǒng)調(diào)用系統(tǒng)調(diào)用(英語:system call),又稱為系統(tǒng)呼叫,指運(yùn)行在使用者空間的程序向操作系統(tǒng)內(nèi)核請(qǐng)求需要更高權(quán)限運(yùn)行的服務(wù)。系統(tǒng)調(diào)用提供用戶程序與操作系統(tǒng)之間的接口。大多數(shù)系統(tǒng)交互式操作需求在內(nèi)核態(tài)執(zhí)行。如設(shè)備IO操作或者進(jìn)程間通信。

由于各 OS 的性質(zhì)不同,在不同的 OS 中所提供的系統(tǒng)調(diào)用之間也會(huì)有一定的差異。對(duì)于一般通用的 OS 而言,可將其所提供的系統(tǒng)調(diào)用分為:進(jìn)程控制、文件操縱、通信管理和系統(tǒng)維護(hù)等幾大類。

進(jìn)程控制類系統(tǒng)調(diào)用這類系統(tǒng)調(diào)用主要用于對(duì)進(jìn)程的控制,如創(chuàng)建一個(gè)新的進(jìn)程和終止一個(gè)進(jìn)程的運(yùn)行,獲得和設(shè)置進(jìn)程屬性等。

文件操縱類系統(tǒng)調(diào)用對(duì)文件進(jìn)行操縱的系統(tǒng)調(diào)用數(shù)量較多,有創(chuàng)建文件、刪除文件、打開文件、關(guān)閉文件、讀文件、寫文件、建立目錄、移動(dòng)文件的讀/寫指針、改變文件的屬性等。

進(jìn)程通信類系統(tǒng)調(diào)用在 OS 中經(jīng)常采用兩種進(jìn)程通信方式,即消息傳遞方式和共享存儲(chǔ)區(qū)方式。 當(dāng)系統(tǒng)中采用消息傳遞方式時(shí),在通信前,必須先打開一個(gè)連接。為此,應(yīng)由源進(jìn)程發(fā)出一條打開連接的系統(tǒng)調(diào)用 open connection,而目標(biāo)進(jìn)程則應(yīng)利用接受連接的系統(tǒng)調(diào)用 accept connection表示同意進(jìn)行通信;然后,在源和目標(biāo)進(jìn)程之間便可開始通信??梢岳冒l(fā)送消息的系統(tǒng)調(diào)用 send message 或者用接收消息的系統(tǒng)調(diào)用 receive message 來交換信息。通信結(jié)束后,還須再利用關(guān)閉連接的系統(tǒng)調(diào)用 close connection 結(jié)束通信。用戶在利用共享存儲(chǔ)區(qū)進(jìn)行通信之前,須先利用建立共享存儲(chǔ)區(qū)的系統(tǒng)調(diào)用來建立一個(gè)共享存儲(chǔ)區(qū),再利用建立連接的系統(tǒng)調(diào)用將該共享存儲(chǔ)區(qū)連接到進(jìn)程自身的虛地址空間上,然后便可利用讀和寫共享存儲(chǔ)區(qū)的系統(tǒng)調(diào)用實(shí)現(xiàn)相互通信。1

實(shí)現(xiàn)Linux 的系統(tǒng)調(diào)用通過 int 80h 實(shí)現(xiàn),用系統(tǒng)調(diào)用號(hào)來區(qū)分入口函數(shù)。操作系統(tǒng)實(shí)現(xiàn)系統(tǒng)調(diào)用的基本過程是:

應(yīng)用程序調(diào)用庫(kù)函數(shù)(API);

API 將系統(tǒng)調(diào)用號(hào)存入 EAX,然后通過中斷調(diào)用使系統(tǒng)進(jìn)入內(nèi)核態(tài);

內(nèi)核中的中斷處理函數(shù)根據(jù)系統(tǒng)調(diào)用號(hào),調(diào)用對(duì)應(yīng)的內(nèi)核函數(shù)(系統(tǒng)調(diào)用);

系統(tǒng)調(diào)用完成相應(yīng)功能,將返回值存入 EAX,返回到中斷處理函數(shù);

中斷處理函數(shù)返回到 API 中;

API 將 EAX 返回給應(yīng)用程序。

應(yīng)用程序調(diào)用系統(tǒng)調(diào)用的過程是:

把系統(tǒng)調(diào)用的編號(hào)存入 EAX;

把函數(shù)參數(shù)存入其它通用寄存器;

觸發(fā) 0x80 號(hào)中斷(int 0x80)。

互斥在邏輯學(xué)中,互斥(Mutually Exclusive)是一種邏輯關(guān)系,指幾個(gè)變量或事件之中的任一個(gè)不可能與其它一個(gè)或多個(gè)同時(shí)為真,或同時(shí)發(fā)生的情況。對(duì)于邏輯函數(shù),其變量互斥,意味著兩個(gè)以上變量為真(包括都不為真)的情況會(huì)導(dǎo)致函數(shù)值為假。對(duì)于事件,其所有條件的互斥意味著,任兩個(gè)條件的實(shí)現(xiàn)都將阻止事件的產(chǎn)生。同樣可以引申到程序編寫及其它關(guān)系。

比如一個(gè)最簡(jiǎn)單的情況下,投擲一枚硬幣,硬幣不可能同時(shí)出現(xiàn)既為正也為反;兩個(gè)結(jié)果互斥。

示例Web服務(wù)器收到客戶端的http請(qǐng)求,會(huì)針對(duì)每一次請(qǐng)求,分別創(chuàng)建一個(gè)用于代表請(qǐng)求的request對(duì)象和代表響應(yīng)的response對(duì)象。

request和response對(duì)象既然代表請(qǐng)求和響應(yīng),那我們要獲取客戶機(jī)提交過來的數(shù)據(jù),只需要找request對(duì)象就行了。要向客戶機(jī)輸出數(shù)據(jù),只需要找response對(duì)象即可。

HttpServletResponse對(duì)象服務(wù)器的響應(yīng)。這個(gè)對(duì)象中封裝了向客戶端發(fā)送響應(yīng)狀態(tài)碼(即響應(yīng)行)、發(fā)送響應(yīng)頭、發(fā)送數(shù)據(jù)的方法。

查看servlet文檔的HttpServletResponse中主要方法有:

setStatus() // 發(fā)送狀態(tài)碼

setHeader() //發(fā)送響應(yīng)頭

getWriter() //發(fā)送字符流數(shù)據(jù),從父對(duì)象繼承的方法,Servlet程序可以按字符形式輸出響應(yīng)正文。

getOutputStream() //發(fā)送字節(jié)流數(shù)據(jù),從父對(duì)象繼承的方法,字節(jié)流可以寫任何數(shù)據(jù),但是字符流只能寫字符串。比如電影只能通過字節(jié)流寫出。2

其中g(shù)etOutputStream和getWriter這兩個(gè)方法互相排斥,調(diào)用了其中的任何一個(gè)方法后,就不能再調(diào)用另一方法。 getOutputStream方法返回的字節(jié)輸出流對(duì)象的類型為ServletOutputStream,它可以直接輸出字節(jié)數(shù)組中的二進(jìn)制數(shù)據(jù)。 getWriter方法將Servlet引擎的數(shù)據(jù)緩沖區(qū)包裝成PrintWriter類型的字符輸出流對(duì)象后返回,PrintWriter對(duì)象可以直接輸出字符文本內(nèi)容。 Servlet程序向ServletOutputStream或PrintWriter對(duì)象中寫入的數(shù)據(jù)將被Servlet引擎獲取,Servlet引擎將這些數(shù)據(jù)當(dāng)作響應(yīng)消息的正文,然后再與響應(yīng)狀態(tài)行和各響應(yīng)頭組合后輸出到客戶端。 Serlvet的service方法結(jié)束后,Servlet引擎將檢查getWriter或getOutputStream方法返回的輸出流對(duì)象是否已經(jīng)調(diào)用過close方法,如果沒有,Servlet引擎將調(diào)用close方法關(guān)閉該輸出流對(duì)象。