linux進程管理及工具的講解

首言

計算機實際上可以做的事情實質上非常簡單,比如計算兩個數的和,再比如在內存中尋找某個地址等等。這些最基礎的計算機動作被稱爲指令。所謂的程序,就是這樣一系列指令所構成的集合。通過程序,我們可以讓計算機完成複雜的操作。程序大多數時候被存儲爲可執行的文件。
進程是程序的一個具體實現,同一個程序可以被執行多次,每次都可以在內存中開闢獨立的空間來裝載,從而產生多個進程。不同的進程號可以擁有各自獨立的IO接口。操作系統的一個重要功能就是爲進程提供方便,比如說爲進程分配內存空間,管理進程的相關信息等等。
linux是一種動態系統,能夠適應不斷變化的計算需求。linux計算需求的表現是以進程的通用抽象爲中心的。進程可以是短期的(從命令行執行的一個命令),也可以是長期的(一種網絡服務)。因此,對進程及其調度進行一般管理就顯得極爲重要。
在用戶空間,進程是由進程標識符(PID)表示的。從用戶的角度來看,一個PID是一個數字值,可唯一標識一個進程。一個PID在進程的整個生命期間不會更改,單PID可以在進程銷燬後被重新使用。

程序:保存在硬盤,光盤等介質中的可執行代碼和數據;是靜態保存的代碼
進程:在cpu及內存中運行的動態執行的程序代碼
同一個程序可能對應多個進程
線程:有時被稱爲輕量級進程,時程序執行流的最小單位
每個運行中的程序就是一個進程,當一個程序運行時,內部可能包含了多個順序執行流,每個順序執行流就是一個線程。

一 進程和線程的區別

他們是不同的操作系統資源管理方式。進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其他進程產生影響,而線程只是一個進程中的不同執行路徑,線程有自己的堆棧和局部變量,但線程之間沒有獨立的地址空間,一個線程死掉就等於整個進程死掉。所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。對於一些要求同時進行並且又要共享某些變量的併發操作,只能用線程,不能用進程。
(1)地址空間和其它資源(如打開文件):進程間互相獨立,同一進程的各線程間共享。
(2)通信:進程間通信:共享內存,信號等;線程間通信可以直接讀寫進程數據段(如全局變量)來通信–需要進程同步和互斥手段的輔助,以保證數據的一致性。
(3)調度和切換:線程上下文切換要比進程上下文切換快的多。
(4)在多線程的OS中,進程不是一個可執行的實體。????

進程被存放在叫做任務鏈表(task list)的雙向循環鏈表中,linux內核存儲進程信息的固定格式:task struct
進程上下文切換:指多任務系統中,CPU的控制權由運行任務,轉移到另外一個就緒任務時所發生的時間;當前運行任務轉爲就緒(或者掛起,刪除)狀態,另外一個被選定的就緒任務成爲當前任務。
這裏寫圖片描述
這裏寫圖片描述

二 進程創建

在linux系統中,所有進程都是PID爲1的init進程的後代。內核在啓動的最後階段啓動init進程。該進程讀取系統的初始化腳本,並執行其他的相關程序,最終完成系統啓動的整個進程。
進程是系統中基本的執行單位(線程是最小的調度單位),可以利用fork函數創建一個新的進程。

pid_t fork(void)

fork()函數不需要參數,但返回兩次,返回值有三種情況:
(1)對於父進程,fork函數返回新的子進程ID。
(2)對於子進程,fork函數執行成功返回0
(3)如果出錯,fork函數返回-1

內核採用寫時複製技術,fork函數創建一個新的進程,並從內核中爲此進程得到一個新的可用進程ID,之後,爲這個新進程分配進程空間,並將父進程的進程空間中的內容複製到子進程的進程空間中,包括父進程的數據段+堆棧段,並與父進程共享代碼段。
fork函數之後,子進程從等待fork返回開始執行,而不是從頭開始。
注意:子進程完全複製了父進程的地址空間的內容,包括堆棧段+數據段的內容。但是,子進程並沒有複製代碼段,而是和父進程共享代碼段。代碼段是隻讀的,不存在修改的問題,因此可以共用。在創建一個子進程後,子進程的地址空間和父進程分開,父子進程是兩個獨立的進程。

linux環境下提供一個和fork函數類似的函數,可以用來創建一個共用父進程地址空間的子進程

pid_t vfork();

(1)vfork產生的子進程和父進程完全共享地址空間,包括代碼段+數據段+堆棧段。子進程對共享資源進行的修改,也會影響到父進程。
(2)vfork函數產生的子進程一定比父進程先運行。即父進程調用了vfork函數後會等待子進程運行後再運行。

三 進程優先級

PRI(0-139:)
    1-99:實時優先級;
    100-139:靜態優先級;數字越小,優先級越高;
        Nice值:-2019,表示進程可被執行的優先級的修正數值。加入nice值後,
        將會使得PRI變爲:PRI(new)=PRI(old)+nice。普通用戶只能使用+nice,
        系統管理員可以使用所有。

四 內存劃分爲:用戶空間和內核空間

在用戶空間裏運行的進程,就是用戶進程,所屬的狀態爲用戶態
在內核空間裏運行的進程,就是內核進程,所屬的狀態爲內核態
例:執行內核裏的代碼的時候,就是數與內核態。
linux的kernel其實就是一個軟件,比較核心而已。
內核作用:進程管理,文件系統,網絡功能,內存管理,驅動程序,安全功能

五 linux內核:搶佔式多任務

進程類型:
  守護進程:在系統引導過程中啓動的進程,跟終端無關的進程;
  前臺進程:跟終端相關,通過終端啓動的進程
    注意:也可把再前臺啓動的進程送往後後臺,以守護進程模式運行;

進程狀態:
  運行態:running
  就緒態:ready
  睡眠態:
    可中斷:interruptable
    不可中斷:uninterruptable
  停止態:stopped,暫停於內存中,但不會被調度,除非手動啓動;
  僵死態:zombie

進程的分類:
  CPU-Bound
  IO-Bound

六 Linux進程查看及管理的工具

pstree
pstree - display a tree of process
pstree -p :顯示其pid

注意:使用{}的是進程的線程

這裏寫圖片描述

ps: process state
ps - report a snapshot of the current process
查看靜態的進程統計信息
linux系統各進程相關信息均保存再/proc/PID目錄下的各文件中;

ps [options]...
  常用組合:aux
    u:以用戶爲中心組織進程狀態信息顯示;
    a:與終端相關的進程;
    x:與終端無關的進程;
    p]# ps aux
    USER  PID %CPU %MEM  VSZ  RSS TTY  STAT START  TIME COMMAND
      VSZ:Virtual memry SiZe,虛擬內存集
      RSS:ReSident Size,常駐內存集
      STAT:進程狀態
        R:running  S:interruptable sleeping
        D: uninteruptable sleeping  T:stopped  Z:zombie
        +:前臺進程  l:多線程進程  N:低優先級進程
        <:高優先級進程  s:session leader

  常用組合:-ef
    -e:顯示所有進程
    -f:顯示完整格式程序信息

  常用組合:-eFH
    -F:顯示完整格式的進程信息
    -H:以進程層級結構格式顯示進程相關信息

  常用組合: -eo ,axo 自定義顯示項
    -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm
    0axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
      ni:nice值
      pri:priority,優先級
      psr:processor,CPU
      rtprio:實時優先級

這裏寫圖片描述

pgrep pkill
pgrep [options] pattern
pkill [options] pattern
  -u uid: effective user
  -U uid: real user
  -t terminal: 與指定終端相關的進程
  -l:顯示進程名
  -a:顯示完整格式的進程名
  -P pid:顯示其父進程爲此處指定的進程的進程列表
pidof

根據進程名獲取其PID;
這裏寫圖片描述

top
排序:  P:以佔據CPU百分比;
       M:佔據內存百分比;
       T:累積佔據CPU時長;

首部信息提示: uptime信息: l命令
             tasks及cpu信息:t命令
                CPU分別顯示:1
             memory信息:m命令
退出命令:q
修改刷新時間間隔:s
終止指定進程:k

這裏寫圖片描述

解析:load average0.06,0.60,0.48
表示系統負載,即任務隊列的平均長度。
三個數值分別爲1分鐘,5分鐘,15分鐘前到現在的平均值。

w和uptime也可以查看top的頂頭信息

這裏寫圖片描述

htop

下載地址:https://mirrors.aliyun.com/epel/

選項:
  -d #:指定延遲時間;
  -u UserName:僅顯示指定用戶的進程;
  -s COLOMN:以指定字段進行排序;
命令:
  s:跟蹤選定進程的系統調用;
  l:顯示選定進程打開的文件列表;
  a:將選定的進程綁定至某指定CPU核心;
  t:顯示進程樹

這裏寫圖片描述

vmstat命令

顯示虛擬內存狀態
用法: vmstat [options] [delay [count]]

procs:  r:等待運行的進程的個數;
        b:處於不可終端睡眠態的進程的個數;
memory:  swpd:交換內存的使用總量;
          free:空閒物理內存總量;
          buffer:用於buffer的內存總量
          cache:用於cache的內存總量
swap:  si:數據進入swap中的數據速率(kb/s)
        so:數據離開swap中的數據速率(kb/s)
io:   bi:從塊設備讀入數據到系統的速率;
       bo:保存數據至塊設備的速率;
system: in:interrupts,中斷速率;
         cs:context switch,進程切換速率;

選項: -s:顯示內存的統計數據 /proc/meminfo
這裏寫圖片描述

kill命令
向進程發送控制信號,以實現對進程管理
顯示當前系統可用信號:
  # kill -l
  # man 7 signal

常用信號: 
  1)SIGHUP:無須關閉進程而讓其重度配置文件;
  2)SIGINT:終止正在運行的進程,相當於Ctrl+c
  9)SIGKILL:殺死正在運行的進程;
  15)SIGTERM:終止正在運行的進程;

指定信號的方法:
  (1)信號的數字標示:1292)信號完整名稱:SIGHUP
  (3)信號的簡寫名稱:HUP

向進程發信號:
  kill [-SIGNAL] PID...

終止“名稱“之下的所有進程:
  killall [-SIGNAL] Program
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章