1、內存划分為:用戶空間和內核空間
1、在用戶空間里運行的進程,就是用戶進程,所屬的狀態為用戶態
2、在內核空間里運行的進程,就是系統進程,所屬的狀態為內核態
例:執行內核里的代碼的時候,就是屬於內核態。
Linux的kernel其實就是一個軟件,比較核心而已。
內核作用:
1.對cpu進行調度管理
2.對內存進行管理
3.對進程進行管理
4.對文件系統進行管理
5.對其他的硬件管理
2、內核空間的進程可以訪問用戶空間,但是用戶空間的進程不能訪問內核空間。
process是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源(內存、CPU)分配和調度的一個獨立單位。
1、進程控制塊(PCB)
是系統感知進程存在的唯一憑證,是數據結構,占用內存空間。
2、進程上下文
1、上文:已執行過的進程指令和數據在相關寄存器和堆棧中的內容稱為上文。
2、正文:正在執行的指令和數據在相關寄存器和堆棧中的內容。
3、下文:待執行的指令和數據在相關寄存器和堆棧中的內容。
進程上下文切換:
指多任務系統中,CPU的控制權由運行任務,轉移到另外一個就緒任務時所發生的事件;當前運行任務轉為就緒(或者掛起、刪除)狀態,另一個被選定的就緒任務成為當前任務。
thread只能歸屬於一個進程並且它只能訪問該進程所擁有的資源。當操作系統創建一個進程后,該進程會自動申請一個名為主線程或首要線程的線程。
簡而言之:
1、一個程序至少有一個進程,一個進程至少有一個線程;
2、線程的划分尺度小於進程,使得多線程程序的並發性高;
3、進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。
shell> echo $PPID //查看父進程ID 2100 shell> echo $$ //查看當前進程ID 2102
用於查看os進程信息。
1、ps命令查看這些數據
1、描述信息:pid 進程名 父子shell的家族關系等
2、控制信息:進程當前狀態、進程優先級等
3、資源管理信息:占多少內存,打開了多少個文件等
4、cpu現場保護結構
注意:ps命令查看靜態的進程統計信息。
2、常見ps命令
shell> ps aux 或 ps -elf
a:顯示當前終端啟動的進程
u:顯示用戶為主的進程信息
x:顯示所有進程信息
-e:顯示系統內的所有進程信息
-l:使用長格式顯示進程信息
-f:使用完整的格式顯示進程信息
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
解析:
PID 進程的ID;
%CPU 進程占用的CPU百分比;
%MEM 占用內存的百分比;
COMMAND 命令的名稱和參數
[root@localhost ~]# ps -elf
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
解析:
R 正在運行,在可中斷隊列中(就緒狀態);
S 處於休眠狀態,靜止狀態;
Z 僵屍進程不存在但暫時無法消除;
查看動態的進程排名信息。
1、命令行直接top命令
[root@localhost ~]# top
等待輸入……
h獲得幫助
1:顯示各CPU情況
P:按%CPU排序
M:按%MEM排序
空格:馬上刷新(默認3秒)
q:退出(默認的top會一直占用當前端口)
解析:load average: 0.06, 0.60, 0.48
表示系統負載,即任務隊列的平均長度。
三個數值分別為 1分鍾、5分鍾、15分鍾前到現在的平均值。(w和uptime也可以查看top的頂頭信息)
2、top命令常接選項
[root@localhost ~]# top -d 1 -n 5 -p 1
-d 1 指定刷新間隔時間為1秒
-n 5 刷新次數
-p 1 顯示指定PID為1的進程信息,如果要指定多個PID,用逗號分開
1、pstree命令:以樹型結構顯示各進程間的關系
shell> pstree
init─┬─abrtd ├─acpid ├─atd ├─auditd───{auditd} ├─automount───4*[{automount}] ├─certmonger ├─console-kit-dae───63*[{console-kit-da}] ├─crond ├─cupsd ├─dbus-daemon ├─hald─┬─hald-runner─┬─hald-addon-acpi │ │ └─hald-addon-inpu │ └─{hald} ├─irqbalance ├─login───bash ├─mcelog ├─5*[mingetty] ├─mysqld_safe───mysqld───28*[{mysqld}] ├─rpc.statd ├─rpcbind ├─rsyslogd───3*[{rsyslogd}] ├─2*[sendmail] ├─sshd─┬─sshd───bash───pstree │ └─sshd───bash───mysql ├─udevd───2*[udevd] ├─vsftpd ├─xinetd └─zabbix_agentd───5*[zabbix_agentd]
常接命令選項-p:列出進程的PID號
注意:使用{}的是進程的線程。
2、pgrep命令:根據特定條件查詢進程PID信息
[root@localhost ~]# pgrep init 1 [root@localhost ~]# pgrep -l init 1 init [root@localhost ~]# pgrep -l -u root -t pts/2
11567 bash
-l:列出進程的名稱
-u:根據進程所屬的用戶名進行查找
-t:根據進程所在的終端進行查找
……比較少用,特殊情況下會用用。
Linux內核的基本任務是調度進程,每個進程受兩個參數影響其調度。
1、優先級(priority):內核控制動態變化
值越小越早被cpu執行,用戶無法直接調整數值大小。
2、niceness:進程可被執行的優先級的修正數值(可以人工修改)
1、用nice命令開新的nice(新開啟的進程),以新的nice來啟動命令 nice -10 vi & //設置nice值為10 nice --10 vi & //設置nice值為-10
2、用renice命令設置新nice(已經存在的進程) renice 10 15132 //設置nice值為10 renice -10 15132 //設置nice值為-10
3、用top命令修改進程的優先級 先輸入r,然后輸入pid,最后輸入優先級
前台啟動:用戶輸入命令,直接執行程序
后台啟動:在命令行尾加入“&”符號,讓進程切入后台執行
bg命令:將后台停止的進程,在后台重新運行
[root@localhost lianxi]# jobs //查看后台作業信息 [1]+ Stopped vim num.txt [2]- Killed cp -i -r /mnt/* /tmp + :最新放到后台的進程 - :僅次於最新放到后台的進程
[root@localhost lianxi]# fg //將后台的進程調到前台
fg將處於后台的進程恢復到前台運行,需指定作業號,不指定作業號,將恢復有“+”標記的進程。
kill命令的實現是基於OS的“信號機制”。信號機制除了基本通知功能外,還可以傳遞附加信息。詳解參考:http://www.cnblogs.com/geaozhang/p/6874310.html
shell> kill –l #列出linux系統支持的信號種類
格式:
kill –信號代碼 PID
原理:kill命令用來發送信號(軟中斷信號),進程收到信號后采取的行動:終止、忽略、掛起
1、kill和killall的區別:
kill 后面寫進程ID,不能寫進程名
killall 后面寫進程名,不能寫進程ID,會將相同名字的進程一起殺死
2、pkill命令:根據“特定條件”終止相應的進程
-u:根據進程所屬的用戶名終止相應進程
-t:根據進程所在的終端終止相應進程
shell> pkill mysqld #強行終止mysqld服務進程