您好,登錄后才能下訂單哦!
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+進程名結束進程
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。