作業系統中的系統呼叫是什麼?
系統呼叫提供了程序和作業系統之間的介面。一般來說,系統呼叫以組合語言指令的形式提供。它們也包含在彙編級程式設計師使用的手冊中。當用戶模式下的程序需要訪問資源時,通常會進行系統呼叫。然後它請求核心透過系統呼叫提供資源。
下圖顯示了系統呼叫的執行過程:
從該圖可以看出,程序在使用者模式下正常執行,直到系統呼叫中斷它。然後,系統呼叫在核心模式下優先執行。系統呼叫執行完畢後,控制權返回使用者模式,可以恢復使用者程序的執行。
一般來說,在以下情況下需要系統呼叫:
- 如果檔案系統需要建立或刪除檔案。從檔案讀取和寫入也需要系統呼叫。
- 建立和管理新程序。
- 網路連線也需要系統呼叫。這包括髮送和接收資料包。
- 訪問硬體裝置(如印表機、掃描器等)需要系統呼叫。
系統呼叫的型別
主要有五種型別的系統呼叫。詳細解釋如下:
程序控制
這些系統呼叫處理程序,例如程序建立、程序終止等。
檔案管理
這些系統呼叫負責檔案操作,例如建立檔案、讀取檔案、寫入檔案等。
裝置管理
這些系統呼叫負責裝置操作,例如從裝置緩衝區讀取、寫入裝置緩衝區等。
資訊維護
這些系統呼叫處理資訊及其在作業系統和使用者程式之間的傳輸。
通訊
這些系統呼叫可用於程序間通訊。它們還處理建立和刪除通訊連線。
下面列出Windows和Unix中上述所有型別系統呼叫的示例:
| 系統呼叫的型別 | Windows | Linux |
|---|---|---|
| 程序控制 | CreateProcess() ExitProcess() WaitForSingleObject() | fork() exit() wait() |
| 檔案管理 | CreateFile() ReadFile() WriteFile() CloseHandle() | open() read() write() close() |
| 裝置管理 | SetConsoleMode() ReadConsole() WriteConsole() | ioctl() read() write() |
| 資訊維護 | GetCurrentProcessID() SetTimer() Sleep() | getpid() alarm() sleep() |
| 通訊 | CreatePipe() CreateFileMapping() MapViewOfFile() | pipe() shmget() mmap() |
如上所示,有很多不同的系統呼叫。其中一些系統呼叫的詳細資訊如下:
open()
open() 系統呼叫用於訪問檔案系統中的檔案。此係統呼叫為檔案分配資源,並提供程序用於引用檔案的控制代碼。多個程序可以同時開啟一個檔案,也可以限制為一個程序。這完全取決於檔案組織和檔案系統。
read()
read() 系統呼叫用於訪問儲存在檔案系統中的檔案資料。要讀取的檔案可以透過其檔案描述符標識,並且應該在讀取之前使用 open() 開啟。一般來說,read() 系統呼叫接受三個引數:檔案描述符、儲存讀取資料的緩衝區和要從檔案中讀取的位元組數。
write()
write() 系統呼叫將資料從使用者緩衝區寫入裝置(例如檔案)。此係統呼叫是從程式輸出資料的方法之一。一般來說,write 系統呼叫接受三個引數:檔案描述符、儲存資料的緩衝區的指標以及要從緩衝區寫入的位元組數。
close()
close() 系統呼叫用於終止對檔案系統的訪問。使用此係統呼叫意味著程式不再需要該檔案,因此緩衝區將被重新整理,檔案元資料將被更新,並且檔案資源將被釋放。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP