unix作業系統也是一種程式。由作業系統核心管理著作業系統的各種資源,如cpu、記憶體,網路、裝置、定時器、程序管理、程序間通訊等(socket也是一種系統資源,提供了多系統之間程序的通訊機制)。
作業系統和核心執行在系統空間,每個普通的使用者會單獨的給其分配對應的使用者空間,但使用者沒有許可權去直接呼叫系統資源,需要通過核心來呼叫。核心統一的管理著所有的系統資源,這樣才不會在乙個多使用者和很多程序的系統程式中搞亂資源的分配!
比如檔案的讀取,磁碟只可以被核心直接訪問,使用者程式想要讀取磁碟上的資料只能通過系統呼叫的方式(使用read函式)由核心來完成。read的**在核心中,所以每次read被呼叫的時候,**的執行許可權都會從使用者轉向核心,讀取完以後再從核心轉交給應用程式!
當執行系統呼叫的核心**read的時候,cpu需要超級使用者模式,需要一些特殊的堆疊和記憶體環境,必須在系統呼叫的時候建立好。read結束後,cpu再次切換為使用者模式,把堆疊和記憶體環境恢復成之前使用者程式的時候的狀態。檔案讀取的時候系統先用read把檔案從磁碟讀取的核心緩衝區(讀取磁碟的時候也是有緩衝的,為了提高磁碟的讀取效能),接著把檔案從核心緩衝區複製到使用者的程序緩衝區(從核心空間到使用者空間的乙個轉換)。
使用者**在呼叫的時候還可以人為的設定個緩衝區,比如讀取檔案的時候一次更多的讀取(比如比如一次讀取4096個位元組這種方式)可以減少這種不同的工作模式的切換,在read和write操作的時候合理的使用自己的緩衝區減少系統呼叫能夠大大的提公升程式執行的效率!
核心在從磁碟讀取檔案的時候為了提高io效率也會使用緩衝區的這種技術,叫做核心緩衝區,每次核心在從磁碟讀取的時候一次會讀取更多儲存在核心緩衝區,當使用者的程序需要從磁碟上的檔案中讀取資料的時候,首先是從核心緩衝區中讀取資料,當資料不夠讀取的時候核心再次從磁碟讀取資料到緩衝區。而且讀取的也不是只夠這次使用就行,而是讀取更多的資料再次儲存到核心緩衝區中。每次當程序要讀取的資料塊不在核心緩衝區中的時候,就把讀取相應的資料的請求加入到請求列表,然後掛起程序,接著處理其他程序服務。
read把資料從核心緩衝區複製到程序緩衝區,write把資料從程序緩衝區複製到核心緩衝區,但是並不是read的時候一定會核心從檔案讀取,同樣write的時候也未必核心會立即向檔案寫入。並不是所有的write操作都會觸發核心的寫入檔案的操作,核心會把資料放入核心緩衝區,當資料足夠多的時候再一次寫入到檔案上去。如果此時突然斷電可能就會導致核心的資料還未寫入到磁碟的情況發生。不過據說freebsd作業系統在檔案讀寫上是同步的,磁碟io效能也略低於其他的系統,這個就需要去了解freebsd的磁碟讀寫了。
繼續說系統呼叫,系統呼叫的時候其實就是一種狀態的切換,儲存當前堆疊和記憶體資訊然後掛起程序等待系統呼叫的返回結果,然後回來後恢復堆疊和記憶體然後繼續執行自己的**。
作業系統 Windows和UNIX系統呼叫示例
系統呼叫型別 windows unix 程序控制 createprocess fork 程序控制 exitprocess exit 程序控制 waitforsingleobject wait 檔案管理 createfile open 檔案管理 readfile read 檔案管理 writefile...
作業系統 系統呼叫
由作業系統提供的功能,通常應用程式本身是無法實現的。例如對檔案進行操作,應用程式必需通過系統呼叫才能做到,因為只有作業系統才具有直接管理外圍裝置的許可權。又如程序或執行緒間的同步互斥操作,也必需經由作業系統對核心變數進行維護才能完成。從下到上看乙個完整的計算機系統 物理硬體 os核心 os服務 應用...
登入 Unix 作業系統
上一節我們了解 unix 作業系統發展歷史,這一節我們來了解 unix 的啟動,如何優雅的登入和退出 unix。系統啟動 系統是指系統從關機狀態開始直到系統變為使用者可用狀態。首先引導程式查詢有哪些裝置 硬碟,光碟,優盤等 是可以引導的,然後選擇可以引導的裝置。接著引導程式將控制權轉移給核心,核心呼...