linux 不可中断的进程,不可中断进程和僵尸进程
什么是不可中斷狀態(tài)
當(dāng) iowait 升高時(shí),進(jìn)程很可能因?yàn)榈貌坏接布捻憫?yīng),而長(zhǎng)時(shí)間處于不可中斷狀態(tài)。從 ps 或者 top 命令的輸出中,可以發(fā)現(xiàn)它們都處于 D 狀態(tài),也就是不可中斷狀態(tài) (Uninterruptible Sleep)。
不可中斷狀態(tài),表示進(jìn)程正在跟硬件交互,為了保護(hù)進(jìn)程數(shù)據(jù)和硬件的一致性,系統(tǒng)不允許其他進(jìn)程或中斷打斷這個(gè)進(jìn)程。進(jìn)程長(zhǎng)時(shí)間處于不可中斷狀態(tài),通常表示系統(tǒng)有 I/O 性能問題。
中斷其實(shí)是一種異步的事件處理機(jī)制,可以提高系統(tǒng)的并發(fā)處理能力。
由于中斷處理程序會(huì)打斷其他進(jìn)程的運(yùn)行,所以,為了減少對(duì)正常進(jìn)程運(yùn)行調(diào)度的影響,中斷處理程序就需要盡可能快地運(yùn)行。如果中斷本身要做的事情不多,那么處理起來也不會(huì)有太大問題;但如果中斷要處理的事情很多,中斷服務(wù)程序就有可能要運(yùn)行很長(zhǎng)時(shí)間。
特別是,中斷處理程序在響應(yīng)中斷時(shí),還會(huì)臨時(shí)關(guān)閉中斷。這就會(huì)導(dǎo)致上一次中斷處理完成之前,其他中斷都不能響應(yīng),也就是說中斷有可能會(huì)丟失。
舉個(gè)最常見的網(wǎng)卡接收數(shù)據(jù)包的例子:網(wǎng)卡接收到數(shù)據(jù)包后,會(huì)通過 硬件中斷 的方式,通知內(nèi)核有新的數(shù)據(jù)到了。這時(shí),內(nèi)核就應(yīng)該調(diào)用中斷處理程序來響應(yīng)它。對(duì)上半部來說,既然是快速處理,其實(shí)就是要把網(wǎng)卡的數(shù)據(jù)讀到內(nèi)存中,然后更新一下硬件寄存器的狀態(tài)(表示數(shù)據(jù)已經(jīng)讀好了),最后再發(fā)送一個(gè) 軟中斷 信號(hào),通知下半部做進(jìn)一步的處理。而下半部被軟中斷信號(hào)喚醒后,需要從內(nèi)存中找到網(wǎng)絡(luò)數(shù)據(jù),再按照網(wǎng)絡(luò)協(xié)議棧,對(duì)數(shù)據(jù)進(jìn)行逐層解析和處理,直到把它送給應(yīng)用程序。
Linux 將中斷處理過程分成了兩個(gè)階段,也就是上半部和下半部:
上半部直接處理硬件請(qǐng)求,也就是我們常說的硬中斷,特點(diǎn)是快速執(zhí)行;
而下半部則是由內(nèi)核觸發(fā),也就是我們常說的軟中斷,特點(diǎn)是延遲執(zhí)行。
Linux 中的軟中斷包括網(wǎng)絡(luò)收發(fā)、定時(shí)、調(diào)度、RCU 鎖等各種類型,可以通過查看 /proc/softirqs 來觀察軟中斷的運(yùn)行情況。
什么是僵死(僵尸)進(jìn)程
僵死(僵尸)進(jìn)程:一個(gè)進(jìn)程使用 fork 創(chuàng)建子進(jìn)程,如果子進(jìn)程退出,而父進(jìn)程并沒有調(diào)用 wait() 或 waitpid() 獲取子進(jìn)程的狀態(tài)信息,那么子進(jìn)程的進(jìn)程描述符仍然保存在系統(tǒng)中。這種進(jìn)程稱之為僵死(僵尸)。
通常,僵尸進(jìn)程持續(xù)的時(shí)間都比較短,在父進(jìn)程回收它的資源后就會(huì)消亡;或者在父進(jìn)程退出后,由 init 進(jìn)程回收后也會(huì)消亡。
短暫的僵尸狀態(tài)我們通常不必理會(huì),但進(jìn)程長(zhǎng)時(shí)間處于僵尸狀態(tài),就應(yīng)該注意了,可能有應(yīng)用程序沒有正常處理子進(jìn)程的退出。
top 命令查看進(jìn)程狀態(tài)
top 和 ps 是最常用的查看進(jìn)程狀態(tài)的工具,我們就從 top 的輸出開始。下面是一個(gè) top 命令輸出的示例,S 列(也就是 Status 列)表示進(jìn)程的狀態(tài)。
top - 21:43:31 up 28 days, 23:44, 2 users, load average: 0.02, 0.02, 0.00
Tasks: 139 total, 1 running, 138 sleeping, 0 stopped, 0 zombie
%Cpu(s): 3.2 us, 1.2 sy, 0.0 ni, 95.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 4042140 total, 1234472 free, 525152 used, 2282516 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 3169024 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4606 rabbitmq 20 0 2169848 69784 6516 S 0.3 1.7 115:20.52 beam.smp
4921 rabbitmq 20 0 7716 88 0 S 0.3 0.0 0:05.35 inet_gethost
11943 ubuntu 20 0 40504 3764 3184 R 0.3 0.1 0:00.01 top
1 root 20 0 119960 6116 4020 S 0.0 0.2 3:18.65 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:33.16 ksoftirqd/0R 是 Running 或 Runnable 的縮寫,表示進(jìn)程在 CPU 的就緒隊(duì)列中,正在運(yùn)行或者正在等待運(yùn)行。
D 是 Disk Sleep 的縮寫,也就是不可中斷狀態(tài)睡眠(Uninterruptible Sleep),一般表示進(jìn)程正在跟硬件交互,并且交互過程不允許被其他進(jìn)程或中斷打斷。
Z 是 Zombie 的縮寫,如果你玩過“植物大戰(zhàn)僵尸”這款游戲,應(yīng)該知道它的意思。它 表示僵尸進(jìn)程,也就是進(jìn)程實(shí)際上已經(jīng)結(jié)束了,但是父進(jìn)程還沒有回收它的資源(比如進(jìn)程的描述符、PID 等)。
S 是 Interruptible Sleep 的縮寫,也就是可中斷狀態(tài)睡眠,表示進(jìn)程因?yàn)榈却硞€(gè)事件 而被系統(tǒng)掛起。當(dāng)進(jìn)程等待的事件發(fā)生時(shí),它會(huì)被喚醒并進(jìn)入 R 狀態(tài)。
I 是 Idle 的縮寫,也就是空閑狀態(tài),用在不可中斷睡眠的內(nèi)核線程上。前面說了,硬件交互導(dǎo)致的不可中斷進(jìn)程用 D 表示,但對(duì)某些內(nèi)核線程來說,它們有可能實(shí)際上并沒有任何負(fù)載,用 Idle 正是為了區(qū)分這種情況。要注意,D 狀態(tài)的進(jìn)程會(huì)導(dǎo)致平均負(fù)載升高, I 狀態(tài)的進(jìn)程卻不會(huì)。
T 或者 t,也就是 Stopped 或 Traced 的縮寫,表示進(jìn)程處于暫停或者跟蹤狀態(tài)。向一個(gè)進(jìn)程發(fā)送 SIGSTOP 信號(hào),它就會(huì)因響應(yīng)這個(gè)信號(hào)變成暫停狀態(tài)(Stopped);再向它發(fā)送 SIGCONT 信號(hào),進(jìn)程又會(huì)恢復(fù)運(yùn)行(如果進(jìn)程是終端里直接啟動(dòng)的,則需要你 用 fg 命令,恢復(fù)到前臺(tái)運(yùn)行)。而當(dāng)你用調(diào)試器(如 gdb)調(diào)試一個(gè)進(jìn)程時(shí),在使用斷點(diǎn)中斷進(jìn)程后,進(jìn)程就會(huì)變成跟蹤狀態(tài),這其實(shí)也是一種特殊的暫停狀態(tài),只不過你可以用調(diào)試器來跟蹤并按需要控制進(jìn)程的運(yùn)行。
X 是 Dead 的縮寫,表示進(jìn)程已經(jīng)消亡,所以你不會(huì)在 top 或者 ps 命令中看到它。
ps 命令查看進(jìn)程狀態(tài)
root 6525 0.0 0.1 65512 6088 ? Ss Jun12 12:22 /usr/sbin/sshd -D
root 10376 0.0 0.1 99272 6944 ? Ss 21:25 0:00 sshd: ubuntu [priv]
ubuntu 10453 0.0 0.0 99272 3384 ? S 21:25 0:00 sshd: ubuntu@pts/0
root 11893 0.0 0.1 99272 6920 ? Ss 21:43 0:00 sshd: ubuntu [priv]
ubuntu 11928 0.0 0.0 99272 3348 ? S 21:43 0:00 sshd: ubuntu@pts/1
root 12913 0.0 0.0 12944 928 pts/1 S+ 21:55 0:00 grep --color=auto sshd
狀態(tài)為 Ss+ 和 D+ ,其中 S 表示可中斷睡眠狀態(tài),D 表示不可中斷睡眠狀態(tài)。s 表示 這個(gè)進(jìn)程是一個(gè)會(huì)話的領(lǐng)導(dǎo)進(jìn)程,而 + 表示前臺(tái)進(jìn)程組。
進(jìn)程組和會(huì)話。它們用來管理一組相互關(guān)聯(lián)的進(jìn)程,進(jìn)程組表示一組相互關(guān)聯(lián)的進(jìn)程,比如每個(gè)子進(jìn)程都是父進(jìn)程所在組的成員;而會(huì)話是指共享同一個(gè)控制終端的一個(gè)或多個(gè)進(jìn)程組。
比如,我們通過 SSH 登錄服務(wù)器,就會(huì)打開一個(gè)控制終端(TTY),這個(gè)控制終端就對(duì)應(yīng) 一個(gè)會(huì)話。而我們?cè)诮K端中運(yùn)行的命令以及它們的子進(jìn)程,就構(gòu)成了一個(gè)個(gè)的進(jìn)程組,其中,在后臺(tái)運(yùn)行的命令,構(gòu)成后臺(tái)進(jìn)程組;在前臺(tái)運(yùn)行的命令,構(gòu)成前臺(tái)進(jìn)程組。
上次更新 2020-01-21 11:27:17
總結(jié)
以上是生活随笔為你收集整理的linux 不可中断的进程,不可中断进程和僵尸进程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 13凯越门锁继电器在哪里_凯越中控门锁不
- 下一篇: [云炬创业学笔记]第一章创业是什么测试2