Linux庫函式與系統呼叫的區別

2021-08-21 20:16:51 字數 1402 閱讀 9026

**

一、系統呼叫

系統呼叫可以理解為作業系統為使用者提供的一系列操作介面(api),這些介面提供了對系統硬體裝置功能的操作。

例如:利用庫函式printf()在螢幕上列印資訊,程式中呼叫了printf()函式,而庫函式printf()呼叫了系統呼叫write()函式,實現了終端資訊列印功能。

二、庫函式

庫函式可以理解為對系統呼叫的的一層封裝。系統呼叫作為核心提供給使用者程式的介面,它的執行效率和功能是比較高效和精簡的。

但有時我們需要一些更複雜的功能,這時庫函式可能包含多個系統呼叫,把這些處理過程封裝成乙個函式再提供給程式設計師。更方便程式設計師編碼。

所以庫函式有可能包含乙個系統呼叫,有可能包含好幾個,也有可能沒有系統呼叫(比如有些操作不需要涉及核心的功能strcpy,strlen)

三、系統呼叫意義

總而言之:我們只需要把系統呼叫當作乙個核心提供給我們的操作介面。這個介面實現了一定的功能,並且系統呼叫是很安全的。

四、庫函式與系統呼叫的區別

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

庫函式呼叫大概花費時間為半微妙。而系統呼叫所需要的時間大約是庫函式呼叫的70倍(35微秒)因為系統呼叫會有核心上下文切換的開銷。所以盡可能的減少系統呼叫的數量,但是,許多c函式庫中的程式通過系統呼叫來實現。

五、正確理解庫函式高效於系統呼叫

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

六、系統呼叫是如何執行的

上述內容基本說清楚了庫函式與系統呼叫的概念以及它們之間的關係,下面我們來理解系統呼叫到底是如何執行的。

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

int main()

[linuxblogs@host ~]$ gcc a.c -oa && ./a

time: 2018-05-06 03:23:46

首先通過mov $0xd %%eax來將系統呼叫放入%eax暫存器中,time() 的系統呼叫號是 13,然後執行int $0x80系統就會去執行 time() 這個系統呼叫了。其實**中的彙編部分就是實現 time() 系統呼叫的功能,彙編**不懂沒關係(我也不太懂),這裡主要是為了說清楚系統呼叫的整個過程。

系統呼叫與庫函式呼叫

linux下對檔案操作有兩種方式 系統呼叫 system call 和庫函式呼叫 library functions 系統呼叫實際上就是指最底層的乙個呼叫,在linux程式設計裡面就是底層呼叫的意思。面向的是硬體。而庫函式呼叫則面向的是應用開發的,相當於應用程式的api,採用這樣的方式有很多種原因,...

庫函式與系統呼叫

系統呼叫 通常shell是通過系統呼叫將底層硬體功能向上層應用程式提供,linux的系統呼叫約有300多個 因為系統呼叫不考慮平台差異性,由核心直接提供,因此移植性較差。庫函式庫函式是由使用者或組織自己開發的,具有一定功能的函式集合 例如,如果使用者要讓音效卡發生,可能要呼叫好多個系統呼叫,而且系統...

系統呼叫與庫函式

大部分的i o軟體放在作業系統內部,但仍有一小部分在使用者層,其中包括與使用者程式鏈結在一起的庫函式,以及完全執行在核心之外的假離線系統 一方面,為使各個程序有條不紊地使用i o裝置,且能保護裝置的安全性,不允許在使用者態的應用程式去直接呼叫在核心態的os。但另一方面,應用程式在執行時,又必須取得o...