系统调用和库函数的区别
生活随笔
收集整理的這篇文章主要介紹了
系统调用和库函数的区别
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先,要說一下兩者的概念:
系統調用 :是操作系統為用戶態運行的進程和硬件設備(如CPU、磁盤、打印機等)進行交互提供的一組接口,即就是設置在應用程序和硬件設備之間的一個接口層。可以說是操作系統留給用戶程序的一個接口。再來說一下,linux內核是單內核,結構緊湊,執行速度快,各個模塊之間是直接調用的關系。放眼望整個linux系統,從上到下依次是用戶進程->linux內核->硬件。其中系統調用接口是位于Linux內核中的,如果再稍微細分一下的話,整個linux系統從上到下可以是:用戶進程->系統調用接口->linux內核子系統->硬件,也就是說Linux內核包括了系統調用接口和內核子系統兩部分;或者從下到上可以是:物理硬件->OS內核->OS服務->應用程序,其中操作系統起到“承上啟下”的關鍵作用,向下管理物理硬件,向上為操作系服務和應用程序提供接口,這里的接口就是系統調用了。
?????? 一般地,操作系統為了考慮實現的難度和管理的方便,它只提供一少部分的系統調用,這些系統調用一般都是由C和匯編混合編寫實現的 ,其接口用C來定義,而具體的實現則是匯編,這樣的好處就是執行效率高,而且,極大的方便了上層調用。
庫函數 :顧名思義是把函數放到庫里。是把一些常用到的函數編完放到一個文件里,供別人用。別人用的時候把它所在的文件名用#include<>加到里面就可以了。一般是放到lib文件里的。一般是指 編譯器 提供的可在c 源程序 中調用的函數。可分為兩類,一類是 c語言 標準規定的庫函數,一類是 編譯器 特定的庫函數。 (由于版權原因,庫函數的 源代碼 一般是不可見的,但在頭文件中你可以看到它對外的接口)
?????? libc中就是一個C標準庫,里面存放一些基本函數,這些基本函數都是被標準化了的,而且這些函數通常都是用匯編直接實現的。
??????? 庫函數一般可以概括的分為兩類,一類是隨著操作系統提供的,另一類是由第三方提供的。隨著系統提供的這些庫函數把系統調用進行封裝或者組合,可以實現更多的功能,這樣的庫函數能夠實現一些對內核來說比較復雜的操作。比如,read()函數根據參數,直接就能讀文件,而背后隱藏的比如文件在硬盤的哪個磁道,哪個扇區,加載到內存的哪個位置等等這些操作,程序員是不必關心的,這些操作里面自然也包含了系統調用。而對于第三方的庫,它其實和系統庫一樣,只是它直接利 用系統調用的可能性要小一些,而是利用系統提供的API接口來實現功能(API的接口是開放的) 。部分Libc庫中的函數的功能的實現還是借助了系統掉調用,比如printf的實現最終還是調用了write這樣的系統調用;而另一些則不會使用系統調用,比如strlen,?strcat,?memcpy等。
實時上,系統調用所提供給用戶的是直接而純粹的高級服務,如果想要更人性化,具有更符合特定情況的功能,那么就要我們用戶自己來定義,因此就衍生了庫函數,它把部分系統調用包裝起來,一方面把系統調用抽象了,一方面方便了用戶級的調用。系統調用和庫函數在執行的效果上很相似(當然庫函數會更符合需求),但是系統調用是運行于內核狀態;而庫函數由用戶調用,運行于用戶態。
系統調用是為了方便使用操作系統的接口,而庫函數則是為了人們編程的方便 。
系統調用 :是操作系統為用戶態運行的進程和硬件設備(如CPU、磁盤、打印機等)進行交互提供的一組接口,即就是設置在應用程序和硬件設備之間的一個接口層。可以說是操作系統留給用戶程序的一個接口。再來說一下,linux內核是單內核,結構緊湊,執行速度快,各個模塊之間是直接調用的關系。放眼望整個linux系統,從上到下依次是用戶進程->linux內核->硬件。其中系統調用接口是位于Linux內核中的,如果再稍微細分一下的話,整個linux系統從上到下可以是:用戶進程->系統調用接口->linux內核子系統->硬件,也就是說Linux內核包括了系統調用接口和內核子系統兩部分;或者從下到上可以是:物理硬件->OS內核->OS服務->應用程序,其中操作系統起到“承上啟下”的關鍵作用,向下管理物理硬件,向上為操作系服務和應用程序提供接口,這里的接口就是系統調用了。
?????? 一般地,操作系統為了考慮實現的難度和管理的方便,它只提供一少部分的系統調用,這些系統調用一般都是由C和匯編混合編寫實現的 ,其接口用C來定義,而具體的實現則是匯編,這樣的好處就是執行效率高,而且,極大的方便了上層調用。
庫函數 :顧名思義是把函數放到庫里。是把一些常用到的函數編完放到一個文件里,供別人用。別人用的時候把它所在的文件名用#include<>加到里面就可以了。一般是放到lib文件里的。一般是指 編譯器 提供的可在c 源程序 中調用的函數。可分為兩類,一類是 c語言 標準規定的庫函數,一類是 編譯器 特定的庫函數。 (由于版權原因,庫函數的 源代碼 一般是不可見的,但在頭文件中你可以看到它對外的接口)
?????? libc中就是一個C標準庫,里面存放一些基本函數,這些基本函數都是被標準化了的,而且這些函數通常都是用匯編直接實現的。
??????? 庫函數一般可以概括的分為兩類,一類是隨著操作系統提供的,另一類是由第三方提供的。隨著系統提供的這些庫函數把系統調用進行封裝或者組合,可以實現更多的功能,這樣的庫函數能夠實現一些對內核來說比較復雜的操作。比如,read()函數根據參數,直接就能讀文件,而背后隱藏的比如文件在硬盤的哪個磁道,哪個扇區,加載到內存的哪個位置等等這些操作,程序員是不必關心的,這些操作里面自然也包含了系統調用。而對于第三方的庫,它其實和系統庫一樣,只是它直接利 用系統調用的可能性要小一些,而是利用系統提供的API接口來實現功能(API的接口是開放的) 。部分Libc庫中的函數的功能的實現還是借助了系統掉調用,比如printf的實現最終還是調用了write這樣的系統調用;而另一些則不會使用系統調用,比如strlen,?strcat,?memcpy等。
實時上,系統調用所提供給用戶的是直接而純粹的高級服務,如果想要更人性化,具有更符合特定情況的功能,那么就要我們用戶自己來定義,因此就衍生了庫函數,它把部分系統調用包裝起來,一方面把系統調用抽象了,一方面方便了用戶級的調用。系統調用和庫函數在執行的效果上很相似(當然庫函數會更符合需求),但是系統調用是運行于內核狀態;而庫函數由用戶調用,運行于用戶態。
系統調用是為了方便使用操作系統的接口,而庫函數則是為了人們編程的方便 。
總結
以上是生活随笔為你收集整理的系统调用和库函数的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ros(5)service client
- 下一篇: MySQL Binlog增量同步工具go