LINUX系統編程之進程

LINUX系統編程之進程

一、操作系統職責:管理所有的資源,將不同的設備和不同的程序關聯起來。


二、系統調用是操作系統提供給用戶程序的一組特殊函數接口,用戶程序可以通過這組接口獲得系統內核提供的服務,例如:打開文件,關閉文件,讀寫文件。


三、POSIX(Portable Operation System interface)

Linux中,應用程序編程接口(API)遵循POSIX標準,用於保證應用程序可以在源代碼一級上在多種操作系統上移植運行。


四、系統調用按功能邏輯可分爲:進程控制、進程間通信、文件系統控制、系統控制、內存管理、網絡管理、socket控制、用戶管理。

通常用一個負的返回值表明錯誤,0值表明成功可用perror打印出錯信息


五、進程

程序:可執行文件(靜態),進程:程序的執行實例(動態)

進程的狀態:創建,調度,消亡

進程擁有自己的環境和資源

用exec函數將程序由內核讀入內存使其執行起來成爲一個進程


六、進程的生命週期

創建

調度

就緒態:已具備執行條件,等待分配CPU時間

執行態:正在佔用CPU

等待態:不具備某些執行條件,無法繼續執行

消亡


七、PCB(進程控制塊)

OS根據PCB對併發執行的進程進行控制和管理,系統在創建一個進程時會開闢一段內存空間存放與此進程相關的PCB數據結構

PCB中記錄了用於描述進程進展情況及控制進程運行所需的全部信息。

PCB是進程存在的唯一標誌,linux中PCB存放在task_struct結構體中,打開/include/linux/sched.h可以找到task_struct 的定義


八、進程控制

進程號0~32767   0號調度進程   1號init進程

除調度進程外,所有進程都是由init進程直接或間接創建的

PID進程號getpid()   PPID父進程號getppid()  PGID進程組號getpgid()


九、文件描述符:以進程爲單位分配0-1023最小可用的描述符


十、進程狀態轉換

CPU調度算法:優先級,先來先調度,短時間優先,時間片輪轉

umask掩碼,屏蔽文件權限

ps命令查看當前進程


十一、創建進程 fork()  vfork()

1.fork()在子進程中返回0,在父進程中返回值大於0,調用fork()以後,源程序被複制了一份,兩份程序中只有fork()返回值不一樣,兩份程序同時執行,順序不定,父子進程物理地址不同,虛擬地址相同。

問:如果一個程序同時執行了三個fork(),它創建了幾個進程

fork();1(0)

fork();2(0) 3(1)

fork();4(0) 5(1) 6(2) 7(3)

第一次調用,0號進程創建了1號進程

第二次調用,0號進程創建了2號進程,1號進程創建了3號進程

第三次調用,0號進程創建了4號進程,1號進程創建了5號進程,2號進程創建了6號進程,3號進程創建了7號進程

一共創建了2的n次方減一個進程


2.vfork()一般配合exec使用,子進程共用父進程地址空間,保證子進程先運行,調用exec或exit後父進程再運行

exec函數族是進程替換函數,將新的地址空間賦給原來的進程,進程號不變,新程序從main開始運行

exec只有失敗才返回,exec後面的代碼不執行

但注意exec是一個函數族,有execlp,execvp,execle,execve等

只能用exit()結束子進程,而return是返回到函數執行的首地址

atexit(void (*function)(void))註冊退出處理函數



十二、輸入輸出緩衝區

系統調用無緩衝

標準IO庫函數輸入輸出爲行緩衝

標準IO庫操作文件爲全緩衝


十三、

殭屍進程:子進程結束而父進程未調用wait()或waitpid()回收其資源

孤兒進程:父進程結束而子進程未結束

守護進程:特殊的孤兒進程,脫離終端運行在後臺

wait()/waitpid():等待子進程結束並回收其資源

用ps查看進程,kill+pid或pkill+進程名結束進程


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