解讀linux中進程與作業

程序

定義:程序是一組指令及參數的集合,指令按照既定的邏輯控制計算機運行來完成特定任務。

程序是靜態的,運行後成爲進程。

進程

定義:進程是運行着的程序,是操作系統執行的基本單位,是程序運行的過程,是動態的,有生命週期和運行狀態。

  • 從用戶的角度來看,進程是程序的一次動態執行過程。
  • 操作系統的核心來看,進程是操作系統分配的內存,CPU時間片等資源的基本單位。
  • 每一個進程都有自己獨立的地址空間與執行狀態。
  • 這樣的多任務操作系統能夠讓許多程序同時運行。每一個運行着的程序就是一個進程。

進程生命週期

在這裏插入圖片描述

  1. 程序運行爲進程後父進程複製(fork)自己的地址空間,創建一個子進程結構。
  2. 每一個子進程分配一個唯一的,進程id。
  3. fork的子進程,包括進程的數據和堆棧段,以及父進程的進程環境。
  4. 當子進程開始工作。父進程處於睡眠(sleep)狀態。子進程完成時發出信號請求(exit)退出時。子進程已經關閉或丟棄了其資源環境。剩餘的部分稱之爲殭屍進程。
  5. 父進程在子進程退出後被喚醒,清理剩餘的結構。繼續執行自己的程序代碼。
  6. 若父進程終止子進程自然終止。

進程狀態

在這裏插入圖片描述

  1. R (TASK_RUNNING),可執行狀態&運行狀態(在run_queue隊列裏的狀態)

  2. 睡眠狀態

  • S (TASK_INTERRUPTIBLE),可中斷的睡眠
  • D (TASK_UNINTERRUPTIBLE),不可中斷的睡眠狀態, 可處理signal, 有延遲
  • K,可退出睡眠
  1. T (TASK_STOPPED or TASK_TRACED),暫停狀態或跟蹤狀態, 不可處理signal, 因爲根本沒有時間片運行代碼

  2. Z (TASK_DEAD - EXIT_ZOMBIE),退出狀態,進程成爲殭屍進程。不可被kill, 即不響應任務信號, 無法用SIGKILL殺死。

進程優先級

linux進程調度及多任務:每個CPU核心在一個時間點上只能處理一個進程。通過時間片技術,Linux實際能夠運行的進程可以超出實際可用的CPU及核心數量。Linux進程調度程序將多個進程在CPU核心上快速切換,從而給用戶多個進程在同時運行的印象。
優先級:優先級由0到139。共140個數字來劃分。

相對優先級nice(可調節優先級):
  • nice值:-20到19,40種不同級別的nice值。
  • 將優先級100到139劃分爲40個nice值。
  • Nice值越高表示優先級越低。(19,表示該進程容易將CPU使用量讓給其他進程。就是優先級爲139。)
  • Nice值越低表示優先級越高。(-20,表示該進程更傾向於不讓出CPU。就是優先級爲100。)

前臺進程和後臺進程

  • 前臺進程:鍵入命令後創建一個子進程運行命令。shell等待命令退出,然後返回到對用戶給出提示符。這條命令與shell異步運行,即在前臺運行,用戶在他完成之前不能執行別的命令。

如:ping,top

  • 後臺進程:鍵入命令後,在最後加一個&,將進程放在後臺運行。不用等待退出,有可以繼續在,窗口執行其他命令。

作業

定義:當在Linux的shell中運行程序時,這個程序就可以看作爲一個作業。shell需要控制的不是進程而是作業。shell可以分前後臺對作業進行控制。
優點:作業控制是一個命令行功能,允許一個shell實例來運行和管理多個命令。如果沒有作業控制,父進程fork一個子進程後將sleeping。直到子進程退出。使用作業控制可以選擇性暫停恢復以及異步運行命令。讓shell可以在此進程運行期間返回接受其他命令。

程序和進程的區別

  • 區別:進程是一個程序在一個數據集上的一次執行。而作業是用戶提交給系統的一個任務。
  • 聯繫:一個作業可以包括多個進程,多個進程同時完成一個作業。

當用戶提交作業以後,作業被調度系統會爲作業創建進程,一個進程無法完成時,系統會爲這個進程創建多個子進程。

如何查看當前作業

jobs
[root@xiaoagiao ~]# jobs

[root@xiaoagiao ~]# ping www.baidu.com > /dev/null 2>&1 &     
[1] 7467

[root@xiaoagiao ~]# jobs
[1]+  Running                 ping www.baidu.com > /dev/null 2>&1 &         #當前ping命令在後臺運行,【1】是當前作業編號

[root@xiaoagiao ~]# ps -ef |grep ping
root       7467   7420  0 00:28 pts/0    00:00:00 ping www.baidu.com
root       7476   7420  0 00:29 pts/0    00:00:00 grep --color=auto ping

  • bg %#:讓作業#(作業編號)去後臺運行。
  • fg %#:讓作業#(作業編號)到前臺運行。
  • kill %#:殺死作業#
[root@xiaoagiao ~]# fg %1
ping www.baidu.com > /dev/null 2>&1        #後臺進程被調到前臺顯示。

屏蔽中斷信號

nohup

屏蔽作業中斷信號

  • 對於終端上的作業,有內容輸出時終端斷開後,作業會收到中斷信號而自動中斷。
  • 爲了避免中斷在命令行前加上nohup。
nohup  ping www.baidu.com > /dev/null 2>&1 &  
  • 終端斷開之後再連接,這時查看後臺作業依然會存在。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章