Linux系统调用及其效率
操作系統(tǒng)相關(guān)概念:
操作系統(tǒng)---管理計(jì)算機(jī)硬件與軟件資源的軟件,是用戶(hù)與系統(tǒng)操作交互的接口,為在它上面運(yùn)行的程序提供服務(wù)。
操作系統(tǒng)內(nèi)核 ----操作系統(tǒng)的核心。負(fù)責(zé)管理系統(tǒng)的進(jìn)程、內(nèi)核、設(shè)備驅(qū)動(dòng)程序。文件和網(wǎng)絡(luò)系統(tǒng),一套內(nèi)核不是一套完整的操作系統(tǒng),如Linux。
Linux操作系統(tǒng)---基于Linux內(nèi)核的操作系統(tǒng),通常由Linux內(nèi)核、Shell、文件系統(tǒng)和應(yīng)用程序。常見(jiàn)的有RetHat 、Fedora 、Centos 、Ubuntu和Andriod。
?
Linux的運(yùn)行空間:
Linux的運(yùn)行空間 = 內(nèi)核空間 + 用戶(hù)空間
內(nèi)核空間 ---存放的是整個(gè)內(nèi)核代碼和所有內(nèi)核模塊,以及內(nèi)核所維護(hù)的數(shù)據(jù)。
用戶(hù)空間---用戶(hù)程序的代碼和數(shù)據(jù)。
?
?
什么是系統(tǒng)調(diào)用?
操作系統(tǒng)提供給用戶(hù)程序調(diào)用的系統(tǒng)服務(wù)(硬件設(shè)備)的一組特殊的接口。
系統(tǒng)調(diào)用可以被看成是一個(gè)內(nèi)核與用戶(hù)空間程序交互的接口——他好比一個(gè)信使,把用戶(hù)進(jìn)程的請(qǐng)求傳達(dá)給內(nèi)核,
待內(nèi)核將請(qǐng)求處理完畢后,再將處理的結(jié)果送回給用戶(hù)空間。
?
?
系統(tǒng)調(diào)用的必要性:
1)把用戶(hù)從底層的硬件編程中解放出來(lái)
與具體的硬件完全隔離,用戶(hù)不需要面向具體的硬件編碼,降低了開(kāi)發(fā)的發(fā)雜性和難度。
2)極大的提高了系統(tǒng)的安全性與穩(wěn)定性
將用戶(hù)進(jìn)程隔離,實(shí)現(xiàn)內(nèi)核“保護(hù)”,用戶(hù)進(jìn)程不允許訪問(wèn)數(shù)據(jù),也無(wú)法使用內(nèi)核函數(shù),用戶(hù)訪問(wèn)內(nèi)核的路徑是事先定義好的,
? ? ? ?只能從規(guī)定位置進(jìn)入內(nèi)核,而不準(zhǔn)肆意跳入內(nèi)核,有了這樣限于內(nèi)核的統(tǒng)一訪問(wèn)方式才能保證內(nèi)核的安全無(wú)誤。
3)使用戶(hù)程序具有可移植性
不同平臺(tái),不同硬件。略略略。
?
-------------------------------------------------------------
系統(tǒng)調(diào)用的實(shí)現(xiàn):
簡(jiǎn)單的來(lái)講,系統(tǒng)調(diào)用實(shí)現(xiàn)所依靠的是軟件中斷。那么何為軟件中斷?
軟件中斷——他是通過(guò)軟件指令觸發(fā)的中斷,Linux系統(tǒng)內(nèi)核響應(yīng)軟件中斷,從用戶(hù)態(tài)切換到內(nèi)核態(tài)執(zhí)相應(yīng)的系統(tǒng)調(diào)用。中斷是
指計(jì)算機(jī)運(yùn)行過(guò)程中,出現(xiàn)某些意外情況需要主機(jī)干預(yù)時(shí),機(jī)器能夠自動(dòng)停止處理正在運(yùn)行的程序并轉(zhuǎn)入處理新情況的程序,處理完
畢后,有轉(zhuǎn)回被暫停的程序繼續(xù)執(zhí)行。
?
系統(tǒng)調(diào)用控制程序執(zhí)行軟件中斷的過(guò)程如下:
1)在進(jìn)程的內(nèi)核態(tài)堆棧中保存大多數(shù)寄存器的內(nèi)容(即保存恢復(fù)進(jìn)程到用戶(hù)態(tài)執(zhí)行所需要的上下文)
2)根據(jù)用戶(hù)態(tài)傳遞的系統(tǒng)調(diào)用號(hào),確定系統(tǒng)調(diào)用的執(zhí)行程序
3)調(diào)用相應(yīng)的執(zhí)行程序來(lái)處理系統(tǒng)調(diào)用
4)從系統(tǒng)調(diào)用返回(恢復(fù)用戶(hù)空間的程序運(yùn)行)
?
前面提到了系統(tǒng)調(diào)用號(hào),系統(tǒng)調(diào)用號(hào)是什么呢?
系統(tǒng)調(diào)用號(hào)——每一個(gè)系統(tǒng)調(diào)用被賦予一個(gè)系統(tǒng)調(diào)用號(hào),與具體的系統(tǒng)調(diào)用相關(guān)聯(lián)。
?系統(tǒng)調(diào)用表——內(nèi)核維護(hù)系統(tǒng)調(diào)用表,保存系統(tǒng)調(diào)用函數(shù)的起始地址,系統(tǒng)調(diào)用號(hào)對(duì)應(yīng)系統(tǒng)在系統(tǒng)調(diào)用中的偏移量。
?
執(zhí)行系統(tǒng)調(diào)用的方法:
一)glibc庫(kù)函數(shù)——glibc是Linux下使用的開(kāi)源標(biāo)準(zhǔn)C庫(kù),他是GUN發(fā)布的libc,即運(yùn)行時(shí)庫(kù)。
1)每個(gè)特定的系統(tǒng)調(diào)用對(duì)應(yīng)至少一個(gè)glibc封裝的庫(kù)函數(shù)
2)多個(gè)API有可能只對(duì)應(yīng)同一個(gè)系統(tǒng)調(diào)用
3)返回值-1在多數(shù)情況下表示內(nèi)核不能滿(mǎn)足進(jìn)程的請(qǐng)求
4)Libc中定義的errno變量包含特定的出錯(cuò)碼
GLIB庫(kù)函數(shù)實(shí)例
?
二)syscall調(diào)用——glibc提供的syscall函數(shù)直接調(diào)用。
函數(shù)原型:long int syscall(long int sysno, ...)
傳參說(shuō)明:sysno是系統(tǒng)調(diào)用號(hào),唯一標(biāo)識(shí)系統(tǒng)調(diào)用號(hào),詳見(jiàn)sys/syscall.h
...為剩余可變長(zhǎng)的參數(shù),為系統(tǒng)調(diào)用所帶的參數(shù),根據(jù)系統(tǒng)調(diào)用的不同,可帶0~5個(gè)不等的參數(shù),
如果超過(guò)特定系統(tǒng)調(diào)用所能帶的參數(shù),多余的參數(shù)被忽略。
返回值:該函數(shù)返回值為特定系統(tǒng)調(diào)用的返回值,在系統(tǒng)調(diào)用成功之后你可以將返回值轉(zhuǎn)化為特定的類(lèi)型,
如果系統(tǒng)調(diào)用失敗則返回-1,錯(cuò)誤代碼存放在errno中。
Syscall調(diào)用實(shí)例
?
Glibc調(diào)用與Syscall調(diào)用的對(duì)比
?
?
-----------------------如何高效的執(zhí)行Linux系統(tǒng)調(diào)用---------------------------
?
系統(tǒng)調(diào)用會(huì)影響效率?
頻繁使用底層的系統(tǒng)調(diào)用會(huì)影響程序的執(zhí)行效率!why? ——罪魁禍?zhǔn)住脩?hù)態(tài)和內(nèi)核態(tài)的切換。
1)保存用戶(hù)進(jìn)程現(xiàn)場(chǎng)
2)合法性檢查(如內(nèi)存)
3)參數(shù)傳遞
4)恢復(fù)現(xiàn)場(chǎng)
如何避免系統(tǒng)調(diào)用時(shí)的效率問(wèn)題?
1)多調(diào)用GLIBC庫(kù),如果GLIBC庫(kù)中能找到,就毫不猶豫的使用它。
2)盡可能少調(diào)用系統(tǒng)接口,能一次搞定的避免多次。
?
轉(zhuǎn)載于:https://www.cnblogs.com/wangkeqin/p/9201703.html
總結(jié)
以上是生活随笔為你收集整理的Linux系统调用及其效率的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Numpy_构建列向量
- 下一篇: linux sqlplus 密码有$