系統呼叫和庫函式

2021-08-26 12:08:37 字數 2883 閱讀 6538

系統呼叫概述:

系統呼叫,我們可以理解是作業系統為使用者提供的一系列操作的介面(api),這些介面提供了對系統硬體裝置功能的操作。這麼說可能會比較抽象,舉個例子,我們最熟悉的 hello world 程式會在螢幕上列印出資訊。程式中呼叫了 printf() 函式,而庫函式 printf 本質上是呼叫了系統呼叫 write() 函式,實現了終端資訊的列印功能。

使用者應用程式訪問並使用核心所提供的各種服務的途徑即是系統呼叫。在核心和使用者應用程式相交界的地方,核心提供了一組系統呼叫介面,通過這組介面,應用程式可以訪問系統硬體和各種作業系統資源。

系統呼叫可以理解為核心提供給我們在使用者態用的介面函式,可以認為是某種核心的庫函式。

核心提供的這組系統呼叫通常也被稱之為系統呼叫介面層。系統呼叫介面層作為核心和使用者應用程式之間的中間層,扮演了乙個橋梁,或者說中間人的角色。系統呼叫把應用程式的請求傳達給核心,待核心處理完請求後再將處理結果返回給應用程式。

系統呼叫雖然是核心和使用者應用程式之間的溝通橋梁,是使用者應用程式訪問核心的入口點,但通常情況下,應用程式是通過作業系統提供的應用程式設計介面(api)而不是直接通過系統呼叫來程式設計。

作業系統api通常都以c庫的方式提供,linux也是如此。c庫提供了posix的絕大部分api,同時,核心提供的每個系統呼叫在c庫中都具有相應的封裝函式。系統呼叫與其c庫封裝函式的名稱常常相同,比如,read系統呼叫在c庫中的封裝函式即為read函式。

很多c函式庫中的函式名與系統呼叫的名稱一樣是因為該函式本身其實就是呼叫的系統呼叫,放到c函式庫就是為了使用者態的使用

寫程式直接使用的是庫函式,而庫函式內部可能就是呼叫的同名系統呼叫

首先,現在的os核心主要採用兩種模式,整體的單核心模式(linux)和分層的微核心模式(windows)。單核心

模式的特點就是**緊湊,執行速度快,各個模組之間是直接的呼叫關係,可以說最後一點既是優點,也是缺

點…有點就是執行速度快,缺點是核心看起來很亂,維護起來困難。

無論是單核心,還是微核心,立體的體系結構從下到上大概都是分成這樣幾層:物理硬體,os核心,os服務,

應用程式。這四層結構中,os核心起到乙個「承上啟下」的作用,向下管理物理硬體;向上為os服務和應用程式

提供介面。主意,這裡的介面實際上是指系統呼叫(system call)。

通常os核心為了考慮實現起來的難度和易於管理,只提供少部分必要的系統呼叫,這些系統呼叫通常都是c和

彙編混編來實現的。介面用c定義,實現體用彙編來寫。這樣做的好處是,執行效率高,並且極大的方便了上層的

呼叫。再說庫函式(即api)。庫函式可以概括的分為兩類,一類是隨os提供的,另一類是第三方的。隨系統提供的庫

函式進一步封裝或組合系統呼叫,實現更多的功能,就像用c語言的許多功能單一的小函式來實現很多很多個功能

複雜的大函式一樣。這樣的api能夠執行一些相對核心來說很複雜的操作,比如,read()函式根據引數,直接就

能讀檔案,而背後隱藏的比如檔案在硬碟的哪個磁軌,哪個扇區,載入到記憶體的哪個位置等等這些操作,程式設計師

是不必關心的,這些操作裡面自然也包含了系統呼叫。而對於第三方的庫,它其實和系統庫一樣,只是它直接利

用系統呼叫的可能性要小一些,而是利用系統提供的api介面來實現功能。(api的介面是開放的)

庫函式概述

庫函式可以理解為是對系統呼叫的一層封裝。系統呼叫作為核心提供給使用者程式的介面,它的執行效率是比較高效而精簡的,但有時我們需要對獲取的資訊進行更複雜的處理,或更人性化的需要,我們把這些處理過程封裝成乙個函式再提供給程式設計師,更方便於程式猿編碼。

庫函式有可能包含有乙個系統呼叫,有可能有好幾個系統呼叫,當然也有可能沒有系統呼叫,比如有些操作不需要涉及核心的功能。可以參考下圖來理解庫函式與系統呼叫的關係。

庫函式和作業系統的關係

函式庫呼叫是語言或應用程式的一部分,而系統呼叫是作業系統的一部分

所有 c 函式庫是相同的,而各個作業系統的系統呼叫是不同的。

函式庫呼叫是呼叫函式庫中的乙個程式,而系統呼叫是呼叫系統核心的服務。

函式庫呼叫是與使用者程式相聯絡,而系統呼叫是作業系統的乙個進入點

函式庫呼叫是在使用者位址空間執行,而系統呼叫是在核心位址空間執行

函式庫呼叫的執行時間屬於「使用者」時間,而系統呼叫的執行時間屬於「系統」時間

函式庫呼叫屬於過程呼叫,開銷較小,而系統呼叫需要切換到核心上下文環境然後切換回來,開銷較大

在c函式庫libc中大約 300 個程式,在 unix 中大約有 90 個系統呼叫

函式庫典型的 c 函式:system, fprintf, malloc,而典型的系統呼叫:chdir, fork, write, brk

庫函式呼叫大概花費時間為半微妙,而系統呼叫所需要的時間大約是庫函式呼叫的 70 倍(35微秒),因為系統呼叫會有核心上下文切換的開銷。純粹從效能上考慮,你應該盡可能地減少系統呼叫的數量,但是,你必須記住許多 c 函式庫中的程式通過系統呼叫來實現功能。

首先解釋,上述說明的庫函式效能遠高於系統呼叫的前提是,庫函式種沒有使用系統呼叫。再來解釋下某些包含系統呼叫的庫函式,然而其效能確實也要高於系統呼叫。比如上篇文章中關於檔案 io 函式 fread、fwrite、fputc、fgetc 等,這些函式通常情況下效能確實比系統呼叫高,原因在於這些庫函式使用了緩衝區,減少了系統呼叫的次數,因而顯得效能比較高。

系統呼叫

當乙個程序正在執行,遇到讀寫檔案操作,會發生乙個中斷,中斷後系統會把當前使用者程序的一些暫存器資訊儲存在核心堆疊中,接著去處理中斷服務程式,這裡是要去執行系統呼叫,linux 中通過執行 int $0x80 來執行系統呼叫的中斷,但核心實現了很多系統呼叫,這時需要傳遞「系統呼叫號」來指明需要哪個系統呼叫。

系統呼叫和庫函式

unix 環境高階程式設計 一書中如此說 所有作業系統都提供多種服務的入口點,由此程式向系統核請求服務。各種版本的unix都 提供經良好定義的有限數目的入口點,經過這些入口點進入系統核,這些入口點被稱之為 系統呼叫 system call 系統呼叫是我們不能更改的一種unix特徵。unix版本7提供...

系統呼叫和庫函式

在計算機中,系統呼叫 英語 system call 又稱為系統呼叫,指執行在使用者空間的程式向作業系統核心請求需要更高許可權執行的服務。系統呼叫提供了使用者程式與作業系統之間的介面。大多數系統互動式操作需求在核心態執行。如裝置io操作或者程序間通訊。庫函式是在系統呼叫上的一層包裝,執行在使用者態 u...

系統呼叫和庫函式

這一部分主要是為了使用者能夠方便的和作業系統互動,由此作業系統提供了使用者介面,讓使用者或者開發人員通過這些介面方便的與系統進行互動。使用者介面分為三部分 命令介面 windows中為cmd命令列,linux中為terminal,使用者可以通過執行命令完成相應的任務 程式介面 系統程式是取得作業系統...