首頁 > shell教程 閱讀:0更新時間:2020-03-28 02:19:46

Linux進程是什么

進程是 linux 操作系統中最重要的基本概念之一,這一節我們將了解學習 Linux 進程的一些基礎知識。

進程是運行在 Linux 中的程序的一個實例。這是一個你之前就可能已經聽說過的基本定義。

當你在 Linux 系統中執行一個程序時,系統會為這個程序創建特定的環境。這個環境包含系統運行這個程序所需的任何東西。

每當你在 Linux 中執行一個命令,它都會創建,或啟動一個新的進程。比如,當你嘗試運行命令“ls -l”來列出目錄的內容時,你就啟動了一個進程。如果有兩個終端窗口顯示在屏幕上,那么你可能運行了兩次同樣的終端程序,這時會有兩個終端進程。

每個終端窗門可能都運行了一個 shell,每個運行的 Shell 都分別是一個進程。當你從 Shell 調用一個命令時,對應的程序就會在一個新進程中執行,當這個程序的進程執行完成后,Shell 的進程將恢復運行。

操作系統通過被稱為 PID 或進程 ID 的數字編碼來追蹤進程。系統中的每一個進程都有一個唯一的 PID。

現在我們通過一個實例來了解 Linux 中的進程。我們在 Shell 命令行下執行如下命令:

[c.biancheng.net]$ sleep 10 &
[1] 3324

因為程序會等待 10 秒,所以我們快速地在當前 Shell 上查找任何進程名為 sleep 的進程:

[c.biancheng.net]$ ps -ef | grep sleep
mozhiyan  3324  5712  cons1  17:11:46  /usr/bin/sleep

我們看到進程名為 /usr/bin/sleep 的進程正運行在系統中(其 PID 與我們在上一命令中得到的 PID 相同)。

現在,我們嘗試并行地從 3 個不同的終端窗口運行上述的 sleep 命令,上述命令的輸出將類似如下所示:

[c.biancheng.net]$ ps -ef | grep sleep
mozhiyan  896   5712  cons1  17:16:51  /usr/bin/sleep
mozhiyan  5924  5712  cons1  17:16:52  /usr/bin/sleep
mozhiyan  2424  5712  cons1  17:16:50  /usr/bin/sleep

我們看到 sleep 程序的每一個實例都創建了一個單獨的進程。

每個 Linux 進程還有另一個 ID 號碼,即父進程的 ID(ppid)。系統中的每一個用戶進程都有一個父進程。

命令“ps -f”就會列出進程的 PID 和 PPID。此命令的輸出類似如下所示:

[c.biancheng.net]$ ps -f
   UID     PID   PPID    TTY       STIME      COMMAND
mozhiyan  4124   228    cons0    21:37:09   /usr/bin/ps
mozhiyan   228   1      cons0    21:32:23   /usr/bin/bash

你在 Shell 命令行提示符下運行的命令都把當前 Shell 的進程作為父進程。例如,你在 Shell 命令行提示符下輸入 ls 命令,Shell 將執行 ls 命令,此時 Linux 內核會復制 Shell 的內存頁,然后執行 ls 命令。

在 Unix 中,每一個進程是使用 fork 和 exec 方法創建的。然而,這種方法會導致系統資源的損耗。

在 Linux 中,fork 方法是使用寫時拷貝內存頁實現的,所以它導致的僅是時間和復制父進程的內存頁表所需的內存的損失,并且會為子進程創建一個唯一的任務結構。

寫時拷貝模式在創建新進程時避免了創建不必要的結構拷貝。例如,用戶在 Shell 命令行提示符下輸出 ls 命令,Linux 內核將會創建一個 Shell 的子進程,即 Shell 的進程是父進程,而 ls 命令的進程是子進程,ls 命令的進程會指向與此 Shell 相同的內存頁,然后子進程使用寫時拷貝技術執行 ls 命令。

前臺進程和后臺進程

當你啟動一個進程時(運行一個命令),可以如下兩種方式運行該進程:

  • 前臺進程

  • 后臺進程


默認情況下,你啟動的每一個進程都是運行在前臺的。它從鍵盤獲取輸入并發送它的輸出到屏幕。

當一個進程運行在前臺時,我們不能在同一命令行提示符下運行任何其他命令(啟動任何其他進程),因為在程序結束它的進程之前命令行提示符不可用。

啟動一個后臺進程最簡羊的方法是添加一個控制操作符“&”到命令的結尾。例如,如下命令將啟動一個后臺進程:

[c.biancheng.net]$ sleep 10 &
[1] 5720

現在 sleep 命令被放在后臺運行。當 Bash 在后臺啟動一個作業時,它會打印一行內容顯示作業編號([1])和進程號(PID-5720)。當作業完成時,作業會發送類似如下的信息到終端程序,來顯示此作業已完成,其內容類似如下所示:

[1]+ Done    sleep 10

將進程放在后臺運行的好處是:你可以繼續運行其他命令,而不需要等待此進程運行完成再運行其他命令。

進程的狀態

每個 Linux 進程都有它自己的生命周期,比如,創建、執行、結束和清除。每個進程也都有各自的狀態,顯示進程中當前正發生什么。

進程可以有如下幾種狀態:

  • D(不可中斷休眠狀態)——進程正在休眠并且不能恢復,直到一個事件發生為止。

  • R(運行狀態)——進程正在運行。

  • S(休眠狀態)——進程沒有在運行,而在等待一個事件或是信號。

  • T(停止狀態)——進程被信號停止,比如,信號 SIGINT 或 SIGSTOP。

  • Z(僵死狀態)&mdash;&mdash;標記為 <defunct> 的進程是僵死的進程,它們之所以殘留是因為它們的父進程適當地銷毀它們。如果父進程退出,這些進程將被 init 進程銷毀。


若要查看指定進程的狀態,可以使用如下命令:

ps -C processName -o pid=,cmd,stat

例如:

[c.biancheng.net]$ ps -C sleep -o pid=,cmd,stat
      CMD       STAT
9434 sleep 20    S

beylze編程學院,一個分享編程知識和seo優化知識的網站。跟著beylze一起學習,每天都有進步。

通俗易懂,深入淺出,一篇文章只講一個知識點。

文章不深奧,不需要鉆研,在公交、在地鐵、在廁所都可以閱讀,隨時隨地漲姿勢。

文章不涉及代碼,不燒腦細胞,人人都可以學習。

當你決定關注beylze(公眾號:beylze),你已然超越了90%的其他從業者!

相關文章

優秀教程

国产亚洲欧美日韩