新聞中心
Linux 是一種開源操作系統(tǒng),具有許多優(yōu)秀的特性,其中最顯眼的就是其出色的并發(fā)處理能力。在 Linux 中,進程是并發(fā)執(zhí)行的基本單位。Linux 能夠同時處理多個進程,具有響應迅速、高效利用 CPU 和內(nèi)存等優(yōu)點。本文將探討 Linux 如何處理進程并發(fā),以及如何了解它是如何同時執(zhí)行任務(wù)的。

創(chuàng)新互聯(lián)-云計算及IDC服務(wù)提供商,涵蓋公有云、IDC機房租用、雅安服務(wù)器托管、等保安全、私有云建設(shè)等企業(yè)級互聯(lián)網(wǎng)基礎(chǔ)服務(wù),聯(lián)系電話:18982081108
一、進程調(diào)度
在 Linux 中,進程調(diào)度分為兩種類型:時間片輪轉(zhuǎn)調(diào)度和優(yōu)先級調(diào)度。
1.時間片輪轉(zhuǎn)調(diào)度
時間片輪轉(zhuǎn)調(diào)度是指在多個進程之間分配時間片,依次輪流執(zhí)行,使每個進程都能夠得到公平的 CPU 時間。在 Linux 中,時間片的長度通常是 10 毫秒,經(jīng)過該時間后,進程被暫停并放入等待隊列,然后運行下一個進程。經(jīng)過一段時間后,該進程又被喚醒并獲得 CPU,如此周而復始。
2. 優(yōu)先級調(diào)度
優(yōu)先級調(diào)度是指將所有進程按照優(yōu)先級從高到低排序,優(yōu)先級高的進程優(yōu)先被執(zhí)行。在 Linux 中,進程的優(yōu)先級范圍從 -20 到 +19,其中 -20 是更高優(yōu)先級,+19 是更低優(yōu)先級??梢允褂?nice 命令來調(diào)整進程的優(yōu)先級。
二、進程狀態(tài)
在 Linux 中,每個進程都有其所處的狀態(tài),進程狀態(tài)分為五種類型:運行、等待、停止、僵尸和睡眠狀態(tài)。
1. 運行狀態(tài)
進程在運行時,處于該狀態(tài)。在調(diào)度器中,進程的狀態(tài)是可運行或正在運行。
2. 等待狀態(tài)
進程在等待某些事件時,處于該狀態(tài)。在內(nèi)核中,進程的狀態(tài)通常是不可運行的,直到等待事件發(fā)生后才能被喚醒。
3. 停止狀態(tài)
進程在遇到致命錯誤或被用戶強制停止時,處于該狀態(tài)。已經(jīng)停止的進程不再進行 CPU 執(zhí)行。
4. 僵尸狀態(tài)
進程在終止后,等待父進程調(diào)用 wt 或 wtpid 函數(shù),處于該狀態(tài)。在該狀態(tài)下,內(nèi)核仍然保留進程的一些信息,以便父進程可以對其進行處理。
5. 睡眠狀態(tài)
進程在等待一些條件滿足時,處于該狀態(tài)。睡眠狀態(tài)可以是可中斷的或不可中斷的。可中斷的狀態(tài)表明進程一旦滿足條件就會醒來,而不可中斷的狀態(tài)表明進程將一直等待條件滿足。
三、進程間通信
在 Linux 中,進程之間可以通過多種方式進行通信,例如信號、管道、共享內(nèi)存、消息隊列和套接字等。這些通信方式允許進程之間共享數(shù)據(jù)和信息,實現(xiàn)協(xié)作和同步等。
1. 信號
信號是一種通信機制,允許進程之間進行異步通信。以一個進程向另一個進程發(fā)送信號為例,發(fā)送進程使用 kill 命令發(fā)送信號,接受進程可以使用 signal 函數(shù)來處理收到的信號。
2. 管道
管道是一種單向通信方式,允許兩個相關(guān)進程之間進行有序通信。Linux 中的管道分為匿名管道和命名管道。匿名管道只能用于父子進程之間的通信,而命名管道允許無關(guān)進程之間的通信。
3. 共享內(nèi)存
共享內(nèi)存允許多個進程訪問同一段物理內(nèi)存區(qū)域。訪問共享內(nèi)存的進程可以使用指針直接訪問內(nèi)存空間,從而在進程之間共享數(shù)據(jù)。
4. 消息隊列
消息隊列是一種由內(nèi)核維護的緩沖區(qū),允許一個進程向另一個進程發(fā)送消息。Linux 中的消息隊列分為消息隊列和 POSIX 消息隊列。這兩種消息隊列都允許進程發(fā)送消息,但 POSIX 消息隊列允許發(fā)送消息的大小和數(shù)量更多。
5. 套接字
套接字是一種通用的進程間通信方式,可以在不同主機和進程之間進行通信。套接字是一種網(wǎng)絡(luò)編程的核心組件。
Linux 是一種出色的操作系統(tǒng),具有許多優(yōu)秀的特性,最顯著的是其出色的并發(fā)處理能力。在 Linux 中,進程是并發(fā)執(zhí)行的基本單位。Linux 能夠同時處理多個進程,具有響應迅速,高效利用 CPU 和內(nèi)存等優(yōu)點。對于開發(fā)人員來說,了解 Linux 進程的調(diào)度、狀態(tài)和通信機制是非常重要的,可以幫助他們編寫更高效,更可靠的應用程序。
相關(guān)問題拓展閱讀:
- 請教一個Linux多進程訪問動態(tài)庫的互斥問題
- Linux系統(tǒng)的進程調(diào)度
請教一個Linux多進程訪問動態(tài)庫的互斥問題
請教一個Linux多進程訪洞虧世問動態(tài)庫的互斥問題
首先要了解并發(fā)。
并發(fā)進程間的關(guān)系可以是無關(guān)的,也可以是有交往的。并發(fā)進程間無關(guān)是指它們是各自獨立的,即如果一個空猜進程的執(zhí)行不影響其他進程的執(zhí)行,且與其他進程的進展情況無關(guān),不需要特別的控制;并發(fā)進程間有交往是指一個進程的執(zhí)行可能影響其他進程的執(zhí)行結(jié)果,即一個進程的執(zhí)行依賴其他進程的進展情況。有交往的并發(fā)進程一定共享某些資源。
進程之間互相競爭某一個資源,這種關(guān)系就稱為進程的互斥,也就是說對于某個系統(tǒng)資源,如果一個進程正在使用,其他的進程就必須等待其用完,不能同時使用。例如,A,B兩個進程共享一臺打印機,如果系統(tǒng)已經(jīng)將打印機分配給了A進程,當B進程需要打印時因得不到打印機而阻塞,只有A進程將打印機釋放后,系統(tǒng)才將B進程喚醒,B進程才有可能獲得打印機。
并發(fā)進程使用共享資源時,納肢除了競爭之外有協(xié)作,要利用互通消息的辦法來控制執(zhí)行速度,使相互協(xié)作的進程正確工作。進程之間的相互合作來完成某一任務(wù),把這種關(guān)系稱為進程的同步。例如(生產(chǎn)者和消費者)A,B兩個進程通過一個緩沖區(qū)合作完成一項任務(wù),A進程將數(shù)據(jù)送入緩沖區(qū)后通知B進程緩沖區(qū)中有數(shù)據(jù),B進程從緩沖區(qū)中取走數(shù)據(jù)再通知A進程緩沖區(qū)現(xiàn)為空。
Linux系統(tǒng)的進程調(diào)度
Linux進程調(diào)度
1.調(diào)度方式
Linux系統(tǒng)的調(diào)度方式基本上采用“
搶占式優(yōu)先級
”方式,當進程在用戶模式下運行時,不管它是否自愿,核心在一定條件下(如該進程的時間片用完或等待I/O)可以暫時中止其運行,而調(diào)度其他進程運行。一旦進程切換到內(nèi)核模式下運行時,就不受以上限制,而一直運行下去,僅在重新回到用戶模式之前才會發(fā)生進程調(diào)度。
Linux系統(tǒng)中的調(diào)度基本上繼承了UNIX系統(tǒng)的
以優(yōu)先級為基礎(chǔ)
的調(diào)度。也就是說,兆答核心為系統(tǒng)中每個進程計算出一個優(yōu)先級,該優(yōu)先級反映了一個進程獲得CPU使用權(quán)的資格,即高優(yōu)先級的進程優(yōu)先得到運行。核心從進程就緒隊列中挑選一個優(yōu)先級更高的進程,為其分配一個CPU時間片,令其投入運行。在運行過程中,當前進程的優(yōu)先級隨時間喊悄遞減,這樣就實現(xiàn)了“負反饋”作用,即經(jīng)過一段時間之后,原來級別較低的進程就相對“提升”了級別,從而有機會得到運行。當所有進程的優(yōu)先級都變?yōu)?(更低)時,就重新計算一次所有進程的優(yōu)先級。
2.調(diào)度策略
Linux系統(tǒng)針對不同類別的進程提供了3種不同的調(diào)度策略,即SCHED_FIFO、SCHED_RR及SCHED_OTHER。其中,SCHED_FIFO適合于
短實時進程
,它們對時間性要求比較強,而每次運行所需的時間比較短。一旦這種進程被調(diào)度且開始運行,就一直運行到自愿讓出CPU或被優(yōu)先級更高的進程搶占其執(zhí)行權(quán)為止。
SCHED_RR對應“時間片輪轉(zhuǎn)法”,適合于每次運行需要
較長時間的實時進程
。一個運行進程分配一個時間片(200 ms),當時間片用完后,CPU被另外進程搶占,而該進程被送回相同優(yōu)先級隊列的末尾,核心動態(tài)調(diào)整用戶態(tài)進程的優(yōu)先級。這樣,一個進程從創(chuàng)建到完成任務(wù)后終止,需要經(jīng)歷多次反饋循環(huán)。當進程再次被調(diào)度運行時,它就從上次斷點處開始繼續(xù)執(zhí)行。
SCHED_OTHER是傳統(tǒng)的UNIX調(diào)度策略,適合于交互式的
分時進程
。這類進程的優(yōu)先級取決于兩個因素:一個是進程剩余時間配額,如果進程用完了配給的時間,則相應優(yōu)先級降到0;另一個是進程的優(yōu)先數(shù)nice,這是從UNIX系統(tǒng)沿襲下來的方法,優(yōu)先數(shù)越小,其優(yōu)先級越高。nice的取值范圍是-20 19。用戶可以利用nice命令設(shè)定進程的nice值。但一般用戶只能設(shè)定正值,從而主動降低其優(yōu)先級;只有特權(quán)用戶才能把nice的值設(shè)置為負數(shù)。進程的優(yōu)先級就是以上二者之和。
后臺命令對應后臺進程(又稱后臺作業(yè))。后臺進程的優(yōu)先級低于任何交互(前臺)進程的優(yōu)先級。所以,只有當系統(tǒng)中當前不存在可運行的交互進程時,才調(diào)度后臺進程運行。后臺進程往往按批處理方式調(diào)鄭猜渣度運行。
3.調(diào)度時機
核心進行進程調(diào)度的時機有以下5種情況:
(1)當前進程調(diào)用系統(tǒng)調(diào)用nanosleep( )或者pause( ),使自己進入睡眠狀態(tài),主動讓出一段時間的CPU的使用權(quán)。
(2)進程終止,永久地放棄對CPU的使用。
(3)在時鐘中斷處理程序執(zhí)行過程中,發(fā)現(xiàn)當前進程連續(xù)運行的時間過長。
(4)當喚醒一個睡眠進程時,發(fā)現(xiàn)被喚醒的進程比當前進程更有資格運行。
(5)一個進程通過執(zhí)行系統(tǒng)調(diào)用來改變調(diào)度策略或者降低自身的優(yōu)先級(如nice命令),從而引起立即調(diào)度。
4.調(diào)度算法
進程調(diào)度的算法應該比較簡單,以便減少頻繁調(diào)度時的系統(tǒng)開銷。Linux執(zhí)行進程調(diào)度時,首先查找所有在就緒隊列中的進程,從中選出優(yōu)先級更高且在內(nèi)存的一個進程。如果隊列中有實時進程,那么實時進程將優(yōu)先運行。如果最需要運行的進程不是當前進程,那么當前進程就被掛起,并且保存它的現(xiàn)場—— 所涉及的一切機器狀態(tài),包括程序計數(shù)器和CPU寄存器等,然后為選中的進程恢復運行現(xiàn)場。
(二)Linux常用調(diào)度命令
· nohup命令
nohup命令的功能是以忽略掛起和退出的方式執(zhí)行指定的命令。其命令格式是:
nohup command [arguments]
其中,command是所要執(zhí)行的命令,arguments是指定命令的參數(shù)。
nohup命令告訴系統(tǒng),command所代表的命令在執(zhí)行過程中不受任何結(jié)束運行的信號(hangup和quit)的影響。例如,
$ nohup find / -name exam.txt -print>f1 &
find命令在后臺運行。在用戶注銷后,它會繼續(xù)運行:從根目錄開始,查找名字是exam.txt的文件,結(jié)果被定向到文件f1中。
如果用戶沒有對輸出進行重定向,則輸出被附加到當前目錄的nohup.out文件中。如果用戶在當前目錄中不具備寫權(quán)限,則輸出被定向到$HOME/nohup.out 中。
· at命令
at命令允許指定命令執(zhí)行的時間。at命令的常用形式是:
at time command
其中,time是指定命令command在將來執(zhí)行時的時間和日期。時間的指定方法有多種,用戶可以使用絕對時間,也可以用相對時間。該指定命令將以作業(yè)形式在后臺運行。例如:
$ at 15:00 Oct 20
回車后進入接收方式,接著鍵入以下命令:
mail -s “Happy Birthday!” liuzheny
按下D鍵,屏幕顯示:
job.a at Wed Oct 20 15:00:00 CST
$
表明建立了一個作業(yè),其作業(yè)ID號是.a,運行作業(yè)的時間是1999年10月20日下午3:00,給liuzheny發(fā)一條標題為“Happy Birthday!”(生日快樂)的空白郵件。
利用 at -l 可以列出當前at隊列中所有的作業(yè)。
利用 at -r 可以刪除指定的作業(yè)。這些作業(yè)以前由at或batch命令調(diào)度。例如,
at -r.a
將刪除作業(yè)ID號是.a的作業(yè)。其一般使用形式是:
at -r job_id
注意,結(jié)尾是.a的作業(yè)ID號,表示這個作業(yè)是由at命令提交的;結(jié)尾是.b的作業(yè)ID號,表示這個作業(yè)是由batch命令提交的。
· batch命令
batch命令不帶任何參數(shù),它提交的作業(yè)的優(yōu)先級比at命令提交的作業(yè)的優(yōu)先級低。batch無法指定作業(yè)運行的時間。實際運行時間要看系統(tǒng)中已經(jīng)提交的作業(yè)數(shù)量。如果系統(tǒng)中優(yōu)先級較高的作業(yè)比較多,那么,batch提交的作業(yè)則需要等待;如果系統(tǒng)空閑,則運行batch提交的作業(yè)。例如,
$ batch
回車后進入接收方式,接著鍵入命令:
find / -name exam.txt -print
按下D。退出接收方式,屏幕顯示:
job.b at Thu Nov 18 14:30:00 CST
表示find命令被batch作為一個作業(yè)提交給系統(tǒng),作業(yè)ID號是.b。如果系統(tǒng)當前空閑,這個作業(yè)被立即執(zhí)行,其結(jié)果同樣作為郵件發(fā)送給用戶。
· jobs命令
jobs命令用來顯示當前shell下正在運行哪些作業(yè)(即后臺作業(yè))。例如:
$ jobs
+ Running tar tv3 *&
– Running find / -name README -print > logfile &
$
其中,之一列方括號中的數(shù)字表示作業(yè)序號,它是由當前運行的shell分配的,而不是由操作系統(tǒng)統(tǒng)一分配的。在當前shell環(huán)境下,之一個后臺作業(yè)的作業(yè)號為1,第二個作業(yè)的作業(yè)號為2,等等。
第二列中的“ ”號表示相應作業(yè)的優(yōu)先級比“-”號對應作業(yè)的優(yōu)先級高。
第三列表明作業(yè)狀態(tài),是否為運行、中斷、等待輸入或停止等。
最后列出的是創(chuàng)建當前這個作業(yè)所對應的命令行。
利用 jobs -l 形式,可以在作業(yè)號后顯示出相應進程的PID。如果想只顯示相應進程的PID,不顯示其它信息,則使用 jobs -p 形式。
· fg命令
fg命令把指定的后臺作業(yè)移到前臺。其使用格式是:
fg
其中,參數(shù)job是一個或多個進程的PID,或者是命令名稱或者作業(yè)號(前面要帶有一個“%”號)。例如:
$ jobs
+ Running tar tv3 *&
– Running find / -name README -print > logfile&
$ fg %find
find / -name README -print > logfile
注意,顯示的命令行末尾沒有“&”符號。下面命令能產(chǎn)生同樣的效果:
$ fg %1
這樣,find命令對應的進程就在前臺執(zhí)行。當后臺只有一個作業(yè)時,鍵入不帶參數(shù)的fg命令,就能使相應進程移到前臺。當有兩個或更多的后臺作業(yè)時,鍵入不帶參數(shù)的fg,就把最后進入后臺的進程首先移到前臺。
· bg命令
bg命令可以把前臺進程換到后臺執(zhí)行。其使用格式是:
bg
其中,job是一個或多個進程的PID、命令名稱或者作業(yè)號,在參數(shù)前要帶“%”號。例如,在cc(C編譯命令)命令執(zhí)行過程中,按下Z鍵,使這個作業(yè)掛起。然后鍵入以下命令:
$ bg %cc
關(guān)于linux 進程并發(fā)執(zhí)行的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都服務(wù)器租用選創(chuàng)新互聯(lián),先試用再開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡單好用,價格厚道的香港/美國云服務(wù)器和獨立服務(wù)器。物理服務(wù)器托管租用:四川成都、綿陽、重慶、貴陽機房服務(wù)器托管租用。
當前文章:Linux 處理進程并發(fā):了解它是如何同時執(zhí)行任務(wù)的 (linux 進程并發(fā)執(zhí)行)
網(wǎng)址分享:http://m.5511xx.com/article/codjgij.html


咨詢
建站咨詢
