<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux進程管理:什么是進程?進程的生命周期

馬哥Linux運維 ? 來源:lq ? 2019-02-15 14:29 ? 次閱讀

1.1 Linux進程管理

進程管理是操作系統的最重要的功能之一。有效率的進程管理能保證一個程序平穩而高效地運行。

Linux的進程管理與UNIX的進程管理相似。它包括進程調度、中斷處理、信號、進程優先級、上下文切換、進程狀態、進度內存等。

在本節中,我們將描述Linux進程管理的基本原理的實現。它將更好地幫助你理解Linux內核如何處理進程及其對系統性能的影響。

1.1.1 什么是進程?

一個進程是一個運行在處理器的程序的一個實例。該進程使用Linux內核能夠處理的任何資源來完成它的任務。

所有運行在Linux操作系統中的進程都被task_struct結構管理,該結構同時被叫作進程描述。一個進程描述包含一個運行進程所有的必要信息,例如進程標識、進程屬性和構建進程的資源。如果你了解該進程構造,你就能理解對于進程的運行和性能來說,什么是重要的。圖1-2展示了進程結構相關的進程信息概述。

圖1-2task_struct結構體

1.1.2 進程的生命周期

每一個進程都有其生命周期,例如創建、運行、終止和消除。這些階段會在系統啟動和運行中重復無數次。因此,進程的生命周期對于其性能的分析是非常重要的。

圖1-3展示了經典的進程生命周期。

圖1-3經典的進程生命周期

當一個進程創建一個新的進程,進程的創建進程(父進程)調用 一個fork()系統調用。當fork()系統調用被調用,它得到該新創建進程(子進程)的進程描述并調用一個新的進程id。它復制該值到父進程進程描述到子進程中。此時整個的父進程的地址空間是沒有被復制的;父子進程共享相同的地址空間。

exec()系統調用復制新的程序到子進程的地址空間。因為父子進程共享地址空間,寫入一個新的程序的數據會引起一個分頁錯誤。在這種情況下,內存會分配新的物理內存頁給子進程。

這個推遲的操作叫作寫時復制。子進程通常運行他們自己的程序而不是與父進程運行相同的程序。這個操作避免了不必要的開銷,因為復制整個地址空間是一個非常緩慢和效率低下的操作,它需要使用大量的處理器時間和資源。

當程序已經執行完成,子進程通過調用exit()系統調用終止。exit()系統調用釋放進程大部分的數據并通過發送一個信號通知其父進程。此時,子進程是一個被叫作僵尸進程的進程(參閱page 7的“Zombie processes”)。

子進程不會被完全移除直到其父進程知道其子進程的調用wait()系統調用而終止。當父進程被通知子進程終止,它移除子進程的所有數據結構并釋放它的進程描述。

1.1.3 線程

一個線程是一個單獨的進程生成的一個執行單元。它與其他的線程并行地運行在同一個進程中。各個線程可以共享進程的資源,例如內存、地址空間、打開的文件等等。它們能訪問相同的程序數據集。線程也被叫作輕量級的進程(Light Weight Process,LWP)。因為它們共享資源,所以每個線程不應該在同一時間改變它們共享的資源?;コ獾膶崿F、鎖、序列化等是用戶程序的責任。

從性能的角度來說,創建線程的開銷比創建進程少,因數創建一個線程時不需要復制資源。另一方面,進程和線程擁在調度算法上有相似的特性。內核以相似的方式處理它們。

圖1-4 進程和線程

在現在的Linux實現中,線程支持UNIX的可移植操作系統接口(POSIX)標準庫。在Linux操作系統中有幾種可用的線程實現。以下是廣泛使用的線程庫:

LinuxThreads

LinuxThreads自從Linux內核2.0起就已經被作為默認的線程實現。LinuxThreads的一些實現并不符合POSIX標準。Native POSIX Thread Library(NPTL)正在取代LinuxThreads。LinuxThreads在將來的Linux企業發行版中將不被支持。

Native POSIX Thread Libary(NPTL)

NPTL最初是由紅帽公司開發的。NPTL與POSIX更加兼容。通過Linux內核2.6的高級特性,例如,新的clone()系統調用、信號處理的實現等等,它具有比LinuxThreads更高的性能和伸縮性。

NPTL與LinuxThreads有一些不兼容。一個依賴于LinuxThreads的應用可能不能在NPTL實現中工作。

Next Generation POSIX Thread(NGPT)

NGPT是一個IBM開發的POSIX線程庫?,F在處于維護階段并且在未來也沒有開發計劃。

使用LD_ASSUME_KERNEL環境變量,你可以選擇在應用中使用哪一個線程庫。

1.1.4 進程優先級和nice值

進程優先級是一個數值,它通過動態的優先級和靜態的優先級來決定進程被CPU處理的順序。一個擁有更高進程優先級的進程擁有更大的機率得到處理器的處理。

內核根據進程的行為和特性使用試探算法,動態地調整調高或調低動態優先級。一個用戶進程可以通過使用進程的nice值間接改變靜態優先級。一個擁有更高靜態優先級的進程將會擁有更長的時間片(進程能在處理上運行多長時間)。

Linux支持從19(最低優先級)到-20(最高優先級)的nice值。默認值為0。把程序的nice值修改為負數(使進程的優先級更高),需要以root身份登陸或使用su命令以root身份執行。

1.1.5 上下文切換

在進程運行過程中,進程的運行信息被保存于處理器的寄存器和它的緩存中。正在執行的進程加載到寄存器中的數據集被稱為上下文。為了切換進程,運行中進程的上下文將會被保存,接下來的運行進程的上下文將被被恢復到寄存器中。進程描述和內核模式堆棧的區域將會用來保存上下文。這個切換被稱為上下文切換。過多的上下文切換是不受歡迎的,因為處理器每次都必須清空刷新寄存器和緩存,為新的進程制造空間。它可能會引起性能問題。

圖1-5 說明了上下文切換如何工作。

圖1-5 上下文切換

1.1.6 中斷處理

中斷處理是優先級最高的任務之一。中斷通常由I/O設備產生,例如網絡接口卡、鍵盤、磁盤控制器、串行適配器等等。中斷處理器通過一個事件通知內核(例如,鍵盤輸入、以太網幀到達等等)。它讓內核中斷進程的執行,并盡可能快地執行中斷處理,因為一些設備需要快速的響應。它是系統穩定的關鍵。當一個中斷信號到達內核,內核必須切換當前的進程到一個新的中斷處理進程。這意味著中斷引起了上下文切換,因此大量的中斷將會引起性能的下降。

在Linux的實現中,有兩種類型的中斷。硬中斷是由請求響應的設備發出的(磁盤I/O中斷、網絡適配器中斷、鍵盤中斷、鼠標中斷)。軟中斷被用于處理可以延遲的任務(TCP/IP操作,SCSI協議操作等等)。你可以在/proc/interrupts文件中查看硬中斷的相關信息。

在多處理器的環境中,中斷被每一個處理器處理。綁定中斷到單個的物理處理中能提高系統的性能。更多的細節,請參閱4.4.2,“CPU的中斷處理親和力”。

1.1.7 進程狀態

每一個進程擁有自己的狀態,狀態表示了進程當前在發生什么。

在進程的執行期間進程的狀態會發生改變。一些進程的狀態如下:

TASK_RUNNING

在此狀態下,表示進程正在CPU中運行或在隊列中等待運行(運行隊列)。

TASK_STOPPED

在此狀態下的進程被某些信號(如SIGINT,SIGSTOP)暫停。進程正在等待通過一個信號恢復運行,例如SIGCONT。

TASK_INTERRUPTIBLE

在此狀態下,進程被暫停并等待一個某些條件狀態的到達。如果一個進程處于TASK_INTERRUPTIBLE狀態并接收到一個停止的信號,進程的狀態將會被改變并中斷操作。一個典型的TASK_INTERRUPTIBLE狀態的進程的例子是一個進程等待鍵盤中斷。

TASK_UNINTERRUPTIBLE

與TASK_INTERRUPTIBLE相似。當一個進程處于?TASK_UNINTERRUPTIBLE狀態可以被中斷,向處于TASK_UNINTERRUPTIBLE狀態的進程發送一個信號不會發生任何操作。一個TASK_UNINTERRUPTIBLE進程的典型的例子是等待磁盤I/O操作。

TASK_ZOMBIE

當一個進程調用exit()系統調用退出后,它的父進程應該知道該進程的終止。處于TASK_ZOMBIE狀態的進程會等待其父進程通知其釋放所有的數據結構。

圖1-6 進程狀態

僵尸進程

當一個進程接收到一個信號而終止,它在結束自己之前,通常需要一些時間來結束所有的任務(例如關閉打開的文件)。在這個通常非常短暫的時間內,該進程就是一個僵尸進程。

進程已經完成所有的關閉任務后,它會向父進程報告其即將終止。有些時候,一個僵尸進程不能把自己終止,這將會引導它的狀態顯示為z(zombie)。

使用kill命令來關閉這樣的一個進程是不可能的,因為該進程已經被認為已經死掉了。如果你不能清除僵尸進程,你可以結束其父進程,然后僵尸進程也隨之消失。但是,如果父進程為init進程,你不能結束它。init進程是一個非常重要的進程,因此可能需要重啟系統來清除僵尸進程。

1.1.8 進程內存段

進程使用其自身的內存區域來執行工作。工作的變化根據情況和進程的使用而決定。進程可以擁有不同的工作量特性和不同的數據大小需求。進程必須處理各種數據大小。為了滿足需求,Linux內核為每個進程使用動態申請內存的機制。進程內存分配的數據結構如圖1-7所示。

圖1-7 進程地址空間

進程內存區由以下幾部分組成:

Text段

該區域用于存儲運行代碼。

Data段

數據段包括三個區域。

– Data:該區域存儲已被初始化的數據,如靜態變量。– BSS:該區域存儲初始化為0的數據。數據被初始化為0。– Heap:該區域用于根據需求使用malloc()動態申請的內存。堆向高地址方向增長。

Stack段

該區域用于存儲局部變量、函數參數和返回函數的地址。棧向低地址方向增長。

用戶進程的地址空間內存分布可以使用pmap命令來查看。你可以使用ps命令來查看內存段的大小??梢詤㈤?.3.10的“pmap”,“ps和pstree”。

1.1.9 Linux CPU調度

任何的計算機的基本功能都非常簡單,就是計算。為了能夠計算,它意味著必須管理計算資源或處理器和計算任務,也就是我們所知道的線程或進程。感謝Ingo Molnar的巨大貢獻,Linux內核使用一個O(1)的算法代替以前的O(n)的CPU調度算法。O(1)指的是一種靜態的算法,意味著選擇一個進程并執行所花費的時間是一個常數,不管進程的數量的大小。

新的調度算法的擴展性非常好,不管進程的數量或者處理器的數量是多少,系統的開銷都是非常少的。該算法使用兩個進程優先級數組:

active(活動的)

expired(過期的)

調度器根據進程的優先級和優先攔截率為進程分配時間片,然后進程以優先級順序放置到active數組內。當進程時間片耗盡,進程申請一個新的時間片并放置到expired數組內。當active數組中的所有進程的時間片耗盡,這兩個數組進行切換,重新運行該算法。對于一般的交互式進程(相對于實時進程),擁有高優先級的進程通常比低優先級的進程得到更長的時間片和更多的計算時間,但這并不表示低優先級的進程會被完全忽略(餓死)。該算法的優勢是為擁有大量線程和進程并擁有多處理器的企業級環境提升Linux內核的擴展性。該O(1)的新CPU調度器是為內存2.6設計的,但是現在已經移植到2.4系列中。圖1-8說明了Linux CPU如何調度工作。

圖1-8 Linux內核2.6 O(1)調度器

新調度器的另一個顯著改進是支持非一致性內存架構(NUMA)和對稱多線程處理器,例如Intel超線程技術。

改進后的NUMA支持確保只有某個節點過載時,負載平衡才會跨越某個NUMA節點。這個機制確保了在NUMA系統相對比較緩慢的擴展鏈接流量的最小化。盡管每個調度節拍時負載平衡會遍歷調度域群組中的處理器,但只有在節點過載并請求負載平衡時,負載才會跨越調度域轉移。

圖1-9 O(1)CPU調度器結構

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    18563

    瀏覽量

    224074
  • Linux
    +關注

    關注

    87

    文章

    11025

    瀏覽量

    207145
  • 線程
    +關注

    關注

    0

    文章

    496

    瀏覽量

    19537

原文標題:運維架構師進階:Linux進程管理

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Linux開發_Linux進程編程

    介紹Linux進程概念、進程信號捕獲、進程管理相關的命令的使用等知識點。
    的頭像 發表于 09-17 15:38 ?1155次閱讀
    <b class='flag-5'>Linux</b>開發_<b class='flag-5'>Linux</b>下<b class='flag-5'>進程</b>編程

    Linux 查看進程和刪除進程

    1. 在 LINUX 命令平臺輸入 1-2 個字符后按 Tab 鍵會自動補全后面的部分(前提是要有這個東西,例如在裝了 tomcat 的前提下, 輸入 tomcat 的 to 按 tab)。2.
    發表于 04-24 00:04

    Linux學習雜談】之進程的誕生和消失

    的過程,是一個程序的一次執行過程。(1)程序的消亡有兩種方式,分別是正常終止和異常終止。正常終止就是說我們執行到了return 0或者是exit(1),然后程序結束,這屬于正常的程序的生命周期。那么對于
    發表于 09-01 20:38

    Linux下的進程結構

    進程不但包括程序的指令和數據,而且包括程序計數器和處理器的所有寄存器及存儲臨時數據的進程堆棧,因此正在執行的進程包括處理器當前的一切活動。 因為Linux是一個多
    發表于 05-27 09:24

    詳解linux進程管理

    進程需要了解 進程,父進程,進程組,會話和控制終端的相關概念。進程和父進程:每個
    發表于 08-07 08:28

    Linux進程管理

    Linux進程管理
    發表于 05-20 10:53

    LINUX下的進程管理問題如何解決

    基于LINUX下的進程管理問題
    發表于 05-20 07:58

    linux系統進程存在狀態及管理

    linux系統進程存在狀態及管理詳解
    發表于 05-21 06:28

    Linux進程管理

    Linux進程管理 本章主要介紹進程的概念、狀態、構成以及Linux進程的相關知識。 掌握
    發表于 04-28 14:57 ?0次下載

    Linux守護進程詳解

    較長的進程,通常獨立于控制終端并且周期性地執行某種任務或等待處理某些發生的事件。守護進程常常在系統引導載入時啟動,在系統關閉時終止。Linux有很多系統服務,大多數服務都是通過守護
    發表于 10-18 14:24 ?0次下載
    <b class='flag-5'>Linux</b>守護<b class='flag-5'>進程</b>詳解

    基于Linux進程管理的詳細剖析

    上一篇,我們講到了Linux內核開發和應用程序開發,今天我們來講講Linux重點部分Linux進程管理。
    的頭像 發表于 01-26 11:24 ?3531次閱讀
    基于<b class='flag-5'>Linux</b><b class='flag-5'>進程</b><b class='flag-5'>管理</b>的詳細剖析

    Linux進程管理:什么是進程?

    一個線程是一個單獨的進程生成的一個執行單元。它與其他的線程并行地運行在同一個進程中。各個線程可以共享進程的資源,例如內存、地址空間、打開的文件等等。它們能訪問相同的程序數據集。線程也被叫作輕量級
    的頭像 發表于 05-01 17:27 ?4334次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進程</b><b class='flag-5'>管理</b>:什么是<b class='flag-5'>進程</b>?

    有效管理進程的8個Linux命令分享

    一般來說,應用程序進程生命周期有三種主要狀態:啟動、運行和停止。如果我們想成為稱職的管理員,每個狀態都可以而且應該得到認真的管理。這八個命令可用于
    的頭像 發表于 10-05 09:10 ?2215次閱讀

    可用于管理進程的整個生命周期的八個Linux命令

    一般來說,應用程序進程生命周期有三種主要狀態:啟動、運行和停止。如果我們想成為稱職的管理員,每個狀態都可以而且應該得到認真的管理。這八個命令可用于
    的頭像 發表于 10-02 17:22 ?3370次閱讀
    可用于<b class='flag-5'>管理</b><b class='flag-5'>進程</b>的整個<b class='flag-5'>生命周期</b>的八個<b class='flag-5'>Linux</b>命令

    Linux性能及調優指南:進程管理

    。圖1-2task_struct結構體1.1.2 進程生命周期每一個進程都有其生命周期,例如創建、運行、終止和消除。這些階段會在系統啟動和運行中重復無數次。因此,
    發表于 04-02 14:40 ?257次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>