多任務(并發):讓系統具備同時處理多個任務的能力
1. 多進程
2. 多線程
3. 進程間通信
一、進程的基本概念
1. 什么是進程?
????????正在運行的程序,其運行過程中需要消耗內存和CPU。
????????進程的特點:
動態性:進程是程序運行的一次執行過程,有創建、運行、結束等生命周期。
獨立性:每一個進程擁有其獨立的內存空間和系統資源,相互之間一般不直接干擾。
并發性:操作系統可以同時運行多個進程,通過CPU調度實現。
2.程序和進程有什么區別?
程序(Program)
????????定義:是一組靜態的數據集合,存儲在硬盤空間,是計算機執行特定任務的代碼和數據的集合。
程序運行起來可以產生進程;
?一個程序可以產生多個進程
????????特點:靜態的:不運行時只是一堆代碼和數據,不占用系統資源(除了磁盤空間)。
????????????????可復用的:同一個程序可以被多次執行(例如多次打開同一個軟件)。
????????????????持久的:程序文件會長期保存在存儲設備中,直到被主動刪除。
進程(Process)
????????定義:進程是程序的一次動態執行過程,是操作系統進行資源分配和調度的基本單位。當程序被加載到內存中運行時,就成為了進程。
? ? ? ? 特點:動態性:進程是程序運行的一次執行過程,需要消耗內存和CPU,有創建、運行、結束等生命周期。
????????????????獨立性:每一個進程擁有其獨立的內存空間和系統資源,相互之間一般不直接干擾。
????????????????并發性:操作系統可以同時運行多個進程,通過CPU調度實現。
????????????????一個進程中也可執行多個程序
二、進程的產生
進程產生時,操作系統都會為其分配0-4G的虛擬內存空間。
三、進程的調度
CPU:數據處理速度快
宏觀并行,微觀串行
cpu調度算法
1、時間片輪詢算法
2、先來先服務,后來后服務(任務隊列)
3、短作業優先調度
4、高優先級先執行,低優先級后執行
四、進程的狀態
? ? ?操作系統進程進程三態圖:
Linux操作系統的進程狀態:
1.運行態(用戶運行態、內核運行態) ?? ?R
正在執行,且被CPU任務調度所執行的進程
2.就緒態?? ?R
正在執行,沒有CPU任務調度執行的進程(只缺少cpu)
3.可喚醒等待態?? ?S
也稱為睡眠態,阻塞等待資源的進程
4.不可喚醒等待態 D
不想被CPU任務調度所打斷的進程任務可以設置為不可喚醒等待態
5.暫停態?? ?T
被暫停執行的進程
6.僵尸態 ? ?Z
進程執行結束,空間沒有被回收
7.結束態 ? ?X
進程執行結束,空間被回收
五、進程的消亡
? ? 1. 進程執行結束(進程退出)
2. 回收進程資源空間
六、進程相關命令
PID:進程的ID號
PPID :父進程ID號
父進程:產生子進程的進程稱為父進程
子進程:父進程產生出來的新進程即為該父進程的子進程
1. ps ?-aux
查看進程相關參數:PID、狀態、CPU占有率、內存占有率
ps -aux | grep ./a.out
| ?: 管道 ?:前面命令的輸出作為后面命令的輸入
grep : 字符串查找:在輸入中查找和后面字符串相關的數據
2. top
動態查看進程的相關參數:CPU占有率、內存占有率
3. ps -ef
查看該進程的ID和父進程ID
4. pstree
查看進程的產生關系
pstree -p
查看進程的產生關系(有PID號)
? ? ? ? ?pstree -sp ?進程PID號
查看某個指定的進程的產生關系
5. kill -信號的編號/信號的名稱 ?PID
向進程發送信號,讓進程的狀態發生變化
kill -l
查看系統支持的信號
? ? ? ? 結束一個進程:
kill -9 PID
kill -SIGKILL PID
killall -9 ?進程名稱
? ? ? ? ?+前臺進程
后臺進程
jobs
查看當前終端的后臺進程
fg 后臺進程編號
讓后臺進程切換成前臺進程
七、進程相關編程
1.fork函數
需要的頭文件:#include <sys/types.h>????????#include <unistd.h>
函數原型:pid_t fork(void);
功能:復制當前進程(父進程),生成一個新進程(子進程)。
復制特性:
子進程完全拷貝父進程0-3G的虛擬內存空間,但兩者擁有獨立的地址空間,后續修改互不影響
子進程拷貝父進程PCB(進程控制塊)塊中的部分內容:PID不拷貝
返回值:
關鍵特點:調用一次,返回兩次:
父進程中,fork()返回子進程的進程ID(PID,非負整數)
子進程中,fork()返回0。
若創建失敗,父進程會返回-1。
執行順序:父進程和子進程的執行順序由操作系統調度器決定,不確定誰先運行。
getpid(); 獲取當前進程自己的PID號
getppid():獲取當前進程父進程的PID號
注意:
1. 子進程完完整整拷貝父進程0-3G虛擬內存空間。
????????2. 父子進程棧區、數據區、文本區、堆區完全獨立,數據不共享
????????3. 要想共享數據,需要使用進程間通信方式實現
練習:
1. 使用fork函數創建新進程,父進程打印自己的PID和自己子進程的pid,子進程中打印自己的PID和父進程的PID
#include<stdio.h>int main()
{pid_t pid = fork;if(pid > 0){printf("自己的PID:%d 自己子進程的PID",getpid(),pid);}else if(pid == 0){printf("自己的PID:%d 自己父進程的PID",getpid(),getppid());}else if{perror(fork error);}return 0;
}
2.進程調度:操作系統完成
1.進程退出:return、exit()相關函數
1)main中return
2) exit ()、_exit() :結束一個進程
exit (0) : 正常退出
exit (非0) :由于進程產生了某種問題,需要主動退出進程
2.回收資源空間:wait()、waitpid()
僵尸進程:父進程未回收已終止子進程的資源,? ? ? ? 退出后,但其資源空間未被父進程回收
如何避免僵尸進程產生:
1. ?子進程退出后,父進程及時為其回收資源空間
2. ?讓該進程成為一個孤兒進程,結束時被操作系統中的系統進程回收
? ? ? ? 孤兒進程:父進程先消亡,其對應的子進程成為一個孤兒進程,會被系統進程所收養
(守護類的進程)