Linux 進程概念

目標

對於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進程的衍生

  1. 父進程與子進程:我們啓動終端就是啓動了一個bash進程,當我們在bash中再輸入bash則會再啓動一個bash進程。我們叫第一個bash進程爲父進程第二個bash進程爲其子進程

  2. fork()exec()
    fork():是一個system call,主要作用是爲當前進程創建一個新的進程,這個新進程就是它的子進程,這個子進程除了父進程的返回值和PID以外其他的信息都一模一樣。
    exec():也是系統調用,作用是切換子進程中的執行程序,替換其從父進程複製過來的代碼段和數據段。

  3. 子進程退出與資源回收:當一個子進程要正常的終止運行時或該進程結束時它的主函數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

  1. 進程組:每一個進程都是一個進程組的成員,每一個進程組都是唯一存在的,它們依靠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:正常的方式終止該任務
發佈了32 篇原創文章 · 獲贊 0 · 訪問量 888
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章