進程理論和相關工具的使用

內核的功用

進程管理、文件系統、網絡功能、內存管理、驅動程序、安全功能等 
    Process: 運行中的程序的一個副本,是被載入內存的一個指令集合 
進程ID(Process ID,PID)號碼被用來標記各個進程 
    UID、GID、和SELinux語境決定對文件系統的存取和訪問權限, 
通常從執行進程的用戶來繼承 
    存在生命周期 
task struct:
    Linux內核存儲進程信息的數據結構格式 
task list:
    多個任務的的task struct組成的鏈表 
進程創建: 
    init:第一個進程  centos6       centos7上使用的是 systemd
父子關系 
    進程:都由其父進程創建
    CoW fork(), clone()

進程優先級: 
系統優先級:數字越小,優先級越高 
    0-139(CentOS4,5) 
各有140個運行隊列和過期隊列 
    0-98,99(CentOS6) 

實時優先級: 
    99-0:值最大優先級最高 

nice值:
    -20到19,
    對應系統優先級100-139或99 
Big O:時間復雜度,
    用時和規模的關系 O(1), O(logn), O(n)線性, O(n^2)拋物線, O(2^n)

進程內存: 
    Page Frame: 頁框,用存儲頁面數據,存儲Page 4k 
    LRU:Least Recently Used 近期最少使用算法,釋放內存 
物理地址空間和線性地址空間 
    MMU:Memory Management Unit負責轉換線性和物理地址 
    TLB:Translation Lookaside Buffer 翻譯后備緩沖器,用于保存虛擬地址和物理地址映射關系的緩存 
    IPC: Inter Process Communication 
同一主機: 
    signal:信號 
    shm: shared memory 
    semaphore:信號量,一種計數器 
不同主機:
    rpc: remote procedure call 
    socket: IP和端口號

進程狀態

Linux內核:搶占式多任務
進程類型: 
    守護進程: daemon,在系統引導過程中啟動的進程,和終端無關進程  (在終端執行程序不影響,開機自動啟動的叫守護進程)
    前臺進程:跟終端相關,通過終端啟動的進程 (終端被占用,無法進行其它操作)
注意:兩者可相互轉化 
進程狀態: 
    運行態:running 
    就緒態:ready 
    睡眠態: 
    可中斷:interruptable 
    不可中斷:uninterruptable 
    停止態:stopped,暫停于內存,但不會被調度,除非手動啟動 
    僵死態:zombie,結束進程,父進程結束前,子進程不關閉

進程的分類

CPU-Bound:CPU密集型,非交互 
IO-Bound:IO密集型,交互 
Linux系統狀態的查看及管理工具:
    pstree, ps, pidof, pgrep, top, htop, glance, pmap, vmstat, dstat, kill, 

    pkill, job, bg, fg, nohup 

pstree命令: 
pstree – display a tree of processes 
ps: process state 
ps – report a snapshot of the current processes 
Linux系統各進程的相關信息均保存在/proc/PID目錄下的各文件中(每PID代表每一個進程)

top 

排序:(進入命令后) 
P:以占據的CPU百分比,%CPU 
M:占據內存百分比,%MEM 
T:累積占據CPU時長,TIME+ 
首部信息顯示: (進入命令后) 顯示或隱藏
uptime信息:l命令 
tasks及cpu信息:t命令 
cpu分別顯示:1 (數字)  顯示總的,還是單個顯示(多核)
memory信息:m命令 
退出命令:q   (下面都在命令當中修改刷新間隔)
修改刷新時間間隔:s  輸入s  再指定PID
終止指定進程:k 
保存文件:W

欄位信息簡介  CPU
us:用戶空間 
sy:內核空間 
ni:調整nice時間 
id:空閑 
wa:等待IO時間 
hi:硬中斷 
si:軟中斷(模式切換) 
st:虛擬機偷走的時間

在命令輸入之前就指定相關參數
選項: 
   -d #: 指定刷新時間間隔,默認為3秒 
   -b: 全部顯示所有進程 
   -n #: 刷新多少次后退出

PID — 進程id
USER — 進程所有者
PR — 進程優先級
NI — nice值。負值表示高優先級,正值表示低優先級
VIRT — 進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES
RES — 進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA
SHR — 共享內存大小,單位kb
S — 進程狀態。D=不可中斷的睡眠狀態 R=運行 S=睡眠 T=跟蹤/停止 Z=僵尸進程
%CPU — 上次更新到現在的CPU時間占用百分比
%MEM — 進程使用的物理內存百分比
TIME+ — 進程使用的CPU時間總計,單位1/100秒
COMMAND — 進程名稱(命令名/命令行)

htop 

    top的增強版(要安裝)

htop命令:需從Fedora-EPEL源安裝 http://172.16.0.1/fedora-epel/7/x86_64 
選項: 
-d #: 指定延遲時間; 
-u UserName: 僅顯示指定用戶的進程 
-s COLUME: 以指定字段進行排序 
子命令: 
s: 跟蹤選定進程的系統調用 
l: 顯示選定進程打開的文件列表 
a:將選定的進程綁定至某指定CPU核心 
t: 顯示進程樹

ps 

ps [OPTION]… 
支持三種選項: 
  UNIX選項 如-A -e 
  BSD選項 如a 
  GNU選項 如–help 

選項:默認顯示當前終端中的進程 
a 選項包括所有終端中的進程 
x 選項包括不鏈接終端的進程 
u 選項顯示進程所有者的信息 
f 選項顯示進程的父進程 
k|–sort 屬性 對屬性排序 
o 屬性… 選項顯示定制的信息 
pid、comm、%cpu、%mem、state、tty、euser、ruser

進程管理工具
VSZ: Virtual memory SiZe,虛擬內存集,線性內存  (操作系統承諾給你多少內存給你分配了)
RSS: ReSident Size, 常駐內存集  (真正物理內存分配出來的大?。?br />STAT:進程狀態 
R:running 
S: interruptable sleeping  可中斷的休眠
D: uninterruptable sleeping 
T: stopped 
Z: zombie 
+: 前臺進程 
l: 多線程進程 
L:內存分頁并帶鎖 
N:低優先級進程 
<: 高優先級進程 
s: session leader,會話(子進程)發起者

常用組合:-ef  
-e: 顯示所有進程 
-f: 顯示完整格式程序信息 
常用組合:-eFH 
-F: 顯示更完整格式的進程信息 
-H: 以進程層級格式顯示進程相關信息 
常用組合:自定義 
-eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm 
axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
euid  正在執行的用戶(SUID實別不出來)
ruid  真正執行的用戶(SUID實別出來)

進程優先級
ni: nice值 
pri: priority 優先級 
psr: processor  CPU編號 
rtprio: 實時優先級 
示例:ps axo pid,cmd,psr,ni,pri,rtprio
pri  nice優先級 默認19
psi 系統優先級 默認0

進程優先級調整: 
靜態優先級:100-139 
進程默認啟動時的nice值為0,優先級為120 
只有根用戶才能降低nice值(提高優先性) 

nice命令: nice [OPTION] [COMMAND [ARG]…] 
renice命令: renice [-n] priority pid… 
例:renice -n 10 pid 
注:root用戶可以隨意調整大小
基本用戶調整,只能調大
查看: ps axo pid,comm,ni
可能在創建文件時,直接給定優先級
例: nice -n 5  vim xdg

搜索進程
最靈活:ps 選項 | 其它命令 
按預定義的模式:pgrep 
pgrep [options] pattern 
-u uid: effective user 生效者 
-U uid: real user 真正發起運行命令者 
-t terminal: 與指定終端相關的進程 
-l: 顯示進程名 
-a: 顯示完整格式的進程名 
-P pid: 顯示指定進程的子進程 
注:pgrep -lu wang 
u 后面要直接跟用戶 (順序不能的換)

按確切的程序名稱:/sbin/pidof 
pidof bash
查看PID

例:ps -C f1.sh -C f2.sh  o  pid,cmd,%cpu,%mem
-C 指定文件名
查看多個進程
注:在腳本當中,shebang機制 –> #!/bin/bash
要加入,不加的話,在ps查看進程的時候,查看不到f1.sh這個名字,只能看到bash
注:跟pgrep不同

kill命令 

向進程發送控制信號,以實現對進程管理,每個信號對應一個數字,
信號名稱以SIG開頭(可省略),不區分大小寫 

顯示當前系統可用信號: kill –l,trap -l 
常用信號:man 7 signal 
1) SIGHUP: 無須關閉進程而讓其重讀配置文件 
2) SIGINT: 中止正在運行的進程;相當于Ctrl+c 
3) SIGQUIT:相當于ctrl+\   相當于quit
9) SIGKILL: 強制殺死正在運行的進程 
15) SIGTERM:終止正在運行的進程    默認的信號(有些進程終止不了)
18) SIGCONT:繼續運行 
19) SIGSTOP:后臺休眠 
注: kill -0  PID   不發任何信號,判斷當前進程是否正常運行
正常運行 echo $?  –> 0

指定信號的方法: 
(1) 信號的數字標識:1, 2, 9 
(2) 信號完整名稱:SIGHUP 
(3) 信號的簡寫名稱:HUP
注:在傳輸信息的時候,上面的三種方式都可以表示出來

按PID:
kill [-SIGNAL]  pid … 
kill –n SIGNAL pid
kill –s SIGNAL pid 
其中-s 9 制定了傳遞給進程的信號是9,即強制、盡快終止進程。
按名稱:
killall [-SIGNAL]  comm… 
例: killall -0 httpd  &> /dev/nul || service httpd restart
       -0信號檢查該進程是否啟動

killall命令用于殺死指定名字的進程(kill processes by name)。
我們可以使用kill命令殺死指定進程PID的進程,如果要找到我們需要殺死的進程,
我們還需要在之前使用ps等命令再配合grep來查找進程,而killall把這兩個過程合二為一。
killall 信號  commond

按模式:
pkill [options] pattern 
-SIGNAL -u uid: effective user,生效者 
-U uid: real user,真正發起運行命令者 
-t terminal: 與指定終端相關的進程 
-l: 顯示進程名(pgrep可用) 
-a: 顯示完整格式的進程名(pgrep可用) 
-P pid: 顯示指定進程的子進程

vmstat

命令:虛擬內存信息 

vmstat [options] [delay [count]] 
例:vmstat  2  5  顯示內存信息  刷新間隔2s  刷新5次結束

procs: 
r:可運行(正運行或等待運行)進程的個數,和核心數有關 
b:處于不可中斷睡眠態的進程個數(被阻塞的隊列的長度) 

memory: 
swpd: 交換內存的使用總量 
free:空閑物理內存總量 
buffer:用于buffer的內存總量 
cache:用于cache的內存總量

swap: 
si:從磁盤交換進內存的數據速率(kb/s) 
so:從內存交換至磁盤的數據速率(kb/s)
注:相對于內存來說
io:
bi:從塊設備讀入數據到系統的速率(kb/s) 
bo: 保存數據至塊設備的速率
注:相對于內存來說

system: 
in: inter rupts  中斷速率,包括時鐘 
cs: context switch  進程切換速率 

cpu: 
us:Time spent running non-kernel code 
sy: Time spent running kernel code 
id: Time spent idle. Linux 2.5.41前,包括IO-wait time. 
wa: Time spent waiting for IO.  2.5.41前,包括in idle. 
st: Time stolen from a virtual machine.  2.6.11前, unknown. 

iostat

統計CPU和設備IO信息 

示例:iostat 1 10    刷新間隔1s  刷新10次結束
例:
Device:    tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
     每秒鐘的事務   讀速度       寫速度       總量讀    總量寫

pmap命令:進程對應的內存映射(顯示進程使用哪塊內存空間) 
pmap [options] pid […] 
     -x: 顯示詳細格式的信息 
例:pmap -x 1    1:PID
     或pmap  1
另外一種實現: 
    cat /proc/PID/maps

原創文章,作者:_xddggg,如若轉載,請注明出處:http://www.www58058.com/85536

(0)
_xddggg_xddggg
上一篇 2017-08-28
下一篇 2017-08-28

相關推薦

  • Linux計算機基礎-入門2016-07-19

    Linux計算機基礎-入門2016-07-19 計算機系統的組成部分 計算機系統由硬件系統和軟件系統兩大部分組成 硬件系統 馮.諾依曼體系結構: 1946年數學家馮.諾依曼提出運算器,控制器,存儲器,輸入設備,輸出設備。 具體變現為一下硬件: 運算器,控制器  ——>  CPU 存儲器  …

    Linux干貨 2016-08-04
  • 使用yum源碼編譯安裝程序

    需要的安裝包:httpd-2.2.29.tar.bz2 1、安裝develpment tools     yum groupinstall "Development Tools" 2、下載服務器中的http源安裝包到本地,然后解壓到指定文件夾中 lftp 10.1.0.1:/pub/Sources/…

    Linux干貨 2016-08-24
  • 一個“蠅量級” C 語言協程庫

    協程(coroutine)顧名思義就是“協作的例程”(co-operative routines)。跟具有操作系統概念的線程不一樣,協程是在用戶空間利用程序語言的語法語義就能實現邏輯上類似多任務的編程技巧。實際上協程的概念比線程還要早,按照 Knuth 的說法“子例程是協程的特例”,一個子例程就是一次子函數調用,那么實際上協程就是類函數一樣的程序組件,你可以…

    Linux干貨 2016-08-15
  • 硬鏈接和軟鏈接的說明

    1、硬鏈接和軟鏈接的區別    (1)、原理上:                   【1】 硬鏈接(hard link):                 &…

    2017-07-21
  • 初識linux

    Linux 是什么?2014年之前我都沒有聽說過linux。 簡單來說,Linux是一種操作系統,我們知道Windows吧,Linux也是一種操作系統。 特性: (1)字符界面(當然現在也有圖形界面了) (2)一切皆文件 (3)許多小工具程序組合 Linux脫胎于Unix,Unix是由貝爾實驗開發的。符合posix 標準,Unix系統上面的應用程序大部分可以…

    Linux干貨 2016-06-01
  • Mysql 報錯解決–PID file could not be found!

    今天想把之前在cetnos6上編譯安裝的mariadb改下PATH環境變量,操作幾次之后,關閉或重啟mysql就失敗了,提示如下: [root@web1 ~]# service mysqld stop MySQL server PID file could not&nb…

    系統運維 2016-09-19
欧美性久久久久