基礎概念
要想了解進程,我們先看一下什么是程序。
為了完成特定任務的一系列指令的有序集合
存儲在磁盤上
程序 : 代碼 + 數據
那么什么時進程呢?
進程:
程序的一次動態執行過程
每個程序都有自己的狀態
每個進程都有自己的虛擬地址空間
進程 : 代碼 + 數據 + 堆棧 + PCB
PCB (進程控制塊)
pid 進程標識符
pwd 進程標識符
ppid 父進程進程號
進程狀態的轉換
進程與內核的互交
創建一個進程的一般工作
1 、分配一個 PID 從小到大找一個未被使用的進程號 (0 - 32768 依機器而定 筆者為 ubuntu 18.04 64bit)
cat /proc/sys/kernel/pid_max 具體查看方式
0 號進程時內核進程,它創建 1 號進程、還將物理內存搬到磁盤 和 磁盤搬到物理內存
2 、分配PCB,拷貝父進程的 PCB的絕大部分數據
3 、給子進程分配資源
4 、 復制父進程地址空間
5 、 將子進程置成就緒狀態,放入就緒隊列
如何創建一個進程
pid_t fork( void ) ;
當返回 0 時 代表的是子進程 , 當返回 >0 時代表的是父進程
例:
#include <stdio.h> #include <unistd.h> #include <stdlib.h> int main() { printf("Before Fork\n"); pid_t pid = fork(); if (pid == 0) { printf("child\n"); } else if (pid > 0) { printf("parent\n"); } }
執行結果:
Before Fork
parent
child
為什么會打印兩個 ?不應該打印一個parent 或者是 child 嗎?
先是由父進程打印出 Before Fork ,運行到紅色箭頭處調用 fock 創建出一個子進程
該子進程也在紅色箭頭處運行,然后兩個進程獨立的運行,
父進程的fork() 返回 >0 的 數,打印出 parent ;
子進程 fork() 返回 0 ,打印出 child ;
打印的順序與系統的進程調度有關。
fork注意點:
1 、 fork 父子進程交替進行
2 、父進程死亡,子進程將變成孤兒進程,由 1號 進程領養