新聞中心
進(jìn)程控制是任何操作系統(tǒng)的核心功能,Linux也不例外。要想成為一名Linux系統(tǒng)的高手,了解進(jìn)程控制管理是必不可少的。本文將深入講解LinuxC進(jìn)程控制管理相關(guān)的知識(shí),包括進(jìn)程創(chuàng)建、進(jìn)程的狀態(tài)、進(jìn)程的調(diào)度及進(jìn)程通信等方面。

成都創(chuàng)新互聯(lián)公司是工信部頒發(fā)資質(zhì)IDC服務(wù)器商,為用戶提供優(yōu)質(zhì)的綿陽(yáng)服務(wù)器托管服務(wù)
一、進(jìn)程創(chuàng)建
在Linux系統(tǒng)中,進(jìn)程都是通過(guò)fork()系統(tǒng)調(diào)用來(lái)創(chuàng)建的。fork()會(huì)創(chuàng)建一個(gè)子進(jìn)程,而這個(gè)子進(jìn)程會(huì)復(fù)制父進(jìn)程的所有資料。包括程序代碼、變量、環(huán)境變量等等。為了在代碼中確定當(dāng)前是父進(jìn)程還是子進(jìn)程,fork()系統(tǒng)調(diào)用的返回值為0,表示當(dāng)前是子進(jìn)程;返回值不為0,表示當(dāng)前是父進(jìn)程,且返回值為子進(jìn)程的PID。
如下代碼示例說(shuō)明了如何使用fork()系統(tǒng)調(diào)用來(lái)創(chuàng)建進(jìn)程:
“`
#include
#include
#include
int mn() {
pid_t pid;
pid = fork();
if (pid == -1) {
printf(“Error: Fled to fork\n”);
}
else if (pid == 0) {
printf(“This is child process. PID is %d\n”, getpid());
}
else {
printf(“This is parent process. PID is %d\n”, getpid());
}
return 0;
}
“`
以上代碼通過(guò)調(diào)用fork()系統(tǒng)調(diào)用來(lái)創(chuàng)建進(jìn)程,并在父進(jìn)程和子進(jìn)程中打印出當(dāng)前進(jìn)程的PID。執(zhí)行結(jié)果如下所示:
“`
This is parent process. PID is 5948
This is child process. PID is 5949
“`
二、進(jìn)程的狀態(tài)
進(jìn)程在運(yùn)行中的狀態(tài)有五種,分別是就緒態(tài)、運(yùn)行態(tài)、阻塞態(tài)、停止態(tài)和僵尸態(tài)。
1. 就緒態(tài)
就緒態(tài)指的是進(jìn)程已經(jīng)被分配到處理器,但是還沒(méi)有開(kāi)始執(zhí)行。進(jìn)程之所以還沒(méi)有開(kāi)始執(zhí)行是因?yàn)樵诙嗟莱绦蛟O(shè)計(jì)中,處理器需要維護(hù)多個(gè)進(jìn)程,因此需要按照一定的優(yōu)先級(jí)進(jìn)行調(diào)度。在所有的就緒態(tài)進(jìn)程中,處理器會(huì)選擇優(yōu)先級(jí)更高的進(jìn)程先執(zhí)行。
2. 運(yùn)行態(tài)
運(yùn)行態(tài)指的是進(jìn)程正在被處理器執(zhí)行。在多道程序設(shè)計(jì)中,只有一個(gè)進(jìn)程可以處于運(yùn)行態(tài),因?yàn)樘幚砥髦挥幸粋€(gè)。在一個(gè)時(shí)間片內(nèi),進(jìn)程可以通過(guò)IO操作等方式阻塞,并將處理器占用權(quán)交還給操作系統(tǒng)。
3. 阻塞態(tài)
阻塞態(tài)指的是進(jìn)程由于等待某一個(gè)事件而暫停了執(zhí)行。例如,當(dāng)進(jìn)程需要讀寫(xiě)磁盤(pán)文件時(shí),由于磁盤(pán)IO速度較慢,進(jìn)程需要等待操作完成,因此就處于阻塞態(tài)。
4. 停止態(tài)
停止態(tài)指的是進(jìn)程被收到信號(hào)或者等待子進(jìn)程完成而被停止了。進(jìn)程處于停止態(tài)后,不會(huì)再被調(diào)度到處理器執(zhí)行。
5. 僵尸態(tài)
僵尸態(tài)指的是進(jìn)程已經(jīng)結(jié)束,但是它的PID還存在系統(tǒng)中。原因是當(dāng)一個(gè)進(jìn)程結(jié)束后,需要保留它的退出狀態(tài)以供其他進(jìn)程查詢。在父進(jìn)程沒(méi)有調(diào)用wt()或者wtpid()函數(shù)來(lái)等待子進(jìn)程結(jié)束時(shí),子進(jìn)程的狀態(tài)就會(huì)一直處于僵尸態(tài)。
三、進(jìn)程調(diào)度
在Linux系統(tǒng)中,進(jìn)程由調(diào)度器進(jìn)行調(diào)度,調(diào)度器的主要任務(wù)是為每一個(gè)就緒態(tài)的進(jìn)程分配處理器時(shí)間。進(jìn)程調(diào)度有兩種方式:時(shí)間片輪轉(zhuǎn)和優(yōu)先級(jí)調(diào)度。
1. 時(shí)間片輪轉(zhuǎn)
時(shí)間片輪轉(zhuǎn)是具有公平性的進(jìn)程調(diào)度算法。在時(shí)間片輪轉(zhuǎn)中,所有就緒態(tài)的進(jìn)程按照先來(lái)先服務(wù)的原則排隊(duì)。當(dāng)處理器開(kāi)始執(zhí)行后,會(huì)把進(jìn)程的處理時(shí)間劃分成多個(gè)時(shí)間片,每個(gè)時(shí)間片都有相同的長(zhǎng)度。在每個(gè)時(shí)間片結(jié)束時(shí),當(dāng)前進(jìn)程就會(huì)被掛起,并在隊(duì)列末尾等待下一個(gè)時(shí)間片再次獲得處理器。這樣,所有的進(jìn)程都可以獲得相同的處理時(shí)間,從而實(shí)現(xiàn)公平性。
2. 優(yōu)先級(jí)調(diào)度
優(yōu)先級(jí)調(diào)度是一種基于進(jìn)程優(yōu)先級(jí)的調(diào)度算法。在優(yōu)先級(jí)調(diào)度中,每個(gè)進(jìn)程都有一個(gè)固定的優(yōu)先級(jí),調(diào)度器會(huì)直接選擇優(yōu)先級(jí)更高的進(jìn)程運(yùn)行。因此,優(yōu)先級(jí)越高的進(jìn)程越容易獲得處理器時(shí)間。但是,如果一個(gè)進(jìn)程擁有極高的優(yōu)先級(jí),它可能會(huì)永遠(yuǎn)占用處理器時(shí)間,導(dǎo)致其他進(jìn)程無(wú)法運(yùn)行。為了避免這種情況的發(fā)生,通常會(huì)將優(yōu)先級(jí)調(diào)度和時(shí)間片輪轉(zhuǎn)結(jié)合起來(lái)。
四、進(jìn)程通信
在Linux系統(tǒng)中,進(jìn)程通信是指兩個(gè)或多個(gè)進(jìn)程之間的數(shù)據(jù)傳輸和共享。進(jìn)程之間的通信方式有多種,例如管道、消息隊(duì)列、信號(hào)量、共享內(nèi)存和套接字等。
下面將分別介紹其中幾種常見(jiàn)的進(jìn)程通信方式。
1. 管道
管道是一種常用的進(jìn)程間通信方式,通過(guò)在兩個(gè)進(jìn)程間構(gòu)造管道來(lái)實(shí)現(xiàn)數(shù)據(jù)的傳輸。在Linux系統(tǒng)中,管道可以分為匿名管道和命名管道兩種。匿名管道只能用于有親緣關(guān)系的進(jìn)程間通信,而命名管道則不需要進(jìn)程有親緣關(guān)系。
2. 消息隊(duì)列
消息隊(duì)列是一種可靠的進(jìn)程通信方式,它通過(guò)在不同進(jìn)程之間的消息隊(duì)列傳遞數(shù)據(jù)。消息隊(duì)列中的消息能夠?qū)崿F(xiàn)先進(jìn)先出的保持順序特性,可以實(shí)現(xiàn)消息的存放與提取操作。
3. 信號(hào)量
信號(hào)量是一種計(jì)數(shù)器,用于保護(hù)共享資源。由于信號(hào)量是一個(gè)計(jì)數(shù)器,因此它的值可以在不同進(jìn)程間進(jìn)行加減操作。當(dāng)某一個(gè)進(jìn)程需要訪問(wèn)共享資源時(shí),需要先對(duì)信號(hào)量進(jìn)行操作。如果可以對(duì)信號(hào)量進(jìn)行減操作,則表示共享資源可以被訪問(wèn);否則表示當(dāng)前共享資源正在被其他進(jìn)程占用。
4. 共享內(nèi)存
共享內(nèi)存是一種高效的進(jìn)程通信方式,它可以在多個(gè)進(jìn)程之間共享同一塊內(nèi)存區(qū)域。多個(gè)進(jìn)程可以同時(shí)訪問(wèn)同一個(gè)內(nèi)存區(qū)域,從而實(shí)現(xiàn)共享數(shù)據(jù)的操作。需要注意的是,共享內(nèi)存操作需要應(yīng)用程序自己進(jìn)行同步操作以防出現(xiàn)同步問(wèn)題。
相關(guān)問(wèn)題拓展閱讀:
- 在linux里用C語(yǔ)言編寫(xiě)創(chuàng)建進(jìn)程、撤銷進(jìn)程,我是新手,求幫助,更好是有注釋的簡(jiǎn)單易懂的。謝謝!
在linux里用C語(yǔ)言編寫(xiě)創(chuàng)建進(jìn)程、撤銷進(jìn)程,我是新手,求幫助,更好是有注釋的簡(jiǎn)單易懂的。謝謝!
前面兩人說(shuō)的明顯是線程的創(chuàng)建好不好?
用 pid_t fork(void);創(chuàng)建一個(gè)子進(jìn)程
共享數(shù)據(jù)段和代碼段,所以感覺(jué)上是會(huì)執(zhí)行兩次.
可以在父進(jìn)程中添加一個(gè)wait函數(shù),以便于子進(jìn)程先退出,再父進(jìn)程退出.
或者 pid_t vfork(void) 這也是創(chuàng)建一個(gè)進(jìn)程,和前者區(qū)別不講了.
撤銷進(jìn)程的話,在程序里面可以自己從代碼角度去退出,也可以在兩個(gè)進(jìn)程運(yùn)行時(shí),通過(guò)命令 ps
來(lái)查看進(jìn)程ID,,,在程序里面也可以獲取進(jìn)程的pid,ppid,可以直接在函數(shù)里面使用kill(),來(lái)終止進(jìn)程.
創(chuàng)建進(jìn)程:pthread_creat(&pid, NULL, foo, (void *)&i);
回收線程:pthread_join(pid, NULL);
終止進(jìn)程: kill 【選項(xiàng)】 進(jìn)程號(hào)
linuxc 進(jìn)程的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linuxc 進(jìn)程,深入了解LinuxC進(jìn)程控制管理,在linux里用C語(yǔ)言編寫(xiě)創(chuàng)建進(jìn)程、撤銷進(jìn)程,我是新手,求幫助,更好是有注釋的簡(jiǎn)單易懂的。謝謝!的信息別忘了在本站進(jìn)行查找喔。
成都創(chuàng)新互聯(lián)科技有限公司,是一家專注于互聯(lián)網(wǎng)、IDC服務(wù)、應(yīng)用軟件開(kāi)發(fā)、網(wǎng)站建設(shè)推廣的公司,為客戶提供互聯(lián)網(wǎng)基礎(chǔ)服務(wù)!
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡(jiǎn)單好用,價(jià)格厚道的香港/美國(guó)云服務(wù)器和獨(dú)立服務(wù)器。創(chuàng)新互聯(lián)——四川成都IDC機(jī)房服務(wù)器托管/機(jī)柜租用。為您精選優(yōu)質(zhì)idc數(shù)據(jù)中心機(jī)房租用、服務(wù)器托管、機(jī)柜租賃、大帶寬租用,高電服務(wù)器托管,算力服務(wù)器租用,可選線路電信、移動(dòng)、聯(lián)通機(jī)房等。
網(wǎng)頁(yè)題目:深入了解LinuxC進(jìn)程控制管理(linuxc進(jìn)程)
文章分享:http://fisionsoft.com.cn/article/coieopc.html


咨詢
建站咨詢
