如何高效執行linux系統呼叫
linux的執行環境=核心空間+使用者空間
可以形象的把我們的整個linux執行環境想象成現實中的銀行,銀行的工作人員是核心空間,而使用者空間就是我們小老百姓,中間的視窗是為了實現我們和銀行工作人員進行交流進行業務辦理,那麼為什麼我們要有個隔板呢?那也是為了讓銀行的內部空間(資料)更加的安全。
系統呼叫就是我們的銀行視窗把你想要幹的事傳達給銀行的工作人員他再幫你完成
從系統的安全考慮如果我們自己可以隨意訪問核心的一些資料或者內部結構的話,有時候自己都不知道自己在搞什麼可能一不小心就會把系統搞崩,有了一些特殊的通道這也保證的系統的安全。
從可移植性考慮,如果我們直接訪問底層的一些硬體編寫一些程式,那麼以後我們如果要在另一台機器上執行該程式但硬體不一樣怎麼辦?我們難道還要重新對相應模組進行程式的改動。
軟體中斷: 它是通過軟體指令觸發的中斷。linux系統核心響應軟體中斷,從使用者態切換到核心態,執行相應的系統呼叫。
系統呼叫控制程式執行軟體中斷的過程如下:
系統呼叫表:
核心維護系統呼叫表,儲存系統呼叫函式的起始位址,系統呼叫號對應系統呼叫在呼叫表中的偏移量。
可以理解成我們呼叫glibc函式時進行系統呼叫,會先轉成syscall再與核心進行交流**成syscall得到系統呼叫號再與系統呼叫表進行偏移得到api進行的系統呼叫操作)
例項:
#include
#include
#include
#include
intmain()
函式原型: long int syscall (long int sysno, …)
傳參說明:
sysno 是系統呼叫號,唯一標識系統呼叫號,詳見 sys/syscall.h
... 為剩餘可變長的引數,為系統呼叫所帶的引數,根據系統呼叫的不同,可帶0~5個不等的引數,
如果超過特定系統呼叫能帶的引數,多餘的引數被忽略。
返回值:
該函式返回值為特定系統呼叫的返回值,在系統呼叫成功之後你可以將該返回值轉化為特定的型別,如果系統呼叫失敗則返回 -1,錯誤**存放在 errno 中。
返回值為long int 是為了能夠適用更多的型別,有時候系統呼叫完返回的是檔案控制代碼,也有的是返回位址(char*),這都是根據系統呼叫的需要)
例項:
#include
頻繁使用底層系統呼叫會影響程式的執行效率!
罪魁禍首 - 使用者態和核心態的切換
能使用glibc中的函式就用glibc的函式,記那個syscall的函式還是有點累
如果在有機會的情況下能盡量少用系統呼叫就少用(比如要把乙個資料寫入乙個大檔案中,可以一次寫256位元組就別一次就寫16位元組,這樣就要多用了幾次系統呼叫)
Linux系統呼叫及示例
學習linux系統呼叫時先明確乙個概念 一般情況下,應用程式通過應用程式設計介面api而不是直接通過系統呼叫來程式設計 應用程式設計介面api與系統呼叫的關係如下 應用程式程式設計介面實際上並不需要和核心提供的系統呼叫對應 1 乙個api可以實現成乙個系統呼叫 2 乙個api可以通過呼叫多個系統呼叫...
系統效能提公升 AHCI
最近總是感覺自己的電腦越來越慢。於是想優化一下,可是普通的軟體優化已經達到了極限,精簡系統又不是我的風格。於是開始像硬體方面去找找問題。於是發現了個好東西 ahci。ahci serial ata advanced host controller inte ce 序列ata高階主控介面 高階主機控制...
linux效能提公升方法(整理)
1.通過 ulimit 改善系統效能 如何通過最簡單的設定來實現最有效的效能調優,如何在有限資源的條件下保證程式的運作,ulimit 是我們在處理這些問題時,經常使用的一種簡單手段。ulimit 是一種 linux 系統的內鍵功能,它具有一套引數集,用於為由它生成的 shell 程序及其子程序的資源...