国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

一篇看懂系統(tǒng)調用和庫函數(shù)及API的區(qū)別

2022-09-26 13:43 作者:補給站Linux內核  | 我要投稿

在寫程序的過程中,像MFC,VC++這些編程,都會涉及到函數(shù)的調用,有庫函數(shù)也有系統(tǒng)函數(shù),下面看一看它們的區(qū)別!!


系統(tǒng)調用(system call)和庫函數(shù)調用(Library function call)的區(qū)別? ? 理解庫函數(shù)的區(qū)別和系統(tǒng)調用,首先是kernel mode和user mode這兩個模式是這兩種函數(shù)工作時的空間不同。 ? 一、系統(tǒng)調用: ?系統(tǒng)調用實際上是指底層的一個調用,就是內核提供的、功能十分強大的一系列的函數(shù)。這些系統(tǒng)調用是在內核中實現(xiàn)的。是操作系統(tǒng)為用戶態(tài)運行的進程和硬件設備(如CPU、磁盤、打印機等)進行交互提供的一組接口,即就是設置在應用程序和硬件設備之間的一個接口層??梢哉f是操作系統(tǒng)留給用戶程序的一個接口。 ? 例如linux內核是單內核,結構緊湊,執(zhí)行速度快,各個模塊之間是直接調用的關系。放眼整個linux系統(tǒng),從上到下依次是:用戶進程->系統(tǒng)調用接口->linux內核子系統(tǒng)->硬件。linux內核包括了系統(tǒng)調用接口和內核子系統(tǒng)兩部分。或者從下到上:物理硬件->OS內核->OS服務->應用程序。這里的OS起到了“承上啟下”的關鍵作用,向下管理物理硬件,向上為操作系統(tǒng)服務和應用程序提供接口,這里的接口就是系統(tǒng)調用了。操作系統(tǒng)提供的少部分系統(tǒng)調用都是由C和匯編混合編寫實現(xiàn)的,其接口用C來定義,具體實現(xiàn)則是匯編,這樣的好處是執(zhí)行效率高,而且極大的方便了上層的調用。 ? 在linux程序設計就是底層調用的意思,面向的是硬件。例如open,read,read等都是用于底層文件的訪問(low-level file access),例如在驅動程序中對文件的直接訪問;系統(tǒng)調用是操作系統(tǒng)相關的, 因此一般沒有跨操作系統(tǒng)的可移植性;系統(tǒng)調用發(fā)生在內核空間,因此如果用戶在用戶空間的一般應用程序中使用系統(tǒng)調用來 進行文件的操作, 會有用戶空間到內核空間的切換開銷。事實上,即使在用戶空間是用庫函數(shù)來對文件進行操作,必然會引起系統(tǒng)的調用, 因為文件總是存儲在介質上的,不管是讀還是寫,都是對硬件存儲器的操做,必然引起系統(tǒng)調用。例如C庫函數(shù)fwrite和fread就是通過read和write系統(tǒng)函數(shù)來實現(xiàn)的。這樣的話,使用庫函數(shù)也有系統(tǒng)調用的開銷,為什么不直接使用系統(tǒng)調用呢: 這是因為讀寫文件通常是大量的數(shù)據(jù)(這種大量是相對于底層驅動的系統(tǒng)調用所實現(xiàn)的數(shù)據(jù)操作單位而言),這時,使用庫函數(shù)就可以大大減少系統(tǒng)調用的次數(shù)(系統(tǒng)調用是一種中斷服務機制,需要提出申請占用CPU或某些資源來對硬件訪問與操做,如I/O操作,文件的讀取更新等)。這一結果又緣于緩沖區(qū)技術。在用戶空間和內核空間,對文件操作都使用了緩沖區(qū),例如用fwrite寫文件,都是先將內容寫到用戶空間緩沖區(qū),當用戶空間緩沖區(qū)滿或者寫操作結束時,才將用戶緩沖區(qū)的內容寫到內核緩沖區(qū),同樣的道理,當內核緩沖區(qū)滿或寫結束時才將內核緩沖區(qū)內容寫到文件對應的硬件媒介。


【文章福利】小編推薦自己的Linux內核技術交流群:【891587639】整理了一些個人覺得比較好的學習書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)? ? ?




二、 庫函數(shù):

顧名思義是把函數(shù)放到庫里,是把一些常用到的函數(shù)編完放到一個文件里,供別人用。別人用的時候把所在的文件名用#include<>加到里面就可以了,一般放到lib文件里。庫函數(shù)一般分為兩類:一種是C語言標準規(guī)定的庫函數(shù),一類是編譯器特定的庫函數(shù)。libc就是一個C標準庫,里面放著一些基本的函數(shù),這些函數(shù)都被標準化了。


庫函數(shù)調用通常用于應用程序中對一般文件的訪問,庫函數(shù)調用是系統(tǒng)無關的,因此移植性好。 ? 庫函數(shù)主要由兩方面提供:一是操作系統(tǒng)提供的;另一類是由第三方提供的。 ? 系統(tǒng)提供的這些函數(shù)把系統(tǒng)調用進行封裝或者組合,可以實現(xiàn)更多的功能,這樣的庫函數(shù)能夠實現(xiàn)一些對于內核來說比較復雜的操作。比如read函數(shù)根據(jù)參數(shù),直接就能讀文件,而背后隱藏的文件比如在那個磁道,那個扇區(qū),加載到那個內存,是程序員不必關心的問題。這些操作里面也包含了系統(tǒng)調用。 ? 對于第三方庫,其實和系統(tǒng)庫一樣,只是他直接利用系統(tǒng)調用的可能性要小一些,而是系統(tǒng)提供的API接口來是實現(xiàn)(API接口是開放的)。比如printf和getchar這樣,他們都是一個“外殼”,真正實現(xiàn)的不是它們本身,而是調用了別的函數(shù)。 ? 如printf的實現(xiàn)最終還是調用了putc()和user.h中的write()這樣的系統(tǒng)調用,而另一些則不會使用系統(tǒng)調用,比如strlen,strcat,memcpy等;庫函數(shù)大部分是對系統(tǒng)函數(shù)的封裝(不絕對),這個世界上很少有絕對的事兒,例如世間一切的長度和質量等數(shù)字問題都不是絕對準確的,只是一個-----約等于。 ?三、系統(tǒng)調用和庫函數(shù)之間的聯(lián)系與區(qū)別: ? 事實上,系統(tǒng)調用所提供給用戶的是直接而純碎的高級服務,如果想要更加人性化,具有更符合特定情況的功能,那么就要我們用戶自己定義,因此衍生了庫函數(shù),它把部分系統(tǒng)調用包裝起來。比如當我們要用C語言打印一句話的時候,如果沒有用到庫函數(shù)printf,那么我們就需要自己實現(xiàn)就需要調用putc()和write()等這樣一些系統(tǒng)函數(shù)。顯得比較麻煩,所以系統(tǒng)調用是為了方便使用操作系統(tǒng)的接口,而庫函數(shù)則是為了人們編程的方便。 ? 庫函數(shù)的調用是語言或者應用程序的一部分,而系統(tǒng)調用則是操作系統(tǒng)的一部分。 ? 系統(tǒng)調用是應用程序與內核交互的接口。人們在長期的編程中發(fā)現(xiàn)使用系統(tǒng)函數(shù)有個重大的缺點,那就是程序的移植性。例如linux提供的系統(tǒng)調用的函數(shù)和windows就不一樣。但是大部分的系統(tǒng)調用函數(shù)的速度庫函數(shù)調用的速度要快。


庫函數(shù)調用則是面向應用開發(fā)的,相當于應用程序的api,采用這樣的方式有很多原因: (1):雙緩沖技術; (2):移植性; (3):底層調用本身存在的一些缺陷; (4):讓api也可以有了級別和專門的工作面向; 問題一:API和系統(tǒng)調用的區(qū)別? API(Application Programming Interface),win32API也就是MicrosoftWindows32位平臺的應用程序編程接口。windows規(guī)定一切的應用程序優(yōu)先級為3,為windows自己的為0(0最高,3最低)。windows不允許應用程序直接訪問硬件,但是會提供API函數(shù)讓用戶間接地訪問,這樣就會調用系統(tǒng)級API。平時出現(xiàn)的“...非法操作”就是因為應用程序非法訪問硬件造成的。 API分為兩種:


第一:用戶級API;替用戶寫好函數(shù),方便調用,使程序員可以將焦點放在設計程序邏輯上面,而不必再編寫繁瑣、重復的程序,不必關注技術的細節(jié)。例如VC++,MFC,VB等都是類庫和各種控件,它代替了API的神秘功能。 ? 第二:系統(tǒng)級API;如果應用程序想要和硬件交互,必須調用此類函數(shù)。程序員調用的是API(api函數(shù)),然后通過與系統(tǒng)調用共同完成函數(shù)的功能。因此,API是一個提供給應用程序的接口,一組函數(shù),是與程序猿直接進行交互的。系統(tǒng)調用則不與程序員進行交互,它是根據(jù)API函數(shù),通過一個軟件中斷機制向內核提交請求(trap指令類似于一個系統(tǒng)中斷,系統(tǒng)也會有一個特殊的中斷處理函數(shù)(interrupt handler)來處理用戶的請求),以獲得內核服務的接口。并不是所有的API函數(shù)都一一對應一個系統(tǒng)的調用,有時,一個API函數(shù)會需要幾個系統(tǒng)調用共同來完成函數(shù)的功能,甚至一些API函數(shù)不需要調用相應的系統(tǒng)調用,不需要內核提供的服務。


問題二:什么是 回調函數(shù)?


回調函數(shù)就是一個通過函數(shù)指針調用的函數(shù),使用回調函數(shù)實際上就是在調用某個函數(shù)(通常是API函數(shù))時,將自己的一個函數(shù)(這個函數(shù)為回調函數(shù))的地址作為參數(shù)傳遞給那個函數(shù)。也就是把需要執(zhí)行的代碼地址給系統(tǒng),系統(tǒng)在恰當?shù)臅r候執(zhí)行。這時你可以利用這個機會在回調函數(shù)中處理消息或完成一定的操作。類似于中斷處理機制,中斷在某方面使計算機變得智能! ? 系統(tǒng)回調函數(shù)必須是由系統(tǒng)調用,但是這個函數(shù)可以是用戶編寫的,完成相應的功能服務。




一篇看懂系統(tǒng)調用和庫函數(shù)及API的區(qū)別的評論 (共 條)

分享到微博請遵守國家法律
嘉祥县| 威远县| 南皮县| 托克托县| 墨江| 上杭县| 多伦县| 翁牛特旗| 肥城市| 德保县| 林芝县| 海城市| 广昌县| 福清市| 辽阳县| 嘉峪关市| 濮阳县| 乌恰县| 崇明县| 阜康市| 新源县| 昌乐县| 特克斯县| 桓仁| 石景山区| 汉阴县| 鹤壁市| 手游| 阿勒泰市| 莆田市| 华坪县| 资中县| 永年县| 永靖县| 厦门市| 手机| 如皋市| 光山县| 晋宁县| 景德镇市| 曲阳县|