目標
對於linux進程有初步的概念(進程與程序,進程的衍生,工作管理)
學習目錄
1.進程概念理解
2.進程的屬性
2.1進程的分類
2.2進程的衍生
2.3進程組與sessions
2.4工作管理
1.進程概念理解
什麼是程序,什麼是進程?什麼是線程?
程序:
程序是一個靜態的概念,一般對應一個操作系統中的一個可執行文件(待執行),由一系列有邏輯,有順序結構的指令組成。
進程:
1.執行中的程序叫做進程,是一個動態的概念。
2.進程是包含上下文切換的程序執行時間總和,是對應的CPU時間段的描述,是描述這一CPU時間段的名詞。參考網址
3.進程,是計算機中的程序關於某數據集合上的一次運動活動,是系統進行資源分配和調度的基本單位。是操作系統結構的基礎。它的執行需要系統分配資源創建實體後才能進行。
4.在Linux2.6更新後,進程本身不是基本運行單位,而是線程的容器(只在Linux中)。
5 進程是程序的一次動態執行過程,佔用特定的地址空間。
6.每個進程由三部分組成:代碼段,數據段,進程控制塊。每個進程都是獨立的,擁有自己的cpu時間,代碼和數據,即使一個程序產生了好幾份進程,他們之間還是獨立擁有自己的這三件東西,這樣的缺點是:浪費內存,cpu負擔較重。參考網址
線程:
1.隨着技術的發展,在執行一些細小任務時,本身無需分配單獨資源,進程依然會繁瑣的將資源分割,即浪費時間還浪費資源,然後專門運用於這個場景的多任務技術被創造——線程。進程可以產生多個線程,而這些線程可以共享此進程的某些資源,所以進程不需要獨立的資源就可以運行,可以節省資源與時間。
2.進程是操作系統能夠進行運算調度的最小單位。它被包含在進程內,是進程中實際運作單位。
3.線程是一個進程內部的一個執行單元,它是程序中的單一的順序控制進程。
4.一個進程可擁有多個並行的線程(需多個cpu)。
5.一個進程內的多個線程共享相同的內存地址空間,可以訪問相同的變量和對象,它們從同一堆中分配對象並進行通信,數據交換和同步操作。
6.它是比進程更爲細小的cpu時間段。
進程與線程區別參考網址
2.進程的屬性
進程的屬性分爲(進程的分類)(進程的衍生)(進程組與sessions)(工作管理)。
2.1進程的分類
兩個角度:
一(進程的功能與服務的對象來分)
二(應用程序的服務類型)
進程的功能與服務對象
- 用戶進程:通過執行用戶程序,應用程序或稱之爲內核之外的系統程序而產生的進程,此類進程可以在用戶的控制下運行或關閉。
- 系統進程:通過執行系統內核程序而產生的進程,而且該進程的運行不受用戶干預。即使root用戶也不能干預系統進程的運行。
應用程序的服務類型
- 交互進程:由shell終端啓動的進程,在執行過程中,需要與用戶進行交互操作。可以運行前臺,也可以運行於後臺。
- 守護進程:一種一直運行的進程。例如httpd進程。
2.2進程的衍生
-
父進程與子進程:我們啓動終端就是啓動了一個bash進程,當我們在bash中再輸入bash則會再啓動一個bash進程。我們叫第一個bash進程爲父進程,第二個bash進程爲其子進程。
-
fork()
與exec()
:
fork()
:是一個system call,主要作用是爲當前進程創建一個新的進程,這個新進程就是它的子進程,這個子進程除了父進程的返回值和PID以外其他的信息都一模一樣。
exec()
:也是系統調用,作用是切換子進程中的執行程序,替換其從父進程複製過來的代碼段和數據段。 -
子進程退出與資源回收:當一個子進程要正常的終止運行時或該進程結束時它的主函數
main()
會執行exit(n);
或return n
,這裏的n
是一個信號,系統會將這個SIGCHLD信號返回給父進程。
4.殭屍進程:當子進程代碼執行部分已經結束執行,系統資源也基本歸還給系統了,但若是其進程的進程控制塊仍駐留在內存中,而它的PCB還在,代表這個進程還存在,並沒有消亡Z(Zombie)
表示殭屍進程。 缺點:子進程會佔用PID,而系統會因爲沒有可用的PID從而導致不能產生新的進程。
5.孤兒進程:當父進程非正常結束,未能及時回收子進程,子進程仍在運行,這樣的進程被稱爲孤兒進程。這樣的進程會被init進程收養。
6.進程結構
進程0:是系統引導時創建的一個特殊進程,稱爲內核初始化,其最後一個動作就是調用fork()
創建出一個子進程運行/sbin/init
可執行文件,該進程的PID=1,進程0轉化爲空閒進程。
init進程
:第一個用戶態的進程,由它不斷調用fork()
來創建系統裏的其他進程,是所有程序的父進程,同時它也是一個守護進程。
通過ps -fxo user,ppid,pid,pgid,command
可以看到
(pid是該進程的唯一編號)(ppid是該進程的父進程的pid)(command表示該進程通過執行什麼樣的命令或腳本產生的)參考網址
2.3進程組與sessions
- 進程組:每一個進程都是一個進程組的成員,每一個進程組都是唯一存在的,它們依靠PGID來區別,每當一個進程被創建的時候,它便會成爲其父進程所在組的一員。
一般來說,該進程組的PGID等同於進程組的第一個成員的PID,該進程是這個進程組的主進程。主進程可以先終結,此時進程組仍然存在,並持有相同的PID,知道進程組中的最後一個進程結束。
每一個進程組sessions中,並且這個sessions是唯一存在的。
2.sessions:sessions是針對一個tty建立。sessions中的每一個進程都稱爲job,每一個會話可以連接一個終端。
sessions 的主要作用是:將多個jobs囊括在一個終端,並取其中一個job作爲前臺,直接接收該終端的輸入輸出以及終端信號,其他job在後臺運行。
2.4工作管理
每個bash(終端)只能管理當前終端的job。
[job] & #&讓命令在後臺運行
ctrl+z #當前工作停止並轉到後臺
jobs #查看停止並被放置在後臺的工作
fg [%jobnumber] #將在後臺的工作拿到前臺來
#例:fg %1 #將後臺job編號爲1的job拿到前臺來
bg [%jobnumber] #將job在後臺運作
#例: bg %1 #將後臺job編號爲1的job在後臺運行
kill [-信號值] [%jobnumber] #刪除或重啓job
kill信號值補充:
-1: 重新讀取參數運行
-2:如同ctrl+c的操作退出
-9:強制終止該任務
-15:正常的方式終止該任務