"點我查看秘籍連載" 操作系統的服務埠:系統調用 用戶進程工作在用戶態,它是受限的,很多涉及到硬體的操作都無法執行,但是它們又想要取得結果,就只能請求工作在內核態的操作系統幫助完成這些操作,並將操作結果交給用戶進程。 系統調用 (system call)就是操作系統提供給用戶進程請求操作系統做一些 ...
操作系統的服務埠:系統調用
用戶進程工作在用戶態,它是受限的,很多涉及到硬體的操作都無法執行,但是它們又想要取得結果,就只能請求工作在內核態的操作系統幫助完成這些操作,並將操作結果交給用戶進程。
系統調用(system call)就是操作系統提供給用戶進程請求操作系統做一些特權操作的介面,即為用戶進程提供服務的視窗。在Linux下可以通過man syscalls
命令查看Linux提供的所有系統調用。
理解系統調用其實很簡單,比如有一個程式想要讀取a.log文件(例如head -n 1 a.log
),讀取之前必須先打開文件,但是用戶進程是沒有許可權打開文件的,所以用戶進程只能發送一個open()的系統調用請求操作系統去幫忙打開這個文件,操作系統打開這個文件後會將打開的結果——文件描述符交給用戶進程,用戶進程通過這個文件描述符就能去操作這個文件。再進一步,用戶進程想要從這個打開的文件中讀取一行數據,用戶進程是沒有許可權讀取文件的,只能發送一個read()系統調用請求操作系統去讀取這一行數據,操作系統讀取這行數據後就能交給用戶進程。
不難發現,系統調用open()和read()都像是函數。其實它們確實都是函數,只不過是比較特殊的由操作系統提供的,一般是由彙編語言編寫或參雜了部分彙編代碼,因為它們要和硬體交互。
對於非C程式,其實本質還是一樣的。比如CPython,也有open()函數,它是對C庫函數open()的再次封裝。所以,在Python程式中調用open()方法打開文件,其實是調用C庫的open()函數,再通過open()庫函數發起系統調用請求操作系統打開文件,並將結果交給Python程式。
最後,結合前面介紹的中斷概念,描述下發起系統調用後的主要過程:
- 發起系統調用,請求操作系統幫忙執行某些操作,這會產生軟中斷;
- 軟中斷導致陷入內核,CPU控制權交給操作系統,操作系統處理中斷,即執行被請求的操作;
- 如果一切正常,操作系統在完成操作後會恢復到斷點處繼續向下執行,這會回到用戶態;
- 用戶進程取得操作系統操作的成果,繼續向下執行。