進(jìn)程是加載到內(nèi)存中的指令集,進(jìn)程有進(jìn)程 ID 加以標(biāo)示
1)進(jìn)程的定義
進(jìn)程”是操作系統(tǒng)的最基本、最重要的概念之一。但迄今為止對(duì)這一概念還沒有一個(gè)確切的統(tǒng)一的描述。下面給出幾種對(duì)進(jìn)程的定義描述。進(jìn)程是程序的一次執(zhí)行。進(jìn)程是可以并行執(zhí)行的計(jì)算。進(jìn)程是一個(gè)程序與其使用的數(shù)據(jù)在處理機(jī)上順序執(zhí)行時(shí)發(fā)生的活動(dòng)。進(jìn)程是程序在一個(gè)數(shù)據(jù)集合上的運(yùn)行過程。它是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位。
2)進(jìn)程的特征
動(dòng)態(tài)性:是程序的一次執(zhí)行;并發(fā)性:進(jìn)程是可以并發(fā)執(zhí)行;獨(dú)立性:是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位;異步性:進(jìn)程間的相互制約,使進(jìn)程執(zhí)行具有間隙;結(jié)構(gòu)性:進(jìn)程是具有結(jié)構(gòu)的。
3)進(jìn)程與程序的主要區(qū)別:
(1)程序是永存的;進(jìn)程是暫時(shí)的,是程序在數(shù)據(jù)集上的一次執(zhí)行,有創(chuàng)建有撤銷,存在是暫時(shí)的;
(2)程序是靜態(tài)的觀念,進(jìn)程是動(dòng)態(tài)的觀念;
(3)進(jìn)程具有并發(fā)性,而程序沒有;
(4)進(jìn)程是競(jìng)爭(zhēng)計(jì)算機(jī)資源的基本單位,程序不是。
(5)進(jìn)程和程序不是一一對(duì)應(yīng)的: 一個(gè)程序可對(duì)應(yīng)多個(gè)進(jìn)程即多個(gè)進(jìn)程可執(zhí)行同一程序; 一個(gè)進(jìn)程可以執(zhí)行一個(gè)或幾個(gè)程序
1)定義
進(jìn)程是具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位.
線程是進(jìn)程的一個(gè)實(shí)體,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位.線程自己基本上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧),但是它可與同屬一個(gè)進(jìn)程的其他的線程共享進(jìn)程所擁有的全部資源.
2)關(guān)系
一個(gè)線程可以創(chuàng)建和撤銷另一個(gè)線程;同一個(gè)進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行.
相對(duì)進(jìn)程而言,線程是一個(gè)更加接近于執(zhí)行體的概念,它可以與同進(jìn)程中的其他線程共享數(shù)據(jù),但擁有自己的棧空間,擁有獨(dú)立的執(zhí)行序列。
3)區(qū)別
進(jìn)程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式。進(jìn)程有獨(dú)立的地址空間,一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會(huì)對(duì)其它進(jìn)程產(chǎn)生影響,而線程只是一個(gè)進(jìn)程中的不同執(zhí)行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨(dú)的地址空間,一個(gè)線程死掉就等于整個(gè)進(jìn)程死掉,所以多進(jìn)程的程序要比多線程的程序健壯,但在進(jìn)程切換時(shí),耗費(fèi)資源較大,效率要差一些。但對(duì)于一些要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線程,不能用進(jìn)程。
(1)簡(jiǎn)而言之,一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線程.
(2)線程的劃分尺度小于進(jìn)程,使得多線程程序的并發(fā)性高。
(3)另外,進(jìn)程在執(zhí)行過程中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線程共享內(nèi)存,從而極大地提高了程序的運(yùn)行效率。
(4)線程在執(zhí)行過程中與進(jìn)程還是有區(qū)別的。每個(gè)獨(dú)立的線程有一個(gè)程序運(yùn)行的入口、順序執(zhí)行序列和程序的出口。但是線程不能夠獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制。
(5)從邏輯角度來看,多線程的意義在于一個(gè)應(yīng)用程序中,有多個(gè)執(zhí)行部分可以同時(shí)執(zhí)行。但操作系統(tǒng)并沒有將多個(gè)線程看做多個(gè)獨(dú)立的應(yīng)用,來實(shí)現(xiàn)進(jìn)程的調(diào)度和管理以及資源分配。這就是進(jìn)程和線程的重要區(qū)別。
4)優(yōu)缺點(diǎn)
線程和進(jìn)程在使用上各有優(yōu)缺點(diǎn):線程執(zhí)行開銷小,但不利于資源的管理和保護(hù);而進(jìn)程正相反。同時(shí),線程適合于在SMP機(jī)器上運(yùn)行,而進(jìn)程則可以跨機(jī)器遷移。
R運(yùn)行中的進(jìn)程
S睡眠 網(wǎng)絡(luò)類的守護(hù)進(jìn)程,可自動(dòng)睡眠
T掛起(暫停)
D不可中斷進(jìn)程,一般是 I/O 申請(qǐng)失敗的進(jìn)程
Z僵尸進(jìn)程 停止執(zhí)行的進(jìn)程,未被從進(jìn)程列表中清楚
<高優(yōu)先級(jí)進(jìn)程
N低優(yōu)先級(jí)進(jìn)程
L某些頁被縮進(jìn)內(nèi)存(網(wǎng)絡(luò)時(shí)鐘服務(wù))
S父進(jìn)程
Ss睡眠中的父進(jìn)程
l多線程
+后臺(tái)進(jìn)程
1 ps 查看當(dāng)前終端的活躍進(jìn)程
[root@localhost ~]#ps aux (a 顯示所有進(jìn)程 u 顯示進(jìn)程擁有者信息 x 顯示守護(hù)進(jìn)程)
user 進(jìn)程的擁有者
pid進(jìn)程號(hào)
· USER 運(yùn)行此進(jìn)程的用戶名
· PID 該 process 的號(hào)碼。
· %CPU 該 process 使用掉的 CPU 資源百分比;
· %MEM 該 process 所占用的物理內(nèi)存百分比;
· VSZ 該 process 使用掉的虛擬內(nèi)存量 (Kbytes)
· RSS 該 process 占用的固定的內(nèi)存量 (Kbytes)
· TTY 該 process 是在那個(gè)終端機(jī)上面運(yùn)作,若與終端機(jī)無關(guān),則顯示 ?,另外,tty1-tty6 是本機(jī)上面的登入者程序,若為 pts/0 等等的,則表示為由網(wǎng)絡(luò)連接進(jìn)主機(jī)的程序。
· STAT 該程序目前的狀態(tài),Linux 進(jìn)程有 5 種基本狀態(tài):
R (正在運(yùn)行或在運(yùn)行隊(duì)列中等待) ;
S 該程序目前正在睡眠當(dāng)中 ,但可被某些訊號(hào) (signal) 喚醒。
T 該程序目前暫停了
【例】 vim a.txt 按下: ctrl+z
ctrl-c是發(fā)送 SIGINT 信號(hào),終止一個(gè)進(jìn)程
ctrl-z 是發(fā)送 SIGSTOP 信號(hào),掛起一個(gè)進(jìn)程。
Z 該程序應(yīng)該已經(jīng)終止,但是其父程序卻無法正常的終止他,造成 zombie (疆尸) 程
序的狀態(tài)
D 不可中斷狀態(tài).
< 高優(yōu)先級(jí)的
N 低優(yōu)先級(jí)的
s 包含子進(jìn)程
l 多線程
+ 前臺(tái)程序
·START 該 process 被觸發(fā)啟動(dòng)的時(shí)間;
· TIME 該 process 實(shí)際使用 CPU 運(yùn)作的時(shí)間。
· COMMAND 該程序的實(shí)際指令
[root@localhost ~]# pstree -p |more
init(1)-+-abrt-dump-oops(2149)
|-abrtd(2141)
|-acpid(1857)
|-anacron(4142)
|-atd(2206)
|-auditd(2440)---{auditd}(2441)
|-automount(1932)-+-{automount}(1933)
|
|-{automount}(1934)
顯示目錄樹形結(jié)構(gòu)
[root@localhost ~]#tree出錯(cuò),因?yàn)橄到y(tǒng)未安裝tree,我們安裝一下
[root@localhost ~]# mount /Dev/cdrom /mnt
[root@localhost ~]#rpm -ivh /mnt/Packages/tree-1.6.0-10.el7.x86_64.rpm
[root@localhost ~]#tree /boot/
/boot/
├── config-3.10.0-514.el7.x86_64
├── efi
│ └── EFI
│ ├── BOOT
│ │ ├── BOOTX64.EFI
│ │ └── fallback.efi
│ └── centos
│ ├── BOOT.CSV
│ ├── fonts
│ │ └── unicode.pf2
│ ├── gcdx64.efi
│ ├── grub.cfg
│ ├── grubenv
│ ├── grubx64.efi
│ ├── MokManager.efi
│ ├── shim-centos.efi
│ └── shim.efi
├── grub
│ └── splash.xpm.gz
├── grub2
│ ├── grubenv -> /boot/efi/EFI/centos/grubenv
│ └── themes
│ └── system
├── initramfs-0-rescue-d5c175b4421d4188ac7c786631009476.img
├──initramfs-3.10.0-514.el7.x86_64.img
├──initramfs-3.10.0-514.el7.x86_64kdump.img
├──initrd-plymouth.img
├──symvers-3.10.0-514.el7.x86_64.gz
├──System.map-3.10.0-514.el7.x86_64
├──vmlinuz-0-rescue-d5c175b4421d4188ac7c786631009476
└──vmlinuz-3.10.0-514.el7.x86_64
9 directories, 22 files
[root@localhost ~]# pgrep -U root 搜索全部屬于 root 用戶的進(jìn)程,只打印進(jìn)程號(hào) PID
[root@localhost ~]# pgrep sshd 搜索 sshd 進(jìn)程
pidof vim 查看 yes 的 pid
kill -9 `pidof vim`直接殺死 yes 進(jìn)程
擴(kuò)展:yes 命令:無限打印指定內(nèi)容
yes kklkl
作用:統(tǒng)計(jì)信息區(qū)前五行是系統(tǒng)整體的統(tǒng)計(jì)信息。
動(dòng)態(tài)進(jìn)程圖
1.第一行是任務(wù)隊(duì)列信息
同 uptime 命令的執(zhí)行結(jié)果:
[root@localhost ~]# uptime
13:22:30 up 8 min, 4 users, load average: 0.14, 0.38, 0.25
對(duì)上面的動(dòng)態(tài)進(jìn)程圖解釋一下,如下
14:16:02 當(dāng)前時(shí)間
up 57 min 系統(tǒng)運(yùn)行時(shí)間,格式為時(shí):分
5 users 當(dāng)前登錄用戶數(shù)
load average: 0.00, 0.01, 0.05 系統(tǒng)負(fù)載,即任務(wù)隊(duì)列的平均長(zhǎng)度。 三個(gè)數(shù)值分別為1 分鐘、5 分鐘、15 分鐘前到現(xiàn)在的平均值
一般來說,每個(gè) CPU 內(nèi)核當(dāng)前活動(dòng)進(jìn)程數(shù)不大于 3,則系統(tǒng)運(yùn)行表現(xiàn)良好!當(dāng)然這里說的是每個(gè) cpu 內(nèi)核,也就是如果你的主機(jī)是四核 cpu 的話,那么只要 uptime 最后輸出的一串字符數(shù)值小于 4*3=12 即表示系統(tǒng)負(fù)載不是很嚴(yán)重.
2.第二、三行為進(jìn)程和 CPU 的信息
Tasks: 154 total 進(jìn)程總數(shù)
1 running 正在運(yùn)行的進(jìn)程數(shù)
153 sleeping 睡眠的進(jìn)程數(shù)
0 stopped 停止的進(jìn)程數(shù)
0 zombie 僵尸進(jìn)程數(shù)
Cpu(s):0.0% us系統(tǒng)用戶進(jìn)程使用 CPU 百分比。 不包括調(diào)高優(yōu)先級(jí)的進(jìn)程。 CPU%是由每個(gè)用律之和算出來 的。如果你是 4 核 CPU,核 1,CPU 使用率為 100%,核 2,CPU 使用率為 100%。 則會(huì)出會(huì) CPU 高于 100%的現(xiàn)象,最終為 200%
0.0% sy 內(nèi)核中的進(jìn)程占用 CPU 百分比
0.0% ni 用戶進(jìn)程空間內(nèi)改變過優(yōu)先級(jí)的進(jìn)程占用 CPU 百分比
0.0% id 空閑 CPU 百分比
3.第四五行為內(nèi)存信息。
Mem: 1883272 total 物理內(nèi)存總量
369496 used 使用的物理內(nèi)存總量
815180 free 空閑內(nèi)存總量
698596 buff 用作內(nèi)核緩存的內(nèi)存量。和 free –k 一個(gè)意思
Swap: 2097148 total 交換區(qū)總量
0k used 使用的交換區(qū)總量
2097148 free 空閑交換區(qū)總量
1 sighup 重新讀取配置文件
9 sigkill 立即終止進(jìn)程
15sigterm 整潔終止
19 sigstop 暫停執(zhí)行
1.按 pid
kill -9 PID
2.按進(jìn)程名稱
killall -15 vim
3.查看后臺(tái)進(jìn)程情況
jobs
[root@localhost ~]# firefox &
[root@localhost ~]# jobs
[1]+ Running firefox &
fg:恢復(fù)后臺(tái)進(jìn)程到前臺(tái)并運(yùn)行
了解:
ps -ef
ps -aux 是用 BSD 的格式來顯示進(jìn)程。
ps -ef 是用標(biāo)準(zhǔn)的格式顯示進(jìn)程
PID 進(jìn)程 id
USER 進(jìn)程所有者的用戶名
NI 進(jìn)程優(yōu)先級(jí)。 nice 值。負(fù)值表示高優(yōu)先級(jí),正值表示低優(yōu)先級(jí)
RES 實(shí)際使用內(nèi)存大小。
S 進(jìn)程狀態(tài)。
D=不可中斷的睡眠狀態(tài)
R=運(yùn)行
S=睡眠
T=跟蹤/停止
Z=僵尸進(jìn)程
%CPU 上次更新到現(xiàn)在的 CPU 時(shí)間占用百分比
%MEM 進(jìn)程使用的物理內(nèi)存百分比
TIME+ 進(jìn)程使用的 CPU 時(shí)間總計(jì),單位 1/100 秒
COMMAND 命令名/命令行
1.top 快捷鍵
默認(rèn) 3s 刷新一次
空格 :立即刷新。
q 退出
M 按內(nèi)存排序
P 按 CPU 排序
<> 翻頁
補(bǔ)充 htop 比 top 更強(qiáng)大
安裝:要使用 epel 源
yum install htop
測(cè)試負(fù)載:
dd if=/dev/zero of=/dev/null
2 控制(關(guān)閉)進(jìn)程
kill 給進(jìn)程發(fā)送信號(hào)(停止進(jìn)程)
常用信號(hào):
1 HUP 重新加載配置文件。類似重啟。
2 INT 和 ctrl+c 一樣 一般用于通知前臺(tái)進(jìn)程組終止進(jìn)程
9 KILL 強(qiáng)行中斷
19 STOP 和 ctrl+z 一樣
語法:kill -9 pid
[root@localhost ~]# ps -axu | grep top
root 7678 1.0 0.1 15088 1292 pts/0 S+ 22:11 0:00 top
root 7682 0.0 0.0 103300 848 pts/1 S+ 22:11 0:00 grep top
[root@localhost ~]# kill -9 7678
killall 通過程序的名字,直接殺死所有進(jìn)程
[root@localhost ~]#killall httpd
[root@localhost ~]# ps -axu | grep httpd
或者:
[root@localhost ~]#pkill httpd
3 優(yōu)先級(jí)控制
nice 值 -20 ~ 19 越小優(yōu)先級(jí)越高 普通用戶 0-19
nice
作用:以什么優(yōu)先級(jí)運(yùn)行進(jìn)程 。默認(rèn)優(yōu)先級(jí)是 0
語法: nice -n 優(yōu)先級(jí)數(shù)字
擴(kuò)展:
vim a.txt #出現(xiàn)以下情況
E325: ATTENTION
Found a swap file by the name ".a.txt.swp"
owned by: root dated: Tue Jan 27 22:19:53 2015
[root@localhost ~]# rm -rf .a.txt.swp
【例】
# nice -n -5 vim a.txt vim 進(jìn)程以-5 級(jí)別運(yùn)行
查看:
ps -axu | grep a.txt
[root@localhost ~]# ps -axu | grep b.txt
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 24318 0.0 0.2 143624 3280 pts/4 S+ 17:00 0:00 vim b.txt
[root@localhost ~]# top -p 24318
PID USER PR S+ 17:00 0:00 vim b.txt 24318 NI VIRT RES SHR S %CPU %MEM TIME+
COMMAND
24219 root 15 -5 140m 3336 2200 S 0.0 0.3 0:00.08 vim
renice #修改正在運(yùn)行的進(jìn)程的優(yōu)先級(jí)
# renice -n 5 PID 修改進(jìn)程優(yōu)先級(jí)
【例】
#renice -n 5 24318
[root@localhost ~]# top -p 24318
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+
COMMAND 24219 root 15 5 140m 3336 2200 S 0.0 0.3 0:00.08 vim
4 前后臺(tái)進(jìn)程切換
jobs 列出所有后臺(tái)進(jìn)程
[root@localhost ~]#vim a.txt &
[1] 9714
[root@localhost ~]# jobs
[1]+ Stopped im a.txt [1] 后臺(tái)進(jìn)程序列號(hào)
fg 后臺(tái)程序改成前臺(tái)
用法: fg 后期進(jìn)程序列號(hào)
例:
[root@localhost ~]#fg 1
5 free 查看系統(tǒng)內(nèi)存量
-m 按照 MB 顯示
[root@localhost ~]# free
[root@localhost ~]# free
total used free shared buff/cache available
Mem: 1883272 395664 744196 24300 743412 1251388
Swap: 2097148 0 2097148
buffers #緩存從磁盤讀出的內(nèi)容
cached #緩存需要寫入磁盤的內(nèi)容
清空緩存:
頻繁的文件訪問會(huì)導(dǎo)致系統(tǒng)的 Cache 使用量大增
釋放緩存前最好 sync 下,防止數(shù)據(jù)丟失
/proc 是一個(gè)虛擬文件系統(tǒng),我們可以通過對(duì)它的讀寫操作作為與 kernel 實(shí)體間進(jìn)行
通信的一種手段。也就是說可以通過修改/proc 中的文件,來對(duì)當(dāng)前 kernel 的行為做出調(diào)
整。也就是說我們可以通過調(diào)整/proc/sys/vm/drop_caches 來釋放內(nèi)存
0 – 不釋放
1 – 釋放頁緩存-->用來清空最近放問過的文件頁面緩存
2 – 釋放 dentries 和 inodes-->用來清空文件節(jié)點(diǎn)緩存和目錄項(xiàng)緩存
3 – 釋放所有緩存-->用來清空 1 和 2 所有內(nèi)容的緩存。
[root@pagoda63 ~]# echo >3 /proc/sys/vm/drop_caches
課后作業(yè):仔細(xì)推敲所講的知識(shí)點(diǎn)。多練習(xí)。有問題隨時(shí)留言!我會(huì)及時(shí)回復(fù)。明天我們實(shí)戰(zhàn):screen 后臺(tái)實(shí)時(shí)執(zhí)行命令備份命令。
聯(lián)系客服