天天3分鐘操做系統修煉祕籍(5):系統調用

點我查看祕籍連載函數

操做系統的服務端口:系統調用

用戶進程工做在用戶態,它是受限的,不少涉及到硬件的操做都沒法執行,可是它們又想要取得結果,就只能請求工做在內核態的操做系統幫助完成這些操做,並將操做結果交給用戶進程。操作系統

系統調用(system call)就是操做系統提供給用戶進程請求操做系統作一些特權操做的接口,即爲用戶進程提供服務的窗口。在Linux下能夠經過man syscalls命令查看Linux提供的全部系統調用。code

理解系統調用其實很簡單,好比有一個程序想要讀取a.log文件(例如head -n 1 a.log),讀取以前必須先打開文件,可是用戶進程是沒有權限打開文件的,因此用戶進程只能發送一個open()的系統調用請求操做系統去幫忙打開這個文件,操做系統打開這個文件後會將打開的結果——文件描述符交給用戶進程,用戶進程經過這個文件描述符就能去操做這個文件。再進一步,用戶進程想要從這個打開的文件中讀取一行數據,用戶進程是沒有權限讀取文件的,只能發送一個read()系統調用請求操做系統去讀取這一行數據,操做系統讀取這行數據後就能交給用戶進程。blog

不難發現,系統調用open()和read()都像是函數。其實它們確實都是函數,只不過是比較特殊的由操做系統提供的,通常是由彙編語言編寫或參雜了部分彙編代碼,由於它們要和硬件交互。接口

對於非C程序,其實本質仍是同樣的。好比CPython,也有open()函數,它是對C庫函數open()的再次封裝。因此,在Python程序中調用open()方法打開文件,實際上是調用C庫的open()函數,再經過open()庫函數發起系統調用請求操做系統打開文件,並將結果交給Python程序。進程

最後,結合前面介紹的中斷概念,描述下發起系統調用後的主要過程:get

  1. 發起系統調用,請求操做系統幫忙執行某些操做,這會產生軟中斷;
  2. 軟中斷致使陷入內核,CPU控制權交給操做系統,操做系統處理中斷,即執行被請求的操做;
  3. 若是一切正常,操做系統在完成操做後會恢復到斷點處繼續向下執行,這會回到用戶態;
  4. 用戶進程取得操做系統操做的成果,繼續向下執行。
相關文章
相關標籤/搜索