操作系統中最基本的概念——庫調用和系統調用

 http://blog.csdn.net/clearriver/archive/2009/05/05/4152780.aspx

Unix操作系統設計上的陳述:

理解庫函數的區別和系統調用,首先要裏理解Unix的kernel mode和user mode。考慮下面的函數段:

int main()

{

    int fd = create("filename",0666);

    exit(0);
}

在執行main函數時,是在user mode下執行,當遇到create函數時,繼續在user mode下執行。然後系統將兩個參數"filenam"和"0666"壓入棧中或者某個寄存器,接着執行庫函數create。在庫函數create執行開始,系統仍然處在user mode下,接着系統將create系統調用的unique number壓入寄存器(比如說r0),然後執行指令trap(operating system trap)使系統進入kernel mode,並且處理系統調用。這時,系統意識到要進行系統調用的invoke,於是從寄存器r0中取出create系統調用的unique number,從系統調用表中查找得知要invoke的系統調用是create,然後執行。執行完畢後返回庫函數create的調用,庫函數負責檢查系統調用的執行情況(檢查某些寄存器的值),然後庫函數create根據檢查的結果返回相應的值。

在這裏,trap指令類似於一個系統中斷,而系統調用create是一個特殊的中斷處理函數(inerrupt handler)。

APUE上的陳述:

所有操作系統都提供多種服務的入口點,由此程序向系統核請求服務。各種版本的Unix都
提供經良好定義的有限數目的入口點,經過這些入口點進入系統核,這些入口點被稱之爲
系統調用(system call),系統調用是我們不能更改的一種Unix特徵。Unix版本7提供了約
50個系統調用,4 3+BSD提供了約110個,而SVR4則提供了約120個。

系統調用界面總是在Unix程序員手冊的第二部分中說明。其定義也包括在C語言中。這與很
多較早期的操作系統是不同的,這些系統按傳統都在機器的彙編語言中定義系統核入口點。

Unix所使用的技術是爲每條系統調用在標準C庫中設置一個具有同樣名字的函數。用戶進程
用標準C調用序列來調用這些函數,然後,函數用系統所要求的技術調用相應的系統核服務
。例如函數可將一個或幾個C參數送入通用寄存器,然後執行某個產生軟中斷進入系統核的
機器指令。從應用角度考慮,我們可將系統調用視作爲C函數。

Unix程序員手冊的第三部分定義了程序員可以使用的通用函數。雖然這些函數可能會調用
一個或幾個系統核的系統調用,但是它們並不是系統核的入口點。例如,printf函數會調
用write系統調用以進行輸出操作,但函數strcpy(複製一字符串)和atoi(變換ASCII爲整數
)並不使用任何系統調用。

從實施者的角度,系統調用和庫函數之間有重大區別,但從用戶角度其區別並不非常重要。
從本書的目的出發,系統調用和庫函數在本書中都以正常的C函數的形式出現。兩者都對應
用程序提供服務,但是,我們應當理解,如果希望的話,我們可以代換庫函數,但是通常
我們卻不能代換系統服務。

以存儲器分配函數malloc爲例。有多種方法可以進行存儲器分配及與其相關的無用區收集
操作(最佳適應,首次適應等),並不存在對所有程序都最佳的一種技術。Unix系統調用中
處理存儲器分配的是sbrk(2),它不是一個通用的存儲器管理器。它增加或減少指定字節數
的進程地址空間。如何管理該地址空間卻取決於進程。存儲器分配函數malloc(3)實現一
種特定類型的分配。如果我們不喜歡其操作方式,則我們可以定義自己的malloc函數,極
其可能,它還是要調用sbrk系統調用。事實上,有很多軟件包,它們實現自己的存儲器分
配算法,但仍使用sbrk系統調用。

從中可見,兩者職責不同,相互分開,要核中的系統調用分配另外一塊空間給進程,而庫
函數malloc則管理這種空間。

另一個可說明系統調用和庫函數之間的差別的例子是,Unix提供決定當前時間和日期的界
面。某些操作系統提供一個系統調用以返回時間,而另一個則返回日期。任何特殊的處理
,例如正常時制和日光節約時制之間的轉換,由系統核處理或要求人的幹予。Unix則不同
,它只提供一條系統調用,該系統調用返回國際標準時公元一九七年一月一日午夜來所以
經過的秒數。對該值的任何解釋,例如將其變換成人們可讀的,使用本地時區的時間和日
期,都留給用戶進程運行。在標準C庫中,提供了若干例程以處理大多數情況。這些庫函數
處理各種細節,例如各種日光節約時算法。

應用程序可以或者調用系統調用,或者庫函數,而很多庫函數則會調用系統調用。
另一個系統調用和庫函數之間的差別是:系統調用通常提供一種最小界面,而庫函數通常
提供比較複雜的功能。我們從sbrk系統調用和malloc庫函數之間的差別中看到了這一點,
在以後當比較不帶緩存的I/O庫數(第3章)以及標準I/O標準(在第5章)時,我們還將看到這
種差別。

進程控制系統調用(fork,exec和wait)通常由用戶的應用程序直接調用。(請回憶程序1.5中
的基本shell)但是爲了簡化某些常見的情況,UNIX系統也提供了一些庫函數;例如system
和popen。在8.12節中,我們將說明system函數的一種實現,它使用基本的進程控制系統調
用。在10.18中,我們還將強化這一實例以正確地處理信號。

爲使讀者瞭解大多數程序員應用的Unix系統界面,我們不得不既說明系統調用,只介紹某
些庫函數。例如若我們只說明sbrk系統調用,那麼就會忽略很多應用程序使用的malloc庫函數

在本書中,除了一定要將兩者相區分時,我們都將使用術語"函數"來涉及系統調用和庫函
數兩者。

 

 

http://blog.csdn.net/cugxueyu/archive/2008/02/25/2118490.aspx

簡明的回答是:函數庫調用是語言或應用程序的一部分,而系統調用是操作系統的一部分。你要確保弄懂“trap(自陷)”這個關鍵字的含義。系統調用是在操作系統內核發現一個“trap”或中斷後進行的。
 
※函數庫調用 VS 系統調用

 

函數庫調用

系統調用

在所有的ANSI C編譯器版本中,C庫函數是相同的

各個操作系統的系統調用是不同的

它調用函數庫中的一段程序(或函數)

它調用系統內核的服務

與用戶程序相聯繫

是操作系統的一個入口點

在用戶地址空間執行

在內核地址空間執行

它的運行時間屬於用戶時間

它的運行時間屬於系統時間

屬於過程調用,調用開銷較小

需要在用戶空間和內核上下文環境間切換,開銷較大

C函數庫libc中有大約300個函數

UNIX中大約有90個系統調用

典型的C函數庫調用:system fprintf malloc

典型的系統調用:chdir fork write brk

庫函數調用通常比行內展開的代碼慢,因爲它需要付出函數調用的開銷。但系統調用比庫函數調用還要慢很多,因爲它需要把上下文環境切換到內核模式。

發佈了38 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章