立項服務與進程管理
需要項目就需要立項,對應的就是創建進程
創建進程的系統調用叫fork。老進程爲父進程,fork返回值爲子進程的進程號;新進程爲子進程,fork返回0。
當父進程調用 fork 創建進程的時候,子進程將各個子系統爲父進程創建的數據結構也全部拷貝了一份,甚至連程序代碼也是拷貝過來的。先拷貝,再修改”的策略
如果是子進程,通過另一個系統調用execve來執行另一個程序。
作爲一個外包公司老闆,當公司剛起步的時候,沒有下屬,只好自己上了。先建立項目運行體系,等後面再做項目的時候,就都按這個來。對於操作系統也一樣,啓動的時候先創建一個所有用戶進程的“祖宗進程”。
父進程可以通過系統調用waitpid傳入子進程號,從而知道子進程運行完了沒有,成功與否。
會議室管理與內存管理
項目啓動之後,每個項目組都感覺自己有獨立的辦公空間。在操作系統中,每個進程都有自己的內存,互相之間不干擾,有獨立的進程內存空間。
進程內存空間:代碼段(Code Segment)、數據段(Data Segment)
代碼段存放程序代碼,數據段存放進程運行中產生的數據(eg: 堆、棧)
一個進程的內存空間是很大的,32 位的是 4G,64 位的就更大了,我們不可能有這麼多物理內存。
只有進程要去使用部分內存的時候,纔會使用內存管理的系統調用來登記,希望分配一部分內存給它,但是隻有真的寫入數據的時候,發現沒有對應物理內存,纔會觸發一箇中斷,現分配物理內存。
堆裏面分配內存的系統調用,brk和mmap。
- 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操作系統(極客時間)鏈接:
http://gk.link/a/10iXZ
歡迎大家來一起交流學習