国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【探索Linux】—— 強大的命令行工具 P.7(進程 · 進程的概念)

這篇具有很好參考價值的文章主要介紹了【探索Linux】—— 強大的命令行工具 P.7(進程 · 進程的概念)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

【探索Linux】—— 強大的命令行工具 P.7(進程 · 進程的概念),Linux,linux,運維,服務器,后端

前言

前面我們講了C語言的基礎知識,也了解了一些數(shù)據結構,并且講了有關C++的一些知識,也學習了一些Linux的基本操作,也了解并學習了有關Linux開發(fā)工具vim 、gcc/g++ 使用、yum工具以及git 命令行提交代碼也相信大家都掌握的不錯,今天博主帶大家了解一下 —— 進程(進程的概念), 下面話不多說坐穩(wěn)扶好咱們要開車了?。?!??

一、馮諾依曼體系結構

馮·諾依曼體系結構是一種計算機硬件設計的范式,它是以匈牙利裔美籍數(shù)學家兼計算機科學家馮·諾依曼(Von Neumann)的名字命名的。其主要特點包括:

  1. 存儲程序:在馮·諾依曼體系結構中,程序和數(shù)據都存儲在同一塊內存中,通過地址訪問。這種結構相對于之前的計算機模型,不僅提供了更大的靈活性,也使得程序編寫和修改更加方便。

  2. 指令執(zhí)行:計算機通過從內存中讀取指令并按照順序執(zhí)行來完成特定任務。指令通常包括操作碼和操作數(shù),操作碼指定要執(zhí)行的操作類型(比如加法或乘法),而操作數(shù)則提供操作的具體數(shù)據。

  3. 存儲器和處理器分離:在馮·諾依曼體系結構中,存儲器和處理器是分離的實體。處理器負責執(zhí)行指令,而存儲器則用于存儲指令和數(shù)據。這種分離設計使得處理器可以靈活地訪問存儲器中的不同位置。

  4. 順序執(zhí)行:指令按照順序從內存中加載并執(zhí)行。這也意味著指令之間存在依賴關系,后續(xù)指令必須等待前面指令完成后才能執(zhí)行。這種順序執(zhí)行的方式限制了計算機的并行性能。
    【探索Linux】—— 強大的命令行工具 P.7(進程 · 進程的概念),Linux,linux,運維,服務器,后端

馮·諾依曼體系結構成為了現(xiàn)代計算機的基石,幾乎所有的通用目的計算機都采用了這種結構。它對計算機的發(fā)展起到了重要的推動作用,使得計算機變得更加靈活、可編程和易于使用。

二、操作系統(tǒng)(OS)

1. 概念

操作系統(tǒng)(Operator System)任何計算機系統(tǒng)都包含一個基本的程序集合,稱為操作系統(tǒng)(OS)?;\統(tǒng)的理解,操作系統(tǒng)包括:

  • 內核(進程管理,內存管理,文件管理,驅動管理)
  • 其他程序(例如函數(shù)庫,shell程序等等)
  1. 資源管理:操作系統(tǒng)負責管理計算機系統(tǒng)的資源,包括處理器、內存、磁盤、輸入/輸出設備、網絡等。它分配和調度這些資源,以確保它們能夠高效地被應用程序使用。資源管理可以通過不同的策略和算法來優(yōu)化資源的利用率和性能。

  2. 進程管理:操作系統(tǒng)負責管理計算機中運行的進程,即程序的執(zhí)行實例。它負責創(chuàng)建、調度和終止進程,并提供進程間的通信和同步機制。操作系統(tǒng)通過分時復用處理器,使得多個進程能夠并發(fā)執(zhí)行,從而提高系統(tǒng)的利用率和響應性能。

  3. 內存管理:操作系統(tǒng)管理計算機的內存資源,即主存。它負責分配和回收內存空間,這樣應用程序就能夠加載和執(zhí)行。內存管理機制包括虛擬內存,它允許將內存擴展到磁盤上的虛擬內存空間,從而提供更大的內存空間和更好的內存保護。

  4. 文件系統(tǒng):操作系統(tǒng)提供了對計算機存儲設備上文件和目錄的管理。它負責文件的創(chuàng)建、讀取、寫入和刪除,以及文件的組織和保護機制。文件系統(tǒng)提供了邏輯結構來組織和訪問數(shù)據,同時提供權限控制和數(shù)據備份等功能。

  5. 設備驅動程序管理:操作系統(tǒng)管理計算機的輸入/輸出設備,如鍵盤、鼠標、顯示器、打印機等。它提供設備驅動程序來實現(xiàn)與設備的通信和控制,以及處理設備的中斷和錯誤。

總而言之,操作系統(tǒng)是計算機系統(tǒng)中的核心軟件,它提供了一種有效和可控的方式來管理和利用計算機的資源,同時為用戶和應用程序提供一個友好和統(tǒng)一的環(huán)境。操作系統(tǒng)的設計和實現(xiàn)因不同的需求和平臺而異,從個人電腦到服務器和嵌入式系統(tǒng),每個系統(tǒng)都有自己特定的操作系統(tǒng)。
【探索Linux】—— 強大的命令行工具 P.7(進程 · 進程的概念),Linux,linux,運維,服務器,后端

三、進程

1. 進程的概念

?進程是計算機中正在執(zhí)行的程序的實例。它是操作系統(tǒng)進行資源分配和調度的基本單位。每個進程都有自己的內存空間、執(zhí)行狀態(tài)和相關的系統(tǒng)資源。進程可以包含一個或多個線程,每個線程可以獨立執(zhí)行一段代碼。

2. PCB(Process Control Block)

PCB是操作系統(tǒng)中用于管理和控制進程的數(shù)據結構。每個進程都有一個對應的PCB,它包含了進程的相關信息和狀態(tài)。
下面是PCB的一些主要內容:

  1. 進程標識符(Process ID):用于唯一標識一個進程。

  2. 程序計數(shù)器(Program Counter):記錄了進程當前執(zhí)行的指令地址。

  3. 寄存器集合(Register Set):保存了進程的寄存器狀態(tài),包括通用寄存器、程序狀態(tài)字等。

  4. 進程狀態(tài)(Process State):表示進程當前的執(zhí)行狀態(tài),如運行、就緒、阻塞等。

  5. 進程優(yōu)先級(Process Priority):用于確定進程在調度時的優(yōu)先級順序。

  6. 進程調度信息(Scheduling Information):包括進程的調度策略、調度隊列等信息。

  7. 內存管理信息(Memory Management Information):記錄了進程的內存分配情況,包括代碼段、數(shù)據段、堆棧等。

  8. 文件管理信息(File Management Information):記錄了進程打開的文件和文件描述符等信息。

  9. 進程間通信信息(Interprocess Communication Information):記錄了進程與其他進程進行通信的方式和相關信息。

PCB是操作系統(tǒng)中非常重要的數(shù)據結構,它存儲了進程的關鍵信息,操作系統(tǒng)通過對PCB的管理和操作,實現(xiàn)了對進程的控制和調度。當操作系統(tǒng)需要切換到另一個進程時,它會保存當前進程的PCB,并加載下一個進程的PCB,以實現(xiàn)進程的切換和執(zhí)行。

3. 查看進程

  1. ps:顯示當前運行的進程快照。常用的選項有:

    • ps aux:顯示所有用戶的所有進程。
    • ps -ef:顯示所有進程的完整信息。
    • ps -eL:顯示線程的相關信息。
  2. top:實時顯示當前系統(tǒng)的進程狀態(tài)和系統(tǒng)資源使用情況。按下 “q” 鍵可退出。

  3. htop:類似于 top,但提供更加直觀、交互式的界面,可以進行更多操作。需要先安裝 htop。

  4. pstree:以樹狀形式顯示進程的層次關系。

  5. pgrep:根據進程名或其他條件查找進程的PID。常用的選項有:

    • pgrep process_name:根據進程名查找相應進程的PID。
  6. pidof:根據進程名查找相應進程的PID。

  7. top、htoppstree命令都是實時顯示進程信息的命令,可以使用 Ctrl+C 終止。

這些命令可以提供進程的基本信息,如進程ID(PID)、父進程ID(PPID)、進程狀態(tài)、CPU和內存的占用情況等。根據實際需要選擇適合的命令進行查看。

四、fork函數(shù)

1. 函數(shù)簡介

fork() 是一個在類 UNIX 操作系統(tǒng)下常用的系統(tǒng)調用函數(shù),用于創(chuàng)建一個新的進程。它的作用是在當前進程的執(zhí)行空間中創(chuàng)建一個與當前進程幾乎完全相同的子進程。子進程擁有父進程的代碼、數(shù)據和資源副本。

2. 調用方式

fork() 函數(shù)的調用方式如下:

#include <sys/types.h>
#include <unistd.h>

pid_t fork(void);

3. 返回值

fork() 函數(shù)的返回值有以下三種情況:

  • 如果返回值為負數(shù),表示創(chuàng)建子進程失敗。
  • 如果返回值為 0,表示當前進程為子進程。
  • 如果返回值大于 0,表示當前進程為父進程,返回值是子進程的進程ID。

4. 使用示例

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main() {
    pid_t pid = fork();

    if (pid < 0) {
        // 創(chuàng)建子進程失敗
        fprintf(stderr, "Fork failed\n");
        return 1;
    } else if (pid == 0) {
        // 子進程
        printf("This is the child process\n");
        // 子進程可以在此處執(zhí)行自己的邏輯
    } else {
        // 父進程
        printf("This is the parent process\n");
        // 父進程可以在此處執(zhí)行自己的邏輯
    }

    return 0;
}

在這個示例中,當調用 fork() 函數(shù)后,父進程中的 pid 是子進程的進程ID,而子進程中的pid 是 0。通過判斷 pid 的值,可以在父子進程中執(zhí)行不同的邏輯。

??注意:fork() 函數(shù)會盡可能地復制父進程的所有資源給子進程,包括代碼、數(shù)據、打開的文件等。但是,父進程和子進程之間的執(zhí)行順序是不確定的,取決于操作系統(tǒng)對進程調度的策略。

五、進程的幾種狀態(tài)

1. 狀態(tài)簡介

在操作系統(tǒng)(OS)中,進程可以處于以下幾種狀態(tài):

  1. 創(chuàng)建(Created):進程剛被創(chuàng)建,但還沒有開始執(zhí)行。

  2. 就緒(Ready):進程已經準備好執(zhí)行,但還沒有被調度執(zhí)行。

  3. 運行(Running):進程正在執(zhí)行。

  4. 阻塞(Blocked):進程由于某些原因無法繼續(xù)執(zhí)行,例如等待某個事件發(fā)生或等待某個資源的釋放。

  5. 終止(Terminated):進程已經執(zhí)行完畢或被終止。

進程的狀態(tài)轉換是動態(tài)的,進程可以在不同的狀態(tài)之間切換。操作系統(tǒng)通過合理的調度算法和策略來控制進程的狀態(tài)轉換,以實現(xiàn)對進程的管理和調度。

2. 進程狀態(tài)查看

在Linux系統(tǒng)中,可以使用多種方法查看進程的狀態(tài)。

  1. ps命令:ps命令是Linux中最基礎和常用的進程查看命令。它可以顯示當前系統(tǒng)中運行的進程信息,包括進程狀態(tài)。常用的命令有:

    • ps aux :顯示所有用戶的所有進程信息,包括進程狀態(tài)。
    • ps -ef :顯示所有進程的完整信息,包括進程狀態(tài)。
    • ps -e -o pid,cmd,state :僅顯示進程的PID、命令和狀態(tài)。
  2. top命令:top命令可以實時動態(tài)地顯示系統(tǒng)中運行的進程和系統(tǒng)資源的使用情況。它的界面可以按CPU使用率、內存使用率等來排序,并顯示每個進程的狀態(tài)。在top的進程列表中,進程的狀態(tài)將在STAT列中顯示,常見的狀態(tài)有:

    • R:運行狀態(tài)(Running)。
    • S:睡眠狀態(tài)(Sleeping)。
    • D:不可中斷狀態(tài)(Uninterruptible sleep)。
    • Z:僵尸狀態(tài)(Zombie)。
    • T:停止狀態(tài)(Stopped)。
  3. htop命令:htop是一個交互式的進程查看命令,功能類似于top命令,但界面更加友好和豐富。htop可以顯示進程的狀態(tài)、CPU使用率、內存使用率等信息,并支持通過鍵盤快捷鍵進行交互式操作。

  4. pstree命令:pstree命令以樹狀的形式顯示當前系統(tǒng)中的進程關系。它可以清晰地展示進程樹中的父子關系,以及每個進程的狀態(tài)。

3. Z(zombie)-僵尸進程

? 概念

在Linux系統(tǒng)中,僵尸進程(Zombie process)是一種特殊的進程狀態(tài)。當一個子進程終止后,父進程必須調用wait()waitpid()等系統(tǒng)調用來獲取子進程的終止狀態(tài)并進行資源清理。如果父進程沒有正確處理子進程的終止狀態(tài),被終止的子進程將會變成僵尸進程。

?僵尸進程危害

僵尸進程在系統(tǒng)中占用了一部分進程標識符(PID)等資源,但它們已經完成了它們的執(zhí)行過程,不再占用CPU資源。僵尸進程的存在并不會對系統(tǒng)運行產生直接影響,因為它們已經成為了無害的靜悄悄的進程。

僵尸進程本身并不會對系統(tǒng)的穩(wěn)定性或性能產生直接的危害,因為它們已經完成了它們的執(zhí)行過程并不再占用CPU資源。然而,過多的僵尸進程可能會導致一些間接的危害和問題:

  1. 資源浪費:僵尸進程會占用一部分進程標識符(PID)等系統(tǒng)資源,在系統(tǒng)中積累過多的僵尸進程會浪費一定量的資源。

  2. 進程表溢出:每個進程都需要在操作系統(tǒng)內核中占用一部分內存空間,包括進程描述符等信息。過多的僵尸進程會占用進程表中的條目,導致進程表溢出,影響系統(tǒng)的正常運行。

  3. 可用PID不足:在Linux系統(tǒng)中,PID是有限的資源,每個進程都會被分配一個唯一的PID。如果系統(tǒng)中有大量的僵尸進程,那么可用的PID數(shù)量就會變少,當可用的PID不足時,新的進程將無法創(chuàng)建。

  4. 難以診斷和調試:過多的僵尸進程可能會使進程狀態(tài)的監(jiān)測和診斷變得困難。系統(tǒng)管理員和開發(fā)人員可能會難以確定是哪些進程造成了問題,以及如何解決這些問題。

盡管僵尸進程本身并不會造成直接的危害,但積累過多的僵尸進程可能會導致系統(tǒng)資源浪費和其他間接的問題。因此,及時清理僵尸進程是一種良好的實踐,可以通過適當?shù)奶幚碜舆M程的終止狀態(tài)來避免僵尸進程的積累。

?如何避免僵尸進程

要解決僵尸進程問題,父進程可以通過以下方式之一來處理子進程的終止狀態(tài):

  1. 調用wait()waitpid()等系統(tǒng)調用,獲取子進程的終止狀態(tài)。
  2. 設置SIGCHLD信號的處理函數(shù),并在處理函數(shù)中調用waitpid()等來回收僵尸進程。
  3. 在父進程啟動時忽略SIGCHLD信號,這樣子進程終止時不會變成僵尸進程。

4. 孤兒進程

? 概念

孤兒進程(Orphan process)是指在父進程終止或意外退出后,子進程仍然在系統(tǒng)中運行,并成為一個沒有父進程的進程。在這種情況下,操作系統(tǒng)會自動將孤兒進程的父進程設置為init進程(進程ID為1),init進程負責接管孤兒進程的管理。

?孤兒進程產生的原因

  1. 父進程意外終止:當父進程意外終止(如崩潰、被強制終止等),它沒有機會或能力去合理地終止它創(chuàng)建的子進程。這樣子進程就會成為孤兒進程。

  2. 父進程在子進程終止前退出:父進程可能在子進程完成其任務之前就退出了。這可能是由于父進程的設計或邏輯錯誤導致的。因此,子進程被“遺棄”并成為孤兒進程。

  3. 父進程未正確等待子進程的終止狀態(tài):父進程沒有正確使用wait()waitpid()等系統(tǒng)調用來等待子進程的終止狀態(tài)。這樣子進程雖然終止了,但其終止狀態(tài)無法被父進程正確獲取,從而導致子進程成為孤兒進程。

需要注意的是,孤兒進程的產生是一種意外或錯誤的現(xiàn)象,通常不應該出現(xiàn)在正常的進程管理中。

?孤兒進程的危害

孤兒進程本身并沒有直接的危害,因為操作系統(tǒng)會接管孤兒進程并負責清理其資源。當孤兒進程終止后,操作系統(tǒng)會立即回收它們的資源,并將其進程描述符等信息從進程表中清除。因此,孤兒進程并不會占用過多的系統(tǒng)資源。

然而,孤兒進程可能對系統(tǒng)產生一些間接的影響,包括:

  1. 造成系統(tǒng)資源浪費:孤兒進程可能仍然占用一些系統(tǒng)資源,如進程標識符(PID)、內存等。盡管這些資源在孤兒進程終止后會被回收,但在孤兒進程存在的期間,這些資源仍然無法被其他進程使用。

  2. 影響進程標識符的分配:操作系統(tǒng)會為每個進程分配唯一的進程標識符(PID)。孤兒進程終止后,其進程標識符會被回收并可以重新分配給其他進程使用。然而,在孤兒進程存在的期間,其進程標識符將被保留,可能會影響后續(xù)進程標識符的分配。

  3. 可能導致資源泄漏或其他問題:如果孤兒進程打開了文件描述符、網絡連接或其他資源,并且沒有正確釋放這些資源,可能會導致資源泄漏或其他問題。這可能會影響系統(tǒng)的穩(wěn)定性和正常運行。

總結

進程是計算機中正在運行的程序的實例。每個進程都有一個唯一的進程標識符(PID)和一組相關的資源,如內存、文件描述符等。進程之間是相互獨立的,它們通過操作系統(tǒng)進行調度和管理。PCB是操作系統(tǒng)用來管理和跟蹤進程的數(shù)據結構。PCB 包含了進程的狀態(tài)信息、程序計數(shù)器、寄存器值、內存分配信息等。操作系統(tǒng)通過修改 PCB 中的信息來控制和調度進程的執(zhí)行。通過查看進程列表,可以獲取當前系統(tǒng)中正在運行的進程的信息。不同的操作系統(tǒng)提供了不同的命令和工具來查看進程列表,如Linux中的ps命令和Windows中的任務管理器。

fork函數(shù)是一個在Unix和類Unix系統(tǒng)中常用的函數(shù),用于創(chuàng)建一個新的進程。fork函數(shù)會復制當前進程的副本,并在新的進程中繼續(xù)執(zhí)行。新進程和原進程幾乎完全相同,包括代碼、數(shù)據、打開的文件等。fork函數(shù)的返回值不同,對于原進程,返回新進程的PID,對于新進程,返回0。

進程有幾種不同的狀態(tài),包括運行態(tài)、就緒態(tài)、阻塞態(tài)等。進程的狀態(tài)可以通過操作系統(tǒng)提供的工具或命令來查看。其中,僵尸進程是一種特殊的狀態(tài),它是指一個已經終止但是其父進程尚未對其進行善后處理的進程。僵尸進程不會占用系統(tǒng)資源,但可能會導致一些問題,如資源泄漏。為了避免僵尸進程的產生,父進程應該及時對其進行處理。

孤兒進程是指其父進程已經終止或不存在的進程。孤兒進程會被操作系統(tǒng)接管,并由init進程(PID為1)來作為其父進程。孤兒進程本身并沒有直接的危害,但可能會占用一些系統(tǒng)資源,并影響進程標識符的分配。為了保持系統(tǒng)的穩(wěn)定和資源的有效利用,應該及時清理孤兒進程。

溫馨提示

感謝您對博主文章的關注與支持!如果您喜歡這篇文章,可以點贊、評論和分享給您的同學,這將對我提供巨大的鼓勵和支持。另外,我計劃在未來的更新中持續(xù)探討與本文相關的內容。我會為您帶來更多關于Linux以及C++編程技術問題的深入解析、應用案例和趣味玩法等。如果感興趣的話可以關注博主的更新,不要錯過任何精彩內容!

再次感謝您的支持和關注。我們期待與您建立更緊密的互動,共同探索Linux、C++、算法和編程的奧秘。祝您生活愉快,排便順暢!
【探索Linux】—— 強大的命令行工具 P.7(進程 · 進程的概念),Linux,linux,運維,服務器,后端文章來源地址http://www.zghlxwxcb.cn/news/detail-695888.html

到了這里,關于【探索Linux】—— 強大的命令行工具 P.7(進程 · 進程的概念)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包