一步一步學linux操作系統: 02 linux操作系統的幾個系統調用

立項服務與進程管理

需要項目就需要立項,對應的就是創建進程

創建進程的系統調用叫fork。老進程爲父進程,fork返回值爲子進程的進程號;新進程爲子進程,fork返回0。

當父進程調用 fork 創建進程的時候,子進程將各個子系統爲父進程創建的數據結構也全部拷貝了一份,甚至連程序代碼也是拷貝過來的。先拷貝,再修改”的策略
圖片來自極客時間趣談linux操作系統
如果是子進程,通過另一個系統調用execve來執行另一個程序。

作爲一個外包公司老闆,當公司剛起步的時候,沒有下屬,只好自己上了。先建立項目運行體系,等後面再做項目的時候,就都按這個來。對於操作系統也一樣,啓動的時候先創建一個所有用戶進程的“祖宗進程”。

父進程可以通過系統調用waitpid傳入子進程號,從而知道子進程運行完了沒有,成功與否。

會議室管理與內存管理

項目啓動之後,每個項目組都感覺自己有獨立的辦公空間。在操作系統中,每個進程都有自己的內存,互相之間不干擾,有獨立的進程內存空間

進程內存空間:代碼段(Code Segment)數據段(Data Segment)
代碼段存放程序代碼,數據段存放進程運行中產生的數據(eg: 堆、棧)

一個進程的內存空間是很大的,32 位的是 4G,64 位的就更大了,我們不可能有這麼多物理內存。
只有進程要去使用部分內存的時候,纔會使用內存管理的系統調用來登記,希望分配一部分內存給它,但是隻有真的寫入數據的時候,發現沒有對應物理內存,纔會觸發一箇中斷,現分配物理內存。

堆裏面分配內存的系統調用,brkmmap

  • brk,當分配的內存數量比較小會和原來的堆的數據連在一起
  • mmap,分配的內存數量比較大,會重新劃分一塊區域

檔案庫管理與文件管理

項目執行計劃書要保存在檔案庫裏,有一些需要長時間保存,同樣,程序、文檔、照片等,需要放在文件系統裏面。文件之所以能掉電保存,一方面是因爲介質,另一方面是因爲格式。

文件管理對於文件的操作,下面這六個系統調是最重要的

  • 已經有的文件,使用open打開這個文件,close關閉這個文件
  • 沒有的文件,可以使用creat創建文件;
  • 打開文件以後,可以使用lseek跳到文件的某個位置;
  • 對文件的內容進行讀寫,讀的系統調用是read,寫是write

Linux 裏有一個特點,那就是一切皆文件

  • 二進制文件、文本文件、stdout文件、管道、Socket、設備、文件夾、進程號等
  • 每個文件,Linux 都會分配一個文件描述符(File Descriptor)

項目異常處理與信號處理

在項目運行過程中,不一定都是一帆風順的,很可能遇到各種異常情況。同樣操作系統也會出現異常,這時系統會有相應的信號發出。

常見的信號有:

  • 中斷的信號 CTRL+C
  • 非法訪問內存
  • 硬件故障,設備出了問題
  • 用戶進程通過kill函數,將一個用戶信號發送給另一個進程

項目組間溝通與進程間通信

當某個項目比較大的時候,可能分成多個項目組,不同的項目組需要相互交流、相互配合才能完成,這就需要一個項目組之間的溝通機制。同樣的操作系統中不同的進程也需要通信

進程之間(項目組之間)的溝通方式:

  • 消息隊列(Message Queue)
    • 數據不是很長時
    • msgget創建一個新的隊列
    • msgsnd將消息發送到消息隊列
    • msgrcv從隊列中取消息
  • 共享內存
    • 交互的信息比較大的時候
    • shmget創建一個共享內存塊
    • shmat將共享內存映射到自己的內存空間,然後讀寫

兩個項目組共同訪問一個會議室裏的數據,就會存在“競爭”的問題。同樣的兩個進程訪問同一個數據時也存在“競爭”的問題。
信號量的機制 Semaphore。對於只允許一個人訪問的需求,我們可以將信號量設爲 1

  • sem_wait佔用這個信號量
  • sem_post將信號量釋放

公司間溝通與網絡通信

一臺 Linux 要和另一臺 Linux 交流,這時候,我們就需要用到網絡服務。

不同機器的通過網絡相互通信,要遵循相同的網絡協議,也即 TCP/IP 網絡協議棧

網絡服務是通過套接字 Socket 來提供服務的。

查看源代碼中的系統調用

https://www.kernel.org/ 下載Linux 內核源代碼

64 位操作系統, unistd_64.h 文件有對於系統調用的定義
我下載的是linux-4.13.16,路徑爲 arch\sh\include\uapi\asm\unistd_64.h

/*
 * include/asm-sh/unistd_64.h
 *
 * This file contains the system call numbers.
 *
 * Copyright (C) 2000, 2001  Paolo Alberelli
 * Copyright (C) 2003 - 2007 Paul Mundt
 * Copyright (C) 2004  Sean McGoogan
 *
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 */
#define __NR_restart_syscall	  0
#define __NR_exit		  1
#define __NR_fork		  2
#define __NR_read		  3
#define __NR_write		  4
#define __NR_open		  5
#define __NR_close		  6
#define __NR_waitpid	  7
#define __NR_creat		  8

......

中介與 Glibc

Glibc 爲程序員提供豐富的 API,除了例如字符串處理、數學運算等用戶態服務之外,最重要的是封裝了操作系統提供的系統服務,即系統調用的封裝。

圖片來自極客時間趣談linux操作系統

參考資料:

趣談Linux操作系統(極客時間)鏈接:
http://gk.link/a/10iXZ
歡迎大家來一起交流學習

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章