1、程序相關概念
程序:正在運作中的程式
核心功用:程序管理、檔案系統、網絡功能、記憶體管理、驅動程式、安全功能等
Process:運作中的程式的一個副本,是被載入記憶體的一個指令集合
程序 ID(Process ID,PID)号碼被用來标記各個程序
通常從執行程序的使用者來繼承,存在生命周期
task struct 任務結構表:Linux 核心存儲程序資訊的資料結構格式
task list 任務清單:多個任務的 task struct 組成的連結清單
程序建立:
都由其父程序建立,父好關系,CoW(寫時複制,不發生改變時父子都指向同一檔案;發生改變時,則複制)
init:第一個程序(centos6:init,centos7:systemd)
守護程序:随着計算機的開啟、關閉而随之開啟、關閉。
2、程序,線程和協程:
注:一個程序裡至少有一個線程;線程之間由作業系統進行排程,包括程序中使用的資源也由作業系統進行排程;協程相當于線程中的語句塊,由線程控制。
3、Page Frame:頁框,用存儲頁面資料,存儲 Page,每個程序要使用的配置設定空間
虛拟記憶體(線性記憶體):程序運作的時候以為自己擁有了全部的記憶體空間
實體位址空間和線性位址空間:
MMU:負責轉換線性和實體位址(虛拟記憶體和實體記憶體)
TLB:翻譯後備緩沖器,用于儲存虛拟位址和實體位址映射關系的緩存
LRU:近期最少使用算法,釋放記憶體
4、使用者空間和核心空間:
5、程序之間基本狀态和轉換:
建立狀态:程序在建立時需要申請一個空白 PCB(程序控制塊),向其中填寫控制和管理程序的資訊,完成資源配置設定。如果建立工作無法完成,比如資源無法滿足,就無法被排程運作,把此時程序所處狀态稱為建立狀态。
就緒狀态:程序已準備好,已配置設定到所需資源,隻要配置設定到 CPU 就能夠立即運作。
執行狀态:程序處于就緒狀态被排程後,程序進入執行狀态。
阻塞狀态:正在執行的程序由于某些事件(I/O 請求,申請緩存區失敗)而暫時無法運作,程序受到阻塞,在滿足請求時進入就緒狀态等待系統調用。
終止狀态:程序結束,或出現錯誤,或被系統終止,進入終止狀态,無法再執行。
狀态之間轉換六種情況:
運作 → 就緒:1,主要是程序占用 CPU 的時間過長,而系統配置設定給該程序占用 CPU 的時間是有限的;2,在采用搶先式優先級排程算法的系統中,當有更高優先級的程序要運作時,該程序就被迫讓出 CPU,該程序便由執行狀态轉變為就緒狀态。
就緒 → 運作:運作的程序的時間片用完,排程就轉到就緒隊列中選擇合适的程序配置設定 CPU。
運作 → 阻塞:正在執行的程序因發生某等待事件而無法執行,則程序由執行狀态變為阻塞狀态如發生了 I/O 請求。
阻塞 → 就緒:程序所等待的事件已經發生,就進入就緒隊列。
以下兩種狀态是不可能發生的:
阻塞 → 運作:即使給阻塞程序配置設定 CPU,也無法執行,作業系統在進行排程時,不會從阻塞隊列進行挑選,而是從就緒隊列中選取。
就緒 → 阻塞:就緒态根本就沒有執行,談不上進入阻塞态。
6、IPC 程序間通信: 同一主機:
pipe 管道,一個寫入管道檔案,一個讀(單向)
socket 套接字檔案,程序間交換資料(雙工工作方式)
signal 信号
shm shared memory,共享記憶體
semaphore 信号量,一種計數器,配置設定資源
不同主機:
socket ip 和端口号
RPC 遠端過程調用
MQ 消息隊列,如:Kafka , RabbitMQ,ActiveMQ
7、程序優先級
實時程序(realtime),基于 FIFO 先進先出或 RR 輪詢
非實時程序:nice 按時間片配置設定程序
取 139 個隊列,将相同優先級的放在一個隊列中,運作一個時間片後從運作隊列轉至過期隊列。輪回運作隊列和過期隊列互調,再運作。
程序優先級:系統優先級:數字越小,優先級越高0-139:各有 140 個運作隊列和過期隊列 實時優先級:99-0 值最大優先級最高
nice 值:-20 到 19,對應系統優先級 100-139
Big 0:時間複雜度,用時和規模的關系
0(1),O(logn),O(n)線性,O(n^2)抛物線,O(2^n)
8、程序狀态:
Linux 核心:搶占式多任務,按時間片配置設定任務
程序類型:
守護程序:daemon,在系統引|導過程中啟動的程序,和終端無關程序
前台程序:跟終端相關,通過終端啟動的程序,使用者執行指令等
注意:兩者可互相轉化
程序狀态:
運作态:running
就緒态:ready
睡眠态:
可中斷:interruptable
不可中斷:uninterruptable
停止态:stopped,暫停于記憶體,但不會被排程,除非手動啟動
僵死态:zombie,結束程序,父程序結束前,子程序不關閉
9、程序工具
9.1 系統管理工具:
程序的分類:
CPU-Bound:CPU 密集型,非互動
編譯安裝、大量計算等
IO-Bound:IO 密集型,互動
拷貝大檔案等 DMA:直接記憶體通路
Linux 系統狀态的檢視及管理工具:pstree,ps,pidof,pgrep,top,htop,glance,pmap,vmstat,dstat,kill,pkill,job,bg,fg,nohup
Linux 系統各程序的相關資訊均儲存在 /proc/PID 目錄下的各檔案中
9.2 程序管理工具 PS 詳解:-A ---()
f 選項顯示程序樹,相當于--|-- 屬性對屬性排序,屬性前加-%cpu、%
ps axo pid,%cpu,%mem,tty k %cpu
-C cmdlist 指定指令,多個指令用,分隔,ps -C dd -L 顯示線程
-e 顯示所有程序,相當于-A
-f 顯示完整格式程式資訊
-F 顯示更完整格式的程序資訊
-H 以程序層級格式顯示程序相關資訊
-u userlist 指定有效的使用者 ID 或名稱
-U userlist 指定真正的使用者 ID 或名稱
-g gid 或 groupname 指定有效的 gid 或組名稱
-G gid 或 groupname 指定真正的 gid 或組名稱
-p pid 顯示指 pid 的程序
--ppid pid 顯示屬于 pid 的子程序
-M 顯示 SELinux 資訊,相當于 Z
PS 輸出屬性:
VSZ:Virtual memory SiZe,虛拟記憶體集,線性記憶體
RSS:ReSident Size,常駐記憶體集
STAT:程序狀态
R:running
S:interruptable sleeping,可中斷的休眠
D:uninterruptable sleeping,不可中斷的休眠
T:stopped,停止态
Z:zombie,僵屍态
+:前台程序
|:多線程程序
L:記憶體分頁并帶鎖
N:低優先級程序
s:session leader,會話 (子程序)發起者
ps 優先級選項和常用組合:
ni:nice 值
pri:priority 優先級,和系統優先級相反
psr:processor CPU 編号,CPU(一級二級,三級[共享]緩存)
更換 CPU 緩存失效,解決:綁定程序和 CPU
taskset -p [程序 ID],檢視,指令顯示和 CPU 核數不一樣[二進制]
tackset -cp 1 [程序 ID],綁定在 1 号 CPU 上 0,4 0-4 等
pidof dd,檢視 dd 指令的程序編号
rtprio:實時優先級
# 示例:
ps axo pid,cmd,psr,ni,pri,rtprio
# 常用組合:
aux
-ef
-eFH
-eo pid,tid,class,rtprio,ni,pripsr,pcpu,stat,comm
axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,commnice -n 10 ping 192.168.129.142 # 以指定優先級運作該指令renice # 更改優先級
PS示例:- -fg -fp -f –ppid -fp ,, -ft pts/ -p - -p -o comm= - -C httpd,sshd -o pid= -eo comm,etime,user | -eo pid,ppid,cmd,%mem,%cpu --=-%mem | -eo pid,ppid,cmd,%mem,%cpu --=-%cpu | - -- -eo euser,ruser,suser,-n
搜素程序:最靈活: 選項 |----t pts/ ---/sbin/ bash
9.3 top 詳解%%+ 資訊: |-d # 指定重新整理時間間隔,預設為 ---H 線程模式,示例:top -H -p ` mysqld`
9.4 htop 詳解---|
10、記憶體管理工具
10.1 free 指令詳解記憶體空間使用狀态:free [OPTION]
-b 以位元組為機關
-m 以 MB 為機關
-g 以 GB 為機關
-h 易讀格式
-0 不顯示-/+ buffers/cache 行
-t 顯示 RAM + swap 的總和
-s n 重新整理間隔為 n 秒
-c n 重新整理 n 次後即退出cat /proc/sys/vm/drop_caches # 緩存為 0,重定向一個 3 進去清理緩存
10.2 記憶體工具 vmstat///-:Time spent idle. Linux . 前,包括 IO- IO.. 前 ,包括 .-s:顯示記憶體的統計資料
11、iostat 統計CPU和裝置IO資訊例:iostat 1 10
12、iftop 顯示帶寬使用情況,epel源例:iftop -n -i eth1
13、pmap 指令:程序對應的記憶體映射pmap [options] pid [..]
-X:顯示詳細格式的資訊例:pmap1
14、系統監控工具
glances 指令: EPEL 源-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [---t refresh] [-f ] [---d:關閉磁盤 I/-f /path/to/-o {HTML|-m:禁用 ---/-s --
dstat 指令詳解:系統資源統計
dstat 是一個可以取代vmstat,iostat,netstat和ifstat這些指令的多功能産品。# dsta --c, ----d, ---------------------top- --top---top---top-latency:延遲最大的程序;
示例1:記憶體資源使用情況
# dstat -glms --top-mem
示例2:CPU資源使用情況
# dstat -cyl --proc-count --top-cpu
iotop 指令詳解:iotop 指令是一個用來監視磁盤 I/O 使用狀況的 top 類工具 iotop 具有與 top 相似的 UI,其中包括 PID、使用者、I//-o,--only 隻顯示正在産生I/-b,---n NUM,--iter=-d SEC,--delay=SEC 設定每次監測的間隔,預設1秒,接受非整形資料例如1. -p PID,--pid=PID 指定監測的程序/-u USER,--user=USER 指定監測某個使用者産生的I/-P,---a,--accumulated 顯示累積的I/-k,--kilobytes 使用kb機關,而不是對人友好的機關。在非互動模式下,腳本程式設計有用
iotop 常用參數和快捷鍵:
-t,--time 加上時間戳,非互動非模式
-q, --quiet 禁止頭幾行,非互動模式,有三種指定方式
-q 隻在第一 次監測時顯示列名
-qq 永遠不顯示列名
-qqq 永遠不顯示I/0彙總
互動按鍵:
left 和 right 方向鍵:改變排序
r:反向排序
0:切換至選項--only
p:切換至--processes選項
a:切換至--accumulated選項
q:退出
i:改變線程的優先級
nload 檢視網絡實時吞吐量:
nload 是一個實時監控網絡流量和帶寬使用情況,以數值和動态圖展示進出的流量情況安裝: -y + 毫秒,可通過--t /s、一種是顯示 Byte/s,預設是以 Bit/s,也可不顯示/-u h|b|k|m|g|H|B|K|M|G 表示的含義:h:auto,b:Bit/s,k:kBit/s,m:MBit/s,H:auto,B:Byte/s,K:kByte/s,M:MByte/-u M eth0
lsof:list open files 檢視目前系統檔案的工具--c--d+d+D:遞歸列出目錄下被打開的檔案
lsof示例:
程序管理:
檢視由登陸使用者啟動而非系統啟動的程序
lsof /dev/pts/1
指定程序号,可以檢視該程序打開的檔案
Isof -p 9527
檔案管理:
檢視指定程式打開的檔案
Isof -c httpd
檢視指定使用者打開的檔案
Isof -u root | more
檢視指定目錄下被打開的檔案
lsof +D /var/log/
lsof +d /var/log/
參數 +D 為遞歸列出目錄下被打開的檔案,參數+d為列出目錄下被打開的檔案
恢複删除檔案:
lsof | grep delete # 檢視打開檔案(被誤删除),看到程序編号,如:11863
ll /proc/11863/fd # 檢視檔案描述符,如 4(已被删除)
cat /proc/11863/fd/4 > /data/m.txt # 重定向找回檔案
檢視所有網絡連接配接:
lsof -i -n
lsof [email protected]
通過參數 -i 檢視網絡連接配接的情況,包括連接配接的ip、端口等以及一些服務的連接配接情況,例如:sshd等。也可以通過指定 ip 檢視該 ip 的網絡連接配接情況。
檢視端口連接配接情況:
lsof -i :80 -n
通過參數 -i:端口 可以檢視端口的占用情況,-i參數還有檢視協定,ip的連接配接情況等
檢視指定程序打開的網絡連接配接:
lsof -i -n -a -p 9527
參數-i、-a、-p等,-i檢視網絡連接配接情況,-a檢視存在的程序,-p指定程序
檢視指定狀态的網絡連接配接:
lsof -n -P -i TCP -s TCP:ESTABLISHED
-n:no host names,-P:no port names,-i TCP指定協定,-s指定協定狀态通過多個參數可以清晰的檢視網絡連接配接情況、協定連接配接情況等
15、程序管理工具
kill 指令:向程序發送控制信号,以實作對程序管理每個信号對應一個數字,信号名稱以 SIG 開頭(可省略),不區分大小寫顯示目前系統可用信号:-I 或者 trap - ) SIGINT 中止正在運作的程序,相當于 Ctrl+) SIGQUIT 相當于 ctrl+)信号的數字辨別:,, aux 查到該程序 ID, - - ` bc` 按 PID: [- - - [-SIGNAL] comm... 按模式:pkill [options] pattern -------P pid:顯示指定程序的子程序
16、作業管理
Linux 的作業控制:
前台作業:通過終端啟動,且啟動後一直占據終端
背景作業:可通過終端啟動,但啟動後即轉入背景運作(釋放終端)
讓作業運作于背景:
(1)運作中的作業:Ctrl+z,停止狀态
(2)尚未啟動的作業:COMMAND &
背景作業雖然被送往背景運作,但其依然與終端相關;退出終端,将關閉背景作業。如果希望送往背景後,剝離與終端的關系:nohup COMMAND &> /dev/null &screen ; COMMAND
檢視目前終端所有作業: jobs
作業控制:fg [[%]JOB_NUM]:把指定的背景作業調回前台
bg [[%]JOB_ NUM]:讓送往背景的作業在背景繼續運作kill [%JOB_ NUM]:終止指定的作業killall -19 ping # 19 信号将背景變為背景休眠狀态killall -18 ping # 18 信号将背景休眠變為背景執行
并行運作:同時運作多個程序,提高效率方法 all.&&&
&);(f2.&);(f3.&& f2.& f3.& & & & }