一、程序與進程
1、程序
程序是為了達到特定的目的,可以被計算機運行并且由命令代碼組成的語句序列。
程序由指令和數據組成。
指令:用于調度CPU工作,使CPU可以處理所需要的數據。
2、進程
進程是指運行中的程序。
3、程序的工作模式
所有對于硬件的操作用戶都無權訪問,如果用戶運行的程序需要訪問硬件時,需要進行系統調用,通過內核來完成對硬件的操作,此時程序將由用戶模式轉入內核模式。比如:我們想在目錄中新建一個文件夾,因為要對磁盤進行寫操作,當使用mkdir命令時,就會進行系統調用由內核來完成此操作后再將結果返回給用戶。 CPU在其內部的不同區域完成不同的功能:ring0分配給內核(kernel),ring3分配給用戶程序(user program)。
二、Linux的多用戶,多任務環境
1、內存的分配
Linux對內存采用分段、分頁的機制。
物理內存每4k劃分成一個頁框;頁框為物理內存的最小單位。
應用程序運行在自己的地址空間內,這個地址空間稱為線性地址空間,所有數據在線性地址空間內部表現為頁面的形式存放,而不是分頁的數據無法交換至swap空間。
進程訪問數據是從線性地址訪問,內核將線性地址轉換成物理地址,使得進程得以訪問到數據。
線性地址與物理地址的對應關系存放在一張表中,這引表在MMU(Memory Management Unit)中進行維護。
內核借助MMU來使得各個進程使用內核時好像是獨立的狀態;MMU完成線性地址到物理地址的轉換。
內核精心編造了一個數據結構,假如內存如果有4G的話,1G分配給內核使用,3G分配給進程使用;這個數據結構使用得每個進程都認為自己獨占3G內存。
2、進程調度
調度就是挑選進程到CPU中運行的過程。
進程調度采用的O(1)的算法復雜度,即時間恒定的算法。
CFS:完全公平調度器
3、進程的分類
CPU-Bound(CPU密集型):對于CPU占用率高的進程。
I/O-Bound(I/O密集型):等待I/O時間長的進程
4、進程優先級
CPU挑選進程是根據進程的優先級進行的,進程優先級的取值范圍為0-139。
實時優先級:0-99,數字越大,優先級越高;
靜態優先級:100-139,數字越小,優先級越高。
用戶可以通過調整nice值來改變進程的優先級。
nice值:-20-19 調整靜態優先級
進程啟動時,默認nice值為0,優先級對應為120。
動態優先級:由內核維護,動態調整。
Linux使用搶占式多任務:當時鐘信號到達時,高優先級進程可以搶占CPU。
5、進程狀態
運行態:runnnig
睡眠態:sleeping
可中斷睡眠:interruptable
不可中斷睡眠:uninterruptable,等待外部條件滿足之前無法繼續運行。
停止態:stopped,不會再被內核調度并運行。
僵死態:zombie,父進程先于子進程結束了,子進程再也不能被停掉的進程。
6、子進程
進程運行是單線運行的,進程中的指令必須順序執行。
子進程:父進程有無法完成的任務時,啟用子進程來執行,此時父進程進入睡眠,子進程執行完成后,返回父進程繼續執行。
進程創建機制:每一個進程都是由其父進程fork()自身而來。
7、進程間通信(IPC:Inter Process Communication)
同一主機:
singnal:信號。
shm:共享內存。
semerphor:旗語。
不同主機:
rpc:remote procedure calling,遠程過程調用。
socket:IP:port,套接字。
8、CPU虛擬化
就是將CPU切割為時間片(timeslice)。
保存現場:將未執行完成進程狀態保存在狀態表中。
恢復現場:將狀態表中未執行完的進程調出繼續執行。
9、線程
線程是比進程更小的可以被單獨調度的單位。
線程將進程的任務指令拆分,分配到不同的CPU上同時運行。
不過Linux中的進程都是輕量級進程,已經相當于線程的級別了。
三、Linux進程管理工具
1、查看進程樹:pstree
2、顯示進程狀態:ps
ps命令的選項參數有很多,下面只介紹常用的選項。
因為開源的原因,ps的也存在眾多的版本,CentOS6的ps命令支持兩種風格:SysV和BSD
SysV:一般帶“-”
BSD:不帶“-”
選項:
a:與終端相關的進程;
x:與終端無關的進程;
u:顯示用戶。
組合選項:aux
上圖中各字段的含義如下:
USER:進程的發起者;
PID:進程的PID;
%CPU:CPU的占用率;
%MEM:內存的占用率;
VSZ:Virtual memory size,虛擬內存空間大?。ň€性地址空間大?。?;
RSS:常駐內存集;不能被交換到swap空間中的所有數據;
TTY:終端;
STAT:進程狀態, 包括:
R:running;
S:可中斷眨睡眠;
D:不可中斷睡眠;
T:Stopped;
Z:Zombie;
s:session leader;
t:前臺進程;
l:多線程進程;
N:低優先級進程;
L:高優先級進程。
COMMAND:包含在方括號中的進程表示為內核線程。
組合選項: -ef
-e:顯示所有進程;
-f:顯示完整格式的信息。
組合選項:-eFH
-F:顯示額外信息;
-H:顯示進程的層次結構。
-o:自定義要顯示的信息。
ni:nice值;
pri:優先級;
psr:運行的CPU。
3、顯示指定進程的進程號:pgrep
常用選項:
-u USERNAME:僅顯示由指定用戶啟動的進程;
-U UID:僅顯示由指定用戶啟動的進程;
-G GID:僅顯示由指定組啟動的進程;
-t terminal:僅顯示指定終端相關的進程;
-l:同時顯示進程號和程序名。
4、顯示指定命令所啟動的進程的ID:pidof
5、實時監控進程:top
直接輸入top命令,出現以下界面:
可以在上面的界面中直接使用命令來對顯示內容進行控制:
M:根據內存百分比進行降序排序,對應的列為%MEM;
P:根據CPU百分比進行降序排序,對應的列為%CPU;
T:根據累積占用的CPU時間降序排序,對應的列為TIME+;
l:顯示或不顯示負載信息,即上圖中第一行的內容,如下圖所示:
這一行的內容表示:
10:32:08:當前系統時間;
up 18:42:服務器連續運行的時長為18小時42分鐘;
4 users:當前登錄系統的用戶數;
load average:過去1分鐘、5分鐘、15分鐘的平均負載
t:顯示或不顯示進程及CPU相關的信息,如下圖所示:
上圖為不顯示進程及CPU信息的結果。
1:數字,分別顯示各CPU的相關信息;
使用數字1可以查看不同的CPU的信息,下面說明各字段具體的含義:
us:user space,用戶運行程序時間百分比;
sy:system,用于運行內核所占用CPU的百分比;
ni:nice,用戶進程空間內改變過優先級的進程占用CPU百分比;
id:idle,空閑CPU百分比;
wa:wait io,等待IO花費的時間;
hi:hardware interrupt,硬中斷占用CPU的百分比;
si:software interrupt,軟中斷占用CPU的百分比;
st:stolen,偷走的時間百分比。
m:顯示或不顯示物理內存和交換內存信息,如下圖所示:
各字段含義如下:
Mem:物理內存;
Swap:交換分區;
buffers:緩沖區,用于減少進程之間的等待時間;
cache:CPU與內存之間的高速緩存,用于減少CPU的等時間。
k:終止指定進程;
s:修改刷新時間間隔;
q:退出。
常用選項:
-d #:指定刷新時間間隔;
-b:以批次的方式顯示top刷新;
-n #:顯示的批次;
-p PID:監控指定進程。
查看指定進程:
6、顯示虛擬內存統計信息:vmstat
各字段含義如下:
procs:
r:運行隊列的長度;
b:被阻塞(等待IO完成)隊列的長度。
memory:
swpd:從物理內存交換至swap中的數據量;
free:空閑物理內存;
buffer:緩沖,與寫相關,加速寫操作;
cache:緩存,與讀相關,加速讀操作。
swap:
si:swap in,數據進入swap中的數據速率,單位kb/s;
so:swap out,數據離開swap中的數據速率。
io:
bi:block in,從塊設備讀入的數據速率,單位kb/s;
bo:block out,保存至塊設備的數據速率。
system:
in:interrupt,中斷速率;
cs:context switch,進程切換速率。
CPU:
各字段含義與top中所表示的含義相同,此處不再贅述。
常用選項:
-s:顯示內存統計數據。
7、系統資源統計工具:dstat
命令選項:
-c:查看cpu的統計數據
-d:顯示磁盤的統計數據;
-D DISK:只顯示指定disk的統計數據;
-g:顯示page的統計數據;
-i:顯示中斷的統計數據;
-m:顯示內存的統計數據;
-l:顯示系統負載的統計數據;
-n:顯示網絡接口相關統計數據;
-N INTERFACE:顯示指定網絡接口的統計數據;
-s:顯示交換內存統計數據;
–ipc:顯示ipc消息隊列、信息和共享內存的使用狀況;
-y:顯示系統狀態數據;
-cdngy:相當于不帶參數的dstat,也相當于-a
-t:顯示時間;
網絡連接狀態統計:
–tcp:顯示tcp的個數及狀態;
–udp:顯示udp的個數及狀態;
–unix:本地通信時unix文件的個數;
–raw:raw sockets;
-f:以完整格式顯示所有信息
-v:類似于vmstat命令;
命令用法比較簡單,就不做過多的演示了。
四、調整nice值
只有管理員可以使用小于0的nice值,普通用戶調整nice值時只能增加,即只能把優先級調低。
1、直接啟動一個進程,并指定其nice值:
2、調整已運行的進程nice值
五、進程間通信
1、顯示常用信號:kill -l
2、查看各個信號的作用:man 7 signal
3、信號的調用方式
每個信號都可以使用三種方式之一在kill中進行調用:
1)數字代稱:1,2,9,15;
2)信號完整名稱:SIGHIP,SIGINT,SIGKILL,SIGTERM;
3)信號簡稱:HUP,INT,KILL,TERM;
常用信號的含義:
1) SIGHUP:讓程序重讀配置文件,而無需重啟程序;
2) SIGINT:interrupt,相當于ctrl+c,打斷正在運行中的前臺程序;
9) SIGKILL:強制終止進程;
15) SIGTERM:正常終止進程,默認選項。
4、信號調用的格式
1、kill [-SIGNAL] PID
終止所有httpd的進程。
2、killall [-SIGNAL] COMMAND
五、Linux作業控制
前臺作業:通過終端啟動,并在終止之前一直占據著終端;
后臺作業:作業啟動之后即運行于后臺,釋放前臺;
交互式模式:手動啟動的非守護進程類的程序,一般都運行于前臺。
將作業運行于后臺:
1、將運行中的作業送往后臺
Ctrl+z:將作業送往后臺,并處于停止狀態。
2、將尚未啟動的作業直接在后臺運行
COMMAND &
這種手動方式控制的作業與終端相關,如果正在運行作業的終端被退出了,作業會被終止;如果想要在終端退出后作業依然在后臺運行,則需要使用下面的命令:
nohup COMMAND &
查看當前正在運行的作業:
三個字段從左至右分別代表:作業號、作業狀態、作業命令。
作業控制命令:
fg [[%]jobnum]]:將指定的作業調回前臺;
bg [[%]jobnum]]:讓送往后臺的作業在后臺繼續運行;
kill %jobnum:終止指定的作業。
原創文章,作者:petmaster,如若轉載,請注明出處:http://www.www58058.com/2606
字體,內容,樣式,主次,樣樣具全,不得不贊