系统调用
程序接口是 OS 專門為用戶程序設置的,也是用戶程序取得 OS 服務的唯一途徑。程序接口通常是由各種類型的系統調用所組成的,因而,也可以說,系統調用提供了用戶程序和操作系統之間的接口,應用程序通過系統調用實現其與 OS 的通信,并可取得它的服務。
?
處理器(CPU)=運算器+控制器+寄存器+高速緩存
?
系統調用的基本概念
通常,在 OS 的核心中都設置了一組用于實現各種系統功能的子程序(過程),并將它們提供給應用程序調用。
?
系統態和用戶態
在計算機系統中,通常運行著兩類程序:系統程序和應用程序,為了保證系統程序不被應用程序有意或無意地破壞,為計算機設置了兩種狀態:
- 系統態(也稱為管態或核心態),操作系統在系統態運行
- 用戶態(也稱為目態),應用程序只能在用戶態運行。
在實際運行過程中,處理機會在系統態和用戶態間切換。相應地,現代多數操作系統將 CPU 的指令集分為特權指令和非特權指令兩類。
1) 特權指令——在系統態時運行的指令
- 對內存空間的訪問范圍基本不受限制,不僅能訪問用戶存儲空間,也能訪問系統存儲空間,
- 特權指令只允許操作系統使用,不允許應用程序使用,否則會引起系統混亂。
?
2) 非特權指令——在用戶態時運行的指令
一般應用程序所使用的都是非特權指令,它只能完成一般性的操作和任務,不能對系統中的硬件和軟件直接進行訪問,其對內存的訪問范圍也局限于用戶空間。
?
?
系統調用
?
如上所述,一方面由于系統提供了保護機制,防止應用程序直接調用操作系統的過程,從而避免了系統的不安全性。但另一方面,應用程序又必須取得操作系統所提供的服務,否則,應用程序幾乎無法作任何有價值的事情,甚至無法運行。為此,在操作系統中提供了系統調用,使應用程序可以通過系統調用的方法,間接調用操作系統的相關過程,取得相應的服務。
當應用程序中需要操作系統提供服務時,如請求 I/O 資源或執行 I/O 操作,應用程序必須使用系統調用命令。由操作系統捕獲到該命令后,便將 CPU 的狀態從用戶態轉換到系統態,然后執行操作系統中相應的子程序(例程),完成所需的功能。執行完成后,系統又將CPU 狀態從系統態轉換到用戶態,再繼續執行應用程序。
?
系統調用和一般調用的區別:
(1) 運行在不同的系統狀態——調用程序是運行在用戶態,而被調用程序是運行在系統態。
(2) 狀態的轉換通過軟中斷進入
- 一般的過程調用并不涉及到系統狀態的轉換,可直接由調用過程轉向被調用過程。
- 系統調用不允許由調用過程直接轉向被調用過程。
通常都是通過軟中斷機制,先由用戶態轉換為系統態,經核心分析后,才能轉向相應的系統調用處理子程序。
(3) 返回問題。
在采用了搶占式(剝奪)調度方式的系統中,在被調用過程執行完后,要對系統中所有要求運行的進程做優先權分析。當調用進程仍具有最高優先級時,才返回到調用進程繼續執行;否則,將引起重新調度,以便讓優先權最高的進程優先執行。此時,將把調用進程放入就緒隊列。
(4) 嵌套調用。
像一般過程一樣,系統調用也可以嵌套進行,即在一個被調用過程的執行期間,還可以利用系統調用命令去調用另一個系統調用。當然,每個系統對嵌套調用的深度都有一定的限制,例如最大深度為 6。
中斷機制
系統調用是通過中斷機制實現的,并且一個操作系統的所有系統調用都通過同一個中斷入口來實現。對于擁有保護機制的操作系統來說,中斷機制本身也是受保護的,
?
?
系統調用的類型
對于一般通用的 OS 而言,可將其所提供的系統調用分為:進程控制、文件操縱、通信管理和系統維護等幾大類。
?
進程控制類系統調用
這類系統調用主要用于對進程的控制,如創建一個新的進程和終止一個進程的運行,獲得和設置進程屬性等。
1) 創建和終止進程的系統調用
在多道程序環境下,為使多道程序能并發執行,必須先利用創建進程的系統調用來為欲參加并發執行的各程序分別創建一個進程。當進程已經執行結束時、 或因發生異常情況而不能繼續執行時,可利用終止進程的系統調用來結束該進程的運行。
?
2) 獲得和設置進程屬性的系統調用
當我們創建了一個(些)新進程后,為了能控制它(們)的運行,應當能了解、 確定和重新設置它(們)的屬性。這些屬性包括: 進程標識符、進程優先級、最大允許執行時間等。此時,我們可利用獲得進程屬性的系統調用,來了解某進程的屬性,利用設置進程屬性的系統調用,來確定和重新設置進程的屬性。
3) 等待某事件出現的系統調用
進程在運行過程中,有時需要等待某事件(條件)出現后方可繼續執行。例如,一進程在創建了一個(些)新進程后,需要等待它(們)運行結束后,才能繼續執行,此時可利用等待子進程結束的系統調用進行等待;
?
文件操縱類系統調用
對文件進行操縱的系統調用數量較多,有創建文件、刪除文件、打開文件、關閉文件、讀文件、寫文件、建立目錄、移動文件的讀/寫指針、改變文件的屬性等。
1) 創建和刪除文件
當用戶需要在系統中存放程序或數據時,可利用創建文件的系統調用 creat,由系統根據用戶提供的文件名和存取方式來創建一個新文件;當用戶已不再需要某文件時,可利用刪除文件的系統調用 unlink 將指名文件刪除。
2) 打開和關閉文件
用戶在第一次訪問某個文件之前,應先利用打開文件的系統調用 open,將指名文件打開,即系統將在用戶(程序)與該文件之間建立一條快捷通路。在文件被打開后,系統將給用戶返回一個該文件的句柄或描述符;當用戶不再訪問某文件時,又可利用關閉文件的系統調用 close,將此文件關閉,即斷開該用戶程序與該文件之間的快捷通路。
3) 讀和寫文件
用戶可利用讀系統調用 read,從已打開的文件中讀出給定數目的字符,并送至指定的緩沖區中;同樣,用戶也可利用寫系統調用 write,從指定的緩沖區中將給定數目的字符寫入指定文件中。read 和 write 兩個系統調用是文件操縱類系統調用中使用最頻繁的。
?
進程通信類系統調用
在 OS 中經常采用兩種進程通信方式,即消息傳遞方式和共享存儲區方式。
當系統中采用消息傳遞方式時
用戶在利用共享存儲區進行通信
除上述的三類外,常用的系統調用還包括設備管理類系統調用和信息維護類系統調用,
?
?
系統調用的實現
?
系統調用的實現與一般過程調用的實現相比,兩者間有很大差異。對于系統調用,控制是由原來的用戶態轉換為系統態,這是借助于中斷和陷入機制來完成的,在該機制中包括中斷和陷入硬件機構及中斷與陷入處理程序兩部分。當應用程序使用 OS 的系統調用時,產生一條相應的指令,CPU 在執行這條指令時發生中斷,并將有關信號送給中斷和陷入硬件機構,該機構收到信號后,啟動相關的中斷與陷入處理程序進行處理,實現該系統調用所需要的功能。
?
中斷和陷入硬件機構
1) 中斷和陷入的概念(面試考點——中斷與異常的區別)
中斷是指 CPU 對系統發生某事件時的這樣一種響應: CPU 暫停正在執行的程序,在保留現場后自動地轉去執行該事件的中斷處理程序;執行完后,再返回到原程序的斷點處繼續執行。
下圖 表示中斷時 CPU 的活動軌跡。還可進一步把中斷分為外中斷和內中斷。
- 外中斷——是指由于外部設備事件所引起的中斷,如通常的磁盤中斷、打印機中斷等;
- 內中斷——是指由于 CPU 內部事件所引起的中斷,如程序出錯(非法指令、地址越界)。內中斷(trap)也被譯為“捕獲”或“陷入”。
通常,陷入是由于執行了現行指令所引起的;而中斷則是由于系統中某事件引起的,該事件與現行指令無關。由于系統調用引起的中斷屬于內中斷,因此把由于系統調用引起中斷的指令稱為陷入指令。
?
2) 中斷和陷入向量(百度面試考過中斷向量)
?
- 針對不同的設備編制不同的中斷處理程序,并把該程序的入口地址放在某特定的內存單元中。
- 不同的設備也對應著不同的處理機狀態字PSW,且把它放在與中斷處理程序入口指針相鄰接的特定單元中。
在進行中斷處理時,只要有了這樣兩個字,便可轉入相應設備的中斷處理程序,重新裝配處理機的狀態字和優先級,進行對該設備的處理。因此,我們把這兩個字稱為中斷向量。相應地,把存放這兩個字的單元稱為中斷向量單元。
類似地,對于陷入,也有陷入向量,不同的系統調用對應不同的陷入向量,在進行陷入處理時,根據陷入指令中的陷入向量,轉入實現相應的系統調用功能的子程序,即陷入處理程序。由所有的中斷向量和陷入向量構成了中斷和陷入向量表,如圖所示。
?
?
?
?
UNIX 系統調用
?
?UNIX 系統調用的類型
進程控制
該類系統調用包括:創建進程的系統調用 fork、終止進程的系統調用 exit、等待子進程結束的系統調用 wait 等十多條。
(1) 創建進程(fork)。
一個進程可以利用 fork 系統調用來創建一個新進程。新進程是作為調用者的子進程,它繼承了其父進程的環境、 已打開的所有文件、根目錄和當前目錄等,即它繼承了父進程幾乎所有的屬性,并具有與其父進程基本上相同的進程映像。
(2) 終止進程(exit)。
一個進程可以利用 exit 實現自我終止。通常,在父進程創建子進程時,便在子進程的末尾安排一條 exit 系統調用。這樣,子進程在完成規定的任務后,便可進行自我終止。子進程終止后,留下一記賬信息 status,其中包含了子進程運行時記錄下來的各種統計信息。
(3) 等待子進程結束(wait)。
wait 用于將調用者進程自身掛起,直至它的某一子進程終止為止。這樣,父進程可以利用 wait 使自身的執行與子進程的終止同步。
(4) 執行一個文件(exec)。
exec 可使調用者進程的進程映像(包括用戶程序和數據等)被一個可執行的文件覆蓋,此即改變調用者進程的進程映像。該系統調用是 UNIX 系統中最復雜的系統調用之一。
(5) 獲得進程 ID。
UNIX 系統提供了一組用于獲得進程標識符的系統調用,比如,可利用 getpid 系統調用來獲得調用進程的標識符,利用 getpgrp 系統調用來獲得調用進程的進程組 ID,以及利用 getppid 系統調用來獲得調用進程的父進程 ID 等。
(6) 獲得用戶 ID。
UNIX 系統提供了一組用于獲得用戶 ID 的系統調用,如 getuid 可用于獲得真正的用戶 ID,geteuid 用于獲得有效用戶 ID,getgid 用于獲得真正用戶組 ID 等。
(7) 進程暫停(pause)。
可用此系統調用將調用進程掛起,直至它收到一個信號為止。
?
?
文件操縱
用于對文件進行操縱的系統調用是數量最多的一類系統調用,其中包括創建文件、打開文件、關閉文件、讀文件及寫文件等二十多條。
(1) 創建文件(creat)。
系統調用 creat 的功能是根據用戶提供的文件名和許可權方式,來創建一個新文件或重寫一個已存文件。如果系統中不存在指名文件,核心便以給定的文件名和許可權方式來創建一個新文件;如果系統中已有同名文件,核心便釋放其已有的數據塊。創建后的文件隨即被打開,并返回其文件描述符 fd。若 creat 執行失敗,便返回“-1”。
(2) 打開文件(open)。
open 的功能是把有關的文件屬性從磁盤拷貝到內存中,以及在用戶和指名文件之間建立一條快捷的通路,并給用戶返回一個文件描述符 fd。文件被打開后,用戶對文件的任何操作都只須使用 fd 而非路徑名。
?
(3) 關閉文件(close)。
在 UNIX 系統中,由于允許一個文件被多個進程所共享,故只有在無其他任何進程需要此文件時,才能真正關閉該文件。
(4) 讀和寫文件 read 和 write。
僅當用戶利用 open 打開指定文件后,方可調用 read 或write 對文件執行讀或寫操作。兩個系統調用都要求用戶提供三個輸入參數:
- ① 文件描述符fd。
- ② buf 緩沖區首址。對讀而言,這是用戶所要求的信息傳送的目標地址;對寫而言,這則是信息傳送的源地址。
- ③ 用戶要求傳送的字節數 n byte。
系統調用 read 的功能是試圖從 fd 所指示的文件中去讀入 n byte 個字節的數據,并將它們送至由指針 buf 所指示的緩沖區中;系統調用 write 的功能是試圖把 n byte 個字節數據,從指針 buf 所指示的緩沖區中寫到由 fd 所指向的文件中。
(5) 連接和去連接(link 和 unlink)。
為了實現文件共享,必須記住所有共享該文件的用戶數目。為此,在該文件的索引結點中設置了一個連接計數 link。每當有一用戶要共享某文件時,須利用系統調用 link 來建立該用戶(進程)與此文件之間的連接,并對 i.link 做加 1操作。當用戶不再使用此文件時,應利用系統調用 unlink 去斷開此連接,亦即做 i.link 的減1 操作。當 i.link 減 1 后結果為 0 時,表示已無用戶需要此文件,此時才能將該文件從文件系統中刪除。故在 UNIX 系統中并無一條刪除文件的系統調用。
?
?
進程間的通信
為了實現進程間的通信,在 UNIX 系統中提供了一個用于進程間通信的軟件包,簡稱IPC。它由消息機制、共享存儲器機制和信號量機制三部分組成。在每一種通信機制中,都提供了相應的系統調用供用戶程序進行進程間的同步與通信之用。
(1) 消息機制。
用戶(進程)在利用消息機制進行通信時,必須先利用 msgget 系統調用來建立一個消息隊列。若成功,便返回消息隊列描述符 msgid,以后用戶便可利用 msgid 去訪問該消息隊列。用戶(進程)可利用發送消息的系統調用 msgsend 向用戶指定的消息隊列發送消息;利用 msgrcv 系統調用從指定的消息隊列中接收指定類型的消息。
(2) 共享存儲器機制。
當用戶(進程)要利用共享存儲器機制進行通信時,必須先利用shmget 系統調用來建立一個共享存儲區,若成功,便返回該共享存儲區描述符 shmid。以后,用戶便可利用 shmid 去訪問該共享存儲區。進程在建立了共享存儲區之后,還必須再利用shmat 將該共享存儲區連接到本進程的虛地址空間上。以后,在進程之間便可利用該共享存儲區進行通信。當進程不再需要該共享存儲區時,可利用 shmdt 系統調用來拆除進程與共享存儲區間的連接。
(3) 信號量機制。
在 UNIX 系統中所采用的信號量機制,允許將一組信號量形成一個信號量集,并對這組信號量施以原子操作。
?
?
信息維護
?
在 UNIX 系統中,設置了許多條用于系統維護的系統調用。
(1) 設置和獲得時間。
超級用戶可利用設置時間的系統調用(stime),來設置系統的日期和時間。如果調用進程并非超級用戶,則 stime 失敗。一般用戶可利用獲得時間的系統調用time 來獲得當前的日期和時間。
(2) 獲得進程和子進程時間(times)。
利用該系統調用可獲得進程及其子進程所使用的CPU 時間,其中包括調用進程在用戶空間執行指令所花費的時間,系統為調用進程所花費的 CPU 時間、子進程在用戶空間所用的 CPU 時間、系統為各子進程所花費的 CPU 時間等,并可將這些時間填寫到一個指定的緩沖區。
(3) 設置文件訪問和修改時間(utime)。
該系統調用用于設置指名文件被訪問和修改的時間。如果該系統調用的參數 times 為 NULL 時,文件主和對該文件具有寫權限的用戶,可將對該文件的訪問和修改時間設置為當前時間;如果 times 不為 NULL,則把 times 解釋為指向 utim buf 結構的指針,此時,文件主和超級用戶能將訪問時間和修改時間置入 utim buf結構中。
(4) 獲得當前 UNIX 系統的名稱(uname)。
利用該系統調用可將有關 UNIX 系統的信息存儲在 utsname 結構中。 這些信息包括 UNIX 系統名稱的字符串、系統在網絡中的名稱、 硬件的標準名稱等。
?
?
總結
- 上一篇: [C++]美国地图着色问题C++实现
- 下一篇: 高中学生计算机软件,基于智慧课堂的高中生