OS- -系统调用
OS- -系統(tǒng)調(diào)用
文章目錄
- OS- -系統(tǒng)調(diào)用
- 一、系統(tǒng)調(diào)用
- 用于進(jìn)程管理的系統(tǒng)調(diào)用
- 用于文件管理的系統(tǒng)調(diào)用
- 用于目錄管理的系統(tǒng)調(diào)用
- 其他系統(tǒng)調(diào)用
- Win 32 API
一、系統(tǒng)調(diào)用
- 我們已經(jīng)可以看到操作系統(tǒng)提供了兩種功能:為用戶提供應(yīng)用程序抽象和管理計(jì)算機(jī)資源。
- 對(duì)于大部分 在應(yīng)用程序和操作系統(tǒng)之間的交互主要是應(yīng)用程序的抽象,例如創(chuàng)建、寫入、讀取和刪除文件。計(jì)算機(jī) 的資源管理對(duì)用戶來說基本上是透明的。
- 因此,用戶程序和操作系統(tǒng)之間的接口主要是處理抽象。為了 真正理解操作系統(tǒng)的行為,我們必須仔細(xì)的分析這個(gè)接口。
- 多數(shù)現(xiàn)代操作系統(tǒng)都有功能相同但是細(xì)節(jié)不同的系統(tǒng)調(diào)用,引發(fā)操作系統(tǒng)的調(diào)用依賴于計(jì)算機(jī)自身的機(jī) 制,而且必須用匯編代碼表達(dá)。
- 任何單CPU計(jì)算機(jī)一次執(zhí)行執(zhí)行一條指令。如果一個(gè)進(jìn)程在用戶態(tài)下 運(yùn)行用戶程序,例如從文件中讀取數(shù)據(jù)。那么如果想要把控制權(quán)交給操作系統(tǒng)控制,那么必須執(zhí)行一個(gè) 異常指令或者系統(tǒng)調(diào)用指令。
- 操作系統(tǒng)緊接著需要參數(shù)檢查找出所需要的調(diào)用進(jìn)程。操作系統(tǒng)緊接著進(jìn) 行參數(shù)檢查找出所需要的調(diào)用進(jìn)程。然后執(zhí)行系統(tǒng)調(diào)用,把控制權(quán)移交給系統(tǒng)調(diào)用下面的指令。
- 大致來 說,系統(tǒng)調(diào)用就像是執(zhí)行了一個(gè)特殊的過程調(diào)用,但是只有系統(tǒng)調(diào)用能夠進(jìn)入內(nèi)核態(tài)而過程調(diào)用則不能 進(jìn)入內(nèi)核態(tài)。
- 為了能夠了解具體的調(diào)用過程,下面我們以read方法為例來看一下調(diào)用過程。
- 像上面提到的那樣, 會(huì)有三個(gè)參數(shù),第一個(gè)參數(shù)是指定文件、第二個(gè)是指向緩沖區(qū)、第三個(gè)參數(shù)是給定需要讀取的字節(jié)數(shù)。
- 就像幾乎所有系統(tǒng)調(diào)用一樣,它通過使用與系統(tǒng)調(diào)用相同的名稱來調(diào)用一個(gè)函數(shù)庫(kù),從而從C程序中調(diào) 用:read。
-
系統(tǒng)調(diào)用在count中返回實(shí)際讀出的字節(jié)數(shù)。這個(gè)值通常與nbytes相同,但也可能更小。比如在讀過 程中遇到了文件尾的情況。
-
如果系統(tǒng)調(diào)用不能執(zhí)行,不管是因?yàn)闊o效的參數(shù)還是磁盤錯(cuò)誤,count的值都會(huì)被置成-1,然后在全局 變量errno中放入錯(cuò)誤信號(hào)。程序應(yīng)該進(jìn)場(chǎng)檢查系統(tǒng)調(diào)用的結(jié)果以了解是否出錯(cuò)。
-
系統(tǒng)調(diào)用是通過一系列的步驟實(shí)現(xiàn)的,為了更清楚的說明這個(gè)概念,我們還以read調(diào)用為例,在準(zhǔn)備 系統(tǒng)調(diào)用前,首先會(huì)把參數(shù)壓入堆棧,如下所示
-
完成系統(tǒng)調(diào)用read(fd, buffer, nbytes)的11個(gè)步驟
-
C和C++編譯器使用逆序傳參,放在堆棧的頂部)。
-
第一個(gè) 參數(shù)和第三個(gè)參數(shù)都是值調(diào)用,但是第二個(gè)參數(shù)通過引用傳遞,即傳遞的是緩沖區(qū)的地址(由&指 示),而不是緩沖的內(nèi)容。
-
然后是C調(diào)用系統(tǒng)庫(kù)的read函數(shù),這也是第四步。
-
在由匯編語言寫成的庫(kù)過程中,一般把系統(tǒng)調(diào)用的編號(hào)放在操作系統(tǒng)所期望的地方,如寄存器(第五 步)。
-
然后執(zhí)行一個(gè)TRAP指令,將用戶態(tài)切換到內(nèi)核態(tài),并在內(nèi)核中的一個(gè)固定地址開始執(zhí)行第六 步。
-
TRAP指令實(shí)際上與過程調(diào)用指令非常相似,它們后面都跟隨一個(gè)來自遠(yuǎn)處位置的指令,以及供以 后使用的一個(gè)保存在棧中的返回地址。
TRAP指令與過程調(diào)用指令存在兩個(gè)方面的不同:
- ? TRAP指令會(huì)改變操作系統(tǒng)的狀態(tài),由用戶態(tài)切換到內(nèi)核態(tài),而過程調(diào)用不改變模式
- ?其次,TRAP指令不能跳轉(zhuǎn)到任意地址上。根據(jù)機(jī)器的體系結(jié)構(gòu),要么跳轉(zhuǎn)到一個(gè)單固定地址上,或者指令中有一8位長(zhǎng)的字段,它給定了內(nèi)存中一張表格的索引,這張表格中含有跳轉(zhuǎn)地址,然 后跳轉(zhuǎn)到指定地址上。
- 跟隨在TRAP指令后的內(nèi)核代碼開始檢查系統(tǒng)調(diào)用編號(hào),然后dispatch給正確的系統(tǒng)調(diào)用處理器, 這通常是通過一張由系統(tǒng)調(diào)用編號(hào)所引用的、指向系統(tǒng)調(diào)用處理器的指針表來完成第七步。
- 此時(shí),系統(tǒng) 調(diào)用處理器運(yùn)行第八步
- 一旦系統(tǒng)調(diào)用處理器完成工作,控制權(quán)會(huì)根據(jù)TRAP指令后面的指令中返回給 函數(shù)調(diào)用庫(kù)第九步。
- 這個(gè)過程接著以通常的過程調(diào)用返回的方式,返回到客戶應(yīng)用程序,這是第十步。
- 然后調(diào)用完成后,操作系統(tǒng)還必須清除用戶堆棧,然后增加堆棧指針(increment stackpointer), 用來清除調(diào)用read之前壓入的參數(shù)。
從而完成整個(gè)read調(diào)用過程。
- 在上面的第九步中我們說道,控制可能返回TRAP指令后面的指令,把控制權(quán)再移交給調(diào)用者這個(gè)過程 中,系統(tǒng)調(diào)用會(huì)發(fā)生阻塞,從而避免應(yīng)用程序繼續(xù)執(zhí)行。
- 這么做是有原因的。例如,如果試圖讀鍵盤, 此時(shí)并沒有任何輸入,那么調(diào)用者就必須被阻塞。
- 在這種情形下,操作系統(tǒng)會(huì)檢查是否有其他可以運(yùn)行 的進(jìn)程。這樣,當(dāng)有用戶輸入時(shí)候,進(jìn)程會(huì)提醒操作系統(tǒng),然后返回第9步繼續(xù)運(yùn)行。
下面,我們會(huì)列出一些常用的POSIX系統(tǒng)調(diào)用,POSIX系統(tǒng)調(diào)用大概有100多個(gè),它們之中最重要 的一些調(diào)用見下表:
- 上面的系統(tǒng)調(diào)用參數(shù)中有一些公共部分,例如pid系統(tǒng)進(jìn)程id, fd是文件描述符,n是字節(jié)數(shù), position是在文件中的偏移量、seconds是流逝時(shí)間。
- 從宏觀角度上看,這些系統(tǒng)調(diào)所提供的服務(wù)確定了多數(shù)操作系統(tǒng)應(yīng)該具有的功能,下面分別來對(duì)不同的 系統(tǒng)調(diào)用進(jìn)行解釋
用于進(jìn)程管理的系統(tǒng)調(diào)用
-
在UNIX中,fork是唯一可以在POSIX中創(chuàng)建進(jìn)程的途徑,它創(chuàng)建一個(gè)原有進(jìn)程的副本,包括所有 的文件描述符、寄存器等內(nèi)容。
-
在fork之后,原有進(jìn)程以及副本(父與子)就分開了。在fork過程 中,所有的變量都有相同的值,雖然父進(jìn)程的數(shù)據(jù)通過復(fù)制給子進(jìn)程,但是后續(xù)對(duì)其中任何一個(gè)進(jìn)程的 修改不會(huì)影響到另外一個(gè)。
-
fork調(diào)用會(huì)返回一個(gè)值,在子進(jìn)程中該值為0,并且在父進(jìn)程中等于子進(jìn)程 的進(jìn)程標(biāo)識(shí)符(Process IDentified,PID) ,使用返回的PID,就可以看出來哪個(gè)是父進(jìn)程和子進(jìn) 程。
-
在多數(shù)情況下,在fork之后,子進(jìn)程需要執(zhí)行和父進(jìn)程不一樣的代碼。
-
從終端讀取命令,創(chuàng)建一個(gè)子 進(jìn)程,等待子進(jìn)程執(zhí)行命令,當(dāng)子進(jìn)程結(jié)束后再讀取下一個(gè)輸入的指令。
-
為了等待子進(jìn)程完成,父進(jìn)程 需要執(zhí)行waitpid系統(tǒng)調(diào)用,父進(jìn)程會(huì)等待直至子進(jìn)程終止(若有多個(gè)子進(jìn)程的話,則直至任何一 個(gè)子進(jìn)程終止)。
-
waitpid可以等待一個(gè)特定的子進(jìn)程,或者通過將第一個(gè)參數(shù)設(shè)為-1的方式,等待任 何一個(gè)比較老的子進(jìn)程。
-
當(dāng)waitpid完成后,會(huì)將第二個(gè)參數(shù)statloc所指向的地址設(shè)置為子進(jìn)程的 退出狀態(tài)(正常或異常終止以及退出值)。有各種可使用的選項(xiàng),它們由第三個(gè)參數(shù)確定。
-
例如,如果 沒有已經(jīng)退出的子進(jìn)程則立刻返回。
-
那么shell該如何使用fork呢?在鍵入一條命令后,shell會(huì)調(diào)用fork命令創(chuàng)建一個(gè)新的進(jìn)程。這個(gè)子 進(jìn)程會(huì)執(zhí)行用戶的指令。
-
通過使用execve系統(tǒng)調(diào)用可以實(shí)現(xiàn)系統(tǒng)執(zhí)行,這個(gè)系統(tǒng)調(diào)用會(huì)引起整個(gè)核 心映像被一個(gè)文件所替代,該文件由第一個(gè)參數(shù)給定。
下面是一個(gè)簡(jiǎn)化版的例子說明fork、waitpid和 execve的使用:
- —般情況下,execve有三個(gè)參數(shù):將要執(zhí)行的文件名稱,一個(gè)指向變量數(shù)組的指針,以及一個(gè)指向環(huán) 境數(shù)組的指針。
- 先看一個(gè)shell指令
- 此命令把filel復(fù)制到file2文件中,在shell執(zhí)行fork之后,子進(jìn)程定位并執(zhí)行文件拷貝,并將源文件 和目標(biāo)文件的名稱傳遞給它。
- cp的主程序(以及包含其他大多數(shù)C程序的主程序)包含聲明
- 其中第一個(gè)參 數(shù)argc是命令行中參數(shù)數(shù)目的計(jì)數(shù),包括程序名稱。
- 對(duì)于上面的例子,argc是3。
- 第二個(gè)參 數(shù)argv是數(shù)組的指針。該數(shù)組的元素i是指向該命令行第i個(gè)字符串的指針。在上面的例子中, argv[0]指向字符串cp, argv[1]指向字符串filel, argv[2]指向字符串file2。
- main的第三個(gè)參數(shù)是指向 環(huán)境的指針,該環(huán)境是一個(gè)數(shù)組,含有name = value的賦值形式,用以將諸如終端類型以及根目錄 等信息傳送給程序。這些變量通常用來確定用戶希望如何完成特定的任務(wù)(例如,使用默認(rèn)打印機(jī))。
- 在上面的例子中,沒有環(huán)境參數(shù)傳遞給execve ,所以環(huán)境變量是0 ,所以execve的第三個(gè)參數(shù)為0
- 可能你覺得execve過于復(fù)雜,這時(shí)候我要鼓勵(lì)一下你,execve可能是POSIX的全部系統(tǒng)調(diào)用中最復(fù) 雜的一個(gè)了,其他都比較簡(jiǎn)單。
- 作為一個(gè)簡(jiǎn)單的例子,我們?cè)賮砜匆幌耬xit ,這是進(jìn)程在執(zhí)行完成 后應(yīng)執(zhí)行的系統(tǒng)調(diào)用。這個(gè)系統(tǒng)調(diào)用有一個(gè)參數(shù),它的退出狀態(tài)是0 - 255之間,它通過waitpid系統(tǒng) 調(diào)用中的statloc返回給父級(jí)。
- UNIX中的進(jìn)程將內(nèi)存劃分成三個(gè)部分:text segment,文本區(qū),例如程序代碼,data segment, 數(shù)據(jù)區(qū),例如變量,stack segment ,棧區(qū)域。數(shù)據(jù)向上增長(zhǎng)而堆棧向下增長(zhǎng),如下圖所示
- 上圖能說明三個(gè)部分的內(nèi)存分配情況,夾在中間的是空閑區(qū),也就是未分配的區(qū)域,堆棧在需要時(shí)自動(dòng) 的擠壓空閑區(qū)域,不過數(shù)據(jù)段的擴(kuò)展是顯示地通過系統(tǒng)調(diào)用brk進(jìn)行的,在數(shù)據(jù)段擴(kuò)充后,該系統(tǒng)調(diào) 用指向一個(gè)新地址。
- 但是,這個(gè)調(diào)用不是POSIX標(biāo)準(zhǔn)中定義的,對(duì)于存儲(chǔ)器的動(dòng)態(tài)分配,鼓勵(lì)程序員 使用malloc函數(shù),而malloc的內(nèi)部實(shí)現(xiàn)則不是一個(gè)適合標(biāo)準(zhǔn)化的主題,因?yàn)閹缀鯖]有程序員直接 使用它。
用于文件管理的系統(tǒng)調(diào)用
-
許多系統(tǒng)調(diào)用都與文件系統(tǒng)有關(guān),要讀寫一個(gè)文件,必須先將其打開。
-
這個(gè)系統(tǒng)調(diào)用通過絕對(duì)路徑名或 指向工作目錄的相對(duì)路徑名指定要打開文件的名稱,而代碼O-RDONLY、 O-WRONLY或O_RDWR 的含義分別是只讀、只寫或者兩者都可以,為了創(chuàng)建一個(gè)新文件,使用O-CREATE參數(shù)。
-
然后可使用 返回的文件描述符進(jìn)行讀寫操作。接著,可以使用close關(guān)閉文件,這個(gè)調(diào)用使得文件描述符在后續(xù)的 open中被再次使用。
-
最常用的調(diào)用還是read和write ,我們?cè)偾懊嫣接戇^read調(diào)用,write具有與read相同的參 數(shù)。
-
盡管多數(shù)程序頻繁的讀寫文件,但是仍有一些應(yīng)用程序需要能夠隨機(jī)訪問一個(gè)文件的任意部分。
-
與每個(gè) 文件相關(guān)的是一個(gè)指向文件當(dāng)前位置的指針。
-
在順序讀寫時(shí),該指針通常指向要讀出(寫入)的下一個(gè) 字節(jié)。Iseek調(diào)用可以改變?cè)撐恢弥羔樀闹?#xff0c;這樣后續(xù)的read或write調(diào)用就可以在文件的任何地 方開始。
-
Iseek有三個(gè)參數(shù),position = iseek(fd,offset,whence),第一個(gè)是文件描述符,第二個(gè)是文 件位置,第三個(gè)是說明該文件位置是相對(duì)于文件起始位置,當(dāng)前位置還是文件的結(jié)尾。
-
在修改了指針之 后,Iseek所返回的值是文件中的絕對(duì)位置。
-
UNIX為每個(gè)文件保存了該文件的類型(普通文件、特殊文件、目錄等)、大小,最后修改時(shí)間以及其他信息,程序可以通過stat系統(tǒng)調(diào)用查看這些信息。
-
s = stat(name,&buf),第一個(gè)參數(shù)指定了 被檢查的文件;第二個(gè)參數(shù)是一個(gè)指針,該指針指向存放這些信息的結(jié)構(gòu)。對(duì)于一個(gè)打開的文件而言, fstat調(diào)用完成同樣的工作。
用于目錄管理的系統(tǒng)調(diào)用
- 下面我們探討目錄和整個(gè)文件系統(tǒng)的系統(tǒng)調(diào)用,上面探討的是和某個(gè)文件有關(guān)的系統(tǒng)調(diào)用。
- mkdir和 rmdir分別用于創(chuàng)建s = mkdir(nname,mode)和刪除s = rmdir(name)空目錄
- 下一個(gè)調(diào)用是s = link(namel,name2)它的作用是允許同一個(gè)文件以兩個(gè)或者多個(gè)名稱出現(xiàn),多數(shù)情況下是在 不同的目錄中使用link
下面我們探討一下link是如何工作的
- 圖中有兩個(gè)用戶ast和jim ,每個(gè)用戶都有他自己的一個(gè)目錄和一些文件,如果ast要執(zhí)行一個(gè)包 含下面系統(tǒng)調(diào)用的應(yīng)用程序
- jim中的memo文件現(xiàn)在會(huì)進(jìn)入到ast的目錄中,在note名稱下。
- 此后,/usr/jim/memo和 /usr/ast/note會(huì)有相同的名稱。
- 用戶目錄是保存在/usr, /user, /home還是其他位置,都是由本地系統(tǒng)管理員決定的。
- 要理解link是如何工作的需要清楚link做了什么操作。
- UNIX中的每個(gè)文件都有一個(gè)獨(dú)一無二的版本, 也稱作i - number, i-編號(hào),它標(biāo)示著不同文件的版本。這個(gè)i -編號(hào)是i-nodes,i-節(jié)點(diǎn) 表的索 引。
- 每個(gè)文件都會(huì)表明誰擁有這個(gè)文件,這個(gè)磁盤塊的位置在哪,等等。目錄只是一個(gè)包含一組(i編 號(hào),ASCII名稱)對(duì)應(yīng)的文件。
- UNIX中的第一個(gè)版本中,每個(gè)目錄項(xiàng)都會(huì)有16個(gè)字節(jié),2個(gè)字節(jié)對(duì)應(yīng)i -編號(hào)和14個(gè)字節(jié)對(duì)應(yīng)其名稱。現(xiàn)在需要一個(gè)更復(fù)雜的結(jié)構(gòu)需要支持長(zhǎng)文件名,但是從概念上講一個(gè) 目錄仍是一系列(i-編號(hào),ASCII名稱)的集合。
- 在上圖中,mail的i-編號(hào)為16,依此類推。link只 是利用某個(gè)已有文件的i-編號(hào),創(chuàng)建一個(gè)新目錄項(xiàng)(也許用一個(gè)新名稱)。
- 在上圖b中,你會(huì)發(fā)現(xiàn)有兩 個(gè)相同的70 i-編號(hào)的文件,因此它們需要有相同的文件。
- 如果其中一個(gè)使用了 unlink系統(tǒng)調(diào)用的 話,其中—個(gè)會(huì)被移除,另一個(gè)將保留。如果兩個(gè)文件都移除了,則UNIX會(huì)發(fā)現(xiàn)該文件不存在任何沒 有目錄項(xiàng)(i-節(jié)點(diǎn)中的一個(gè)域記錄著指向該文件的目錄項(xiàng)),就會(huì)把該文件從磁盤中移除。
- 就像我們上面提到過的那樣,mount系統(tǒng)s = mount(special,name,flag)調(diào)用會(huì)將兩個(gè)文件系 統(tǒng)合并為一個(gè)。
- 通常的情況是將根文件系統(tǒng)分布在硬盤(子)分區(qū)上,并將用戶文件分布在另一個(gè)子)分區(qū)上,該根文件系統(tǒng)包含常用命令的二進(jìn)制(可執(zhí)行)版本和其他使用頻繁的文件。然后,用 戶就會(huì)插入可讀取的USB硬盤。
通過執(zhí)行mount系統(tǒng)調(diào)用,USB文件系統(tǒng)可以被添加到根文件系統(tǒng)中,
- 如果用C語言來執(zhí)行那就是
- 這里,第一個(gè)參數(shù)是USB驅(qū)動(dòng)器0的塊特殊文件名稱,第二個(gè)參數(shù)是被安裝在樹中的位置,第三個(gè)參 數(shù)說明將要安裝的文件系統(tǒng)是可讀寫的還是只讀的。
- 當(dāng)不再需要一個(gè)文件系統(tǒng)時(shí),可以使用amount移除之。
其他系統(tǒng)調(diào)用
- 除了進(jìn)程、文件、目錄系統(tǒng)調(diào)用,也存在其他系統(tǒng)調(diào)用的情況,下面我們來探討一下。
- 我們可以看到上 面其他系統(tǒng)調(diào)用只有四種,首先來看第一個(gè)chdir, chdir調(diào)用更改當(dāng)前工作目錄
- 在調(diào)用后,打開xyz文件,會(huì)打開/usr/ast/test/xyz文件,工作目錄的概念消除了總是需要輸入長(zhǎng)文件 名的需要。
- 在UNIX系統(tǒng)中,每個(gè)文件都會(huì)有保護(hù)模式,這個(gè)模式會(huì)有一個(gè)讀-寫-執(zhí)行位,它用來區(qū)分所有者、 組和其他成員。chmod系統(tǒng)調(diào)用提供改變文件模式的操作。
- 例如,要使一個(gè)文件除了對(duì)所有者之外的 用戶可讀,你可以執(zhí)行
-
kill系統(tǒng)調(diào)用是用戶和用戶進(jìn)程發(fā)送信號(hào)的方式,如果一個(gè)進(jìn)程準(zhǔn)備好捕捉一個(gè)特定的信號(hào),那么在信號(hào)捕捉之前,會(huì)運(yùn)行一個(gè)信號(hào)處理程序。
-
如果進(jìn)程沒有準(zhǔn)備好捕捉特定的信號(hào),那么信號(hào)的到來會(huì) 殺掉該進(jìn)程(此名字的由來)。
-
POSIX定義了若干時(shí)間處理的進(jìn)程。例如,time以秒為單位返回當(dāng)前時(shí)間,0對(duì)應(yīng)著1970年1月1日。在一臺(tái)32位字的計(jì)算機(jī)中,time的最大值是(2人32) - 1秒,這個(gè)數(shù)字對(duì)應(yīng)136年多一點(diǎn)。
-
所以在 2106年,32位的UNIX系統(tǒng)會(huì)發(fā)飆。如果讀者現(xiàn)在有32位UNIX系統(tǒng),建議在2106年更換位64位 操作系統(tǒng)(偷笑?)。
Win 32 API
上面我們提到的都是UNIX系統(tǒng)調(diào)用,現(xiàn)在我們來聊聊Win 32中的系統(tǒng)調(diào)用。
- Windows和UNIX在各 自的編程方式上有著根本的不同。UNIX程序由執(zhí)行某些操作或執(zhí)行其他操作的代碼組成,進(jìn)行系統(tǒng)調(diào)用以執(zhí)行某些服務(wù)。
- Windows系統(tǒng)則不同,Windows應(yīng)用程序通常是由事件驅(qū)動(dòng)的。主程序會(huì)等待一 些事件發(fā)生,然后調(diào)用程序去處理。
- 最簡(jiǎn)單的事件處理是鍵盤敲擊和鼠標(biāo)滑過,或者是鼠標(biāo)點(diǎn)擊,或者是插入U(xiǎn)SB驅(qū)動(dòng),然后操作系統(tǒng)調(diào)用處理器去處理事件,更新屏幕和更新程序內(nèi)部狀態(tài)。這是與UNIX 不同的設(shè)計(jì)風(fēng)格。
- 當(dāng)然,Windows也有系統(tǒng)調(diào)用。在UNIX中,系統(tǒng)調(diào)用(比如read)和系統(tǒng)調(diào)用所使用的調(diào)用庫(kù)(例 如read)幾乎是一對(duì)一的關(guān)系。而在Windows中,情況則大不相同。
- 首先,函數(shù)庫(kù)的調(diào)用和實(shí)際的系 統(tǒng)調(diào)用幾乎是不對(duì)應(yīng)的。微軟定義了一系列過程,稱為Win32應(yīng)用編程接口(Application Programming Interface),程序員通過這套標(biāo)準(zhǔn)的接口來實(shí)現(xiàn)系統(tǒng)調(diào)用。這個(gè)接口支持從Windows 95版本以來所有的Windows版本。
- Win32 API調(diào)用的數(shù)量是非常巨大的,有數(shù)千個(gè)多。但這些調(diào)用并不都是在內(nèi)核態(tài)的模式下運(yùn)行時(shí),有 —些是在用戶態(tài)的模型下運(yùn)行。
- Win32 API有大量的調(diào)用,用來管理視窗、幾何圖形、文本、字體、滾 動(dòng)條、對(duì)話框、菜單以及GUI的其他功能。為了使圖形子系統(tǒng)在內(nèi)核態(tài)下運(yùn)行,需要系統(tǒng)調(diào)用,否則 就只有函數(shù)庫(kù)調(diào)用。
我們把關(guān)注點(diǎn)放在和Win32系統(tǒng)調(diào)用中來,我們可以簡(jiǎn)單看一下Win32 API中的系統(tǒng)調(diào)用和UNIX中 有什么不同(并不是所有的系統(tǒng)調(diào)用)
- 上表中是UNIX調(diào)用大致對(duì)應(yīng)的Win32 API系統(tǒng)調(diào)用,簡(jiǎn)述一下上表
- CreateProcess用于創(chuàng)建一 個(gè)新進(jìn)程,它把UNIX中的fork和execve兩個(gè)指令合成一個(gè),一起執(zhí)行。它有許多參數(shù)用來指定新創(chuàng) 建進(jìn)程的性質(zhì)。
- Windows中沒有類似UNIX中的進(jìn)程層次,所以不存在父進(jìn)程和子進(jìn)程的概念。在進(jìn) 程創(chuàng)建之后,創(chuàng)建者和被創(chuàng)建者是平等的。
- WaitForSingleObject用于等待一個(gè)事件,等待的事件 可以是多種可能的事件。如果有參數(shù)指定了某個(gè)進(jìn)程,那么調(diào)用者將等待指定的進(jìn)程退出,這通過 ExitProcess 來完成。
- 然后是6個(gè)文件操作,在功能上和UNIX的調(diào)用類似,然而在參數(shù)和細(xì)節(jié)上是不同的。和UNIX中一 樣,文件可以打開,讀取,寫入,關(guān)閉。SetFilePointer和GetFileAttributesEx設(shè)置文件的 位置并取得文件的屬性。
- Windows中有目錄,目錄分別用CreateDirectory以及RemoveDirectory API調(diào)用創(chuàng)建和刪 除。
- 也有對(duì)當(dāng)前的目錄的標(biāo)記,這可以通過SetCurrentDirectory來設(shè)置。使用GetLocalTime 可獲得當(dāng)前時(shí)間。
- Win32接口中沒有文件的鏈接、文件系統(tǒng)的mount、amount和stat ,當(dāng)然,Win32中也有大量 UNIX中沒有的系統(tǒng)調(diào)用,特別是對(duì)GUI的管理和調(diào)用
總結(jié)
- 上一篇: OS- -操作系统概念
- 下一篇: OS- -文件系统(一)