国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

進(jìn)程概述(進(jìn)程一)

2019-11-10 19:41:34
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

進(jìn)程:計(jì)算機(jī)中資源分配的最小單元。 進(jìn)程可以是從命令行執(zhí)行的一個(gè)命令(短期),也可以是一種網(wǎng)絡(luò)服務(wù)(長(zhǎng)期)。 對(duì)進(jìn)程及其調(diào)度進(jìn)行管理顯得十分重要。 單CPU的計(jì)算機(jī)在一個(gè)時(shí)間片內(nèi)只能執(zhí)行一條指令。 進(jìn)程調(diào)度(PRocess Scheduling): 首先為每一個(gè)進(jìn)程指派一定的運(yùn)行時(shí)間,這個(gè)時(shí)間通常非常短,短到以毫秒為單位,然后依照某種規(guī)則,從眾多進(jìn)程中挑選一個(gè)投入運(yùn)行,其他進(jìn)程暫時(shí)等待,當(dāng)正在運(yùn)行的那個(gè)進(jìn)程時(shí)間耗盡,或執(zhí)行完畢退出,或因某種原因暫停,linux就會(huì)重新進(jìn)行調(diào)度,挑選下一個(gè)進(jìn)程投入運(yùn)行。因?yàn)槊總€(gè)進(jìn)程占用的時(shí)間片都很短,從使用者角度來(lái)看,就好像多個(gè)進(jìn)程同時(shí)運(yùn)行一樣。 在Linux中,每個(gè)進(jìn)程在創(chuàng)建時(shí)都會(huì)被分配一個(gè)數(shù)據(jù)結(jié)構(gòu),稱為程序控制塊(PCB)。 PCB中最重要的是進(jìn)程ID(PID),PID也被稱為進(jìn)程標(biāo)識(shí)符,是一個(gè)自然數(shù),在Linux操作系統(tǒng)中唯一地標(biāo)志一個(gè)進(jìn)程。

進(jìn)程分類: 1、 交互進(jìn)程; 2、 批處理進(jìn)程; 3、 守護(hù)進(jìn)程; 守護(hù)進(jìn)程總是活躍的,一般在后臺(tái)運(yùn)行,守護(hù)進(jìn)程有系統(tǒng)在開(kāi)機(jī)時(shí)通過(guò)腳本自動(dòng)激活啟動(dòng)或超級(jí)用戶root來(lái)啟動(dòng)。 由于守護(hù)進(jìn)程是一直運(yùn)行著的,所以它所處的狀態(tài)是等待請(qǐng)求處理任務(wù)。

進(jìn)程的屬性: 1、 進(jìn)程ID(PID):是唯一的數(shù)值,來(lái)區(qū)分進(jìn)程; 2、 父進(jìn)程和父進(jìn)程的ID(PPID); 3、 啟動(dòng)進(jìn)程的用戶ID(UID)和所歸屬的組(GID); 4、 進(jìn)程狀態(tài):運(yùn)行R、休眠S、僵尸Z; 5、 進(jìn)程執(zhí)行的優(yōu)先級(jí); 6、 進(jìn)程所連接的終端名; 7、 進(jìn)程資源占用,如占用資源大小(內(nèi)存、CPU占用量)。

父進(jìn)程和子進(jìn)程: 父進(jìn)程和子進(jìn)程的關(guān)系是管理和被管理的關(guān)系,當(dāng)父進(jìn)程終止時(shí),子進(jìn)程也隨之終止;但子進(jìn)程終止,父進(jìn)程并不一定終止。 在進(jìn)程管理中,當(dāng)我們發(fā)現(xiàn)占用資源過(guò)多,或無(wú)法控制進(jìn)程時(shí),應(yīng)該殺死它,以保證系統(tǒng)的穩(wěn)定安全運(yùn)行。

Linux進(jìn)程的三態(tài) 一般情況下,一個(gè)運(yùn)行進(jìn)程必須具有以下三種狀態(tài): 1、 就緒狀態(tài):當(dāng)進(jìn)程已分配到除了CPU以外所有必要的資源,只要獲得處理器便可立即執(zhí)行,這時(shí)的進(jìn)程狀態(tài)稱為就緒狀態(tài); 2、 執(zhí)行狀態(tài):當(dāng)進(jìn)程已獲得處理器,其程序正在處理器上執(zhí)行,此時(shí)的進(jìn)程狀態(tài)成為執(zhí)行狀態(tài); 3、 等待狀態(tài)(阻塞):正在執(zhí)行的進(jìn)程,由于等待某個(gè)事件 三種狀態(tài)之間的轉(zhuǎn)換: 一個(gè)進(jìn)程在運(yùn)行期間,會(huì)不斷地從一種狀態(tài)轉(zhuǎn)換到另一種狀態(tài),它可以多次處于就緒狀態(tài)和執(zhí)行狀態(tài),也可以多次處于阻塞狀態(tài)。 1、 就緒 ? 執(zhí)行 :處于就緒狀態(tài)的進(jìn)程,當(dāng)進(jìn)程調(diào)度程序?yàn)橹峙淞颂幚砥髦螅撨M(jìn)程便由就緒狀態(tài)轉(zhuǎn)變?yōu)閳?zhí)行狀態(tài); 2、 執(zhí)行 ? 就緒 :處于執(zhí)行狀態(tài)的進(jìn)程在其執(zhí)行過(guò)程中,因分配給它的一個(gè)時(shí)間已用完而不得不讓出處理器,于是進(jìn)程從執(zhí)行狀態(tài)轉(zhuǎn)變成就緒狀態(tài); 3、 執(zhí)行 ? 阻塞 :正在執(zhí)行的進(jìn)程因等待某種事件發(fā)生而無(wú)法繼續(xù)執(zhí)行,便從執(zhí)行狀態(tài)變成阻塞狀態(tài); 4、 阻塞 ? 就緒 :處于阻塞狀態(tài)的進(jìn)程,若其等待的事件已經(jīng)發(fā)生,于是進(jìn)程由阻塞狀態(tài)轉(zhuǎn)變?yōu)榫途w狀態(tài)。

Linux進(jìn)程調(diào)度 任何時(shí)刻只能有一個(gè)進(jìn)程或者線程處于執(zhí)行狀態(tài),因此OS需要決定哪個(gè)進(jìn)程執(zhí)行,哪些進(jìn)程等待,這就是進(jìn)程的調(diào)度。 程序使用CPU的三種模式: IO密集型、計(jì)算密集型、平衡型 IO密集型:響應(yīng)時(shí)間非常重要; 計(jì)算密集型:CPU周轉(zhuǎn)時(shí)間比較重要; 平衡型:響應(yīng)和周轉(zhuǎn)時(shí)間的平衡是最重要的。

調(diào)度算法:

在使用fork()創(chuàng)建一個(gè)進(jìn)程時(shí),子進(jìn)程只是完全復(fù)制父進(jìn)程的資源,復(fù)制出來(lái)的子進(jìn)程有自己的task_struct結(jié)構(gòu)和PID,但卻復(fù)制了父進(jìn)程其他所有的資源。這樣得到的子進(jìn)程獨(dú)立于父進(jìn)程,具有良好的并發(fā)性,但是兩者之間的通信需要專門的通信機(jī)制。 通過(guò)fork()創(chuàng)建的子進(jìn)程,需要將上面描述的每一種資源都復(fù)制一個(gè)副本。這樣看來(lái),fork是一個(gè)開(kāi)銷非常大的系統(tǒng)調(diào)用,然而這些開(kāi)銷并不是在所有情況下都是必須的。 fork()調(diào)用執(zhí)行一次返回兩個(gè)值,對(duì)于父進(jìn)程,fork()返回子進(jìn)程的進(jìn)程號(hào),而對(duì)于子進(jìn)程fork()返回0,這就是一個(gè)函數(shù)返回兩次的本質(zhì)。 在fork()之后,子進(jìn)程和父進(jìn)程都會(huì)繼續(xù)執(zhí)行fork()調(diào)用之后的命令。子進(jìn)程是父進(jìn)程的副本,它將獲得父進(jìn)程的數(shù)據(jù)空間、堆和棧的副本,這些都是副本,父進(jìn)程和子進(jìn)程不共享這部分內(nèi)存。也就是說(shuō),子進(jìn)程對(duì)父進(jìn)程中的同名變量修改不會(huì)影響它在父進(jìn)程中的值。但是子進(jìn)程和父進(jìn)程又共享一些東西,簡(jiǎn)單地說(shuō)就是程序的正文段。正文段存放著由CPU執(zhí)行的機(jī)器指令,通常是read-only類型的。

vfork()會(huì)產(chǎn)生一個(gè)新的子進(jìn)程,其子進(jìn)程會(huì)復(fù)制父進(jìn)程的數(shù)據(jù)與堆棧空間,并繼承父進(jìn)程的用戶代碼、組代碼、環(huán)境變量、已打開(kāi)的文件代碼、工作目錄和資源限制等。

注意:vfork()創(chuàng)建的子進(jìn)程必須調(diào)用exit()來(lái)結(jié)束,否則子進(jìn)程將不可能結(jié)束。

啟動(dòng)進(jìn)程:exec族 int execl(const char *path , const char *arg , ……); int execlp(const char *file , const char *arg , …….); int execle(const char *path , const char *arg , …… , char *const envp[]); int execv(const char *path , char *const argv[]); int execvp(const char *file , char *const argv[]); int execve(const char *path , char *const argv[] , char *const envp[]); 以上函數(shù)只有execve是真正的系統(tǒng)調(diào)用,其他都是在此基礎(chǔ)上經(jīng)過(guò)包裝的庫(kù)函數(shù)。

exec函數(shù)族的作用是根據(jù)指定的文件名找到可執(zhí)行的文件,并用它來(lái)取代調(diào)用進(jìn)程的內(nèi)容。換句話說(shuō),也就是在調(diào)用進(jìn)程內(nèi)部執(zhí)行一個(gè)可執(zhí)行文件。這里的可執(zhí)行文件既可以是二進(jìn)制文件,也可以是任何Linux下可執(zhí)行的腳本文件。 與一般情況不同,exec函數(shù)族的函數(shù)執(zhí)行成功后不會(huì)返回,因?yàn)檎{(diào)用進(jìn)程的實(shí)體,包括代碼段、數(shù)據(jù)段和堆棧等都已經(jīng)被新的內(nèi)容所取代,只有進(jìn)程ID等一些表面的信息任然保持原樣。只有調(diào)用失敗了,它們才會(huì)返回-1,從源程序的調(diào)用點(diǎn)接著往下執(zhí)行。

system用于執(zhí)行shell命令。 system()會(huì)調(diào)用fork()產(chǎn)生子進(jìn)程,由子進(jìn)程來(lái)調(diào)用/bin/sh-c string來(lái)執(zhí)行參數(shù)string字符串所代表的命令,此命令執(zhí)行完后隨即返回原調(diào)用的進(jìn)程。在調(diào)用system()期間SIGCHLD信號(hào)會(huì)被暫時(shí)擱置,SIGINT和SIGQUIT信號(hào)則會(huì)被忽略。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 东安县| 衡水市| 绥德县| 兴业县| 留坝县| 公安县| 瑞昌市| 柳河县| 鹤山市| 枞阳县| 呼玛县| 平度市| 林芝县| 白城市| 偏关县| 湖州市| 米林县| 建瓯市| 南澳县| 田阳县| 长沙县| 长汀县| 忻城县| 日喀则市| 汾西县| 曲阳县| 措美县| 夏河县| 嵊泗县| 固始县| 汽车| 遂川县| 万载县| 长治县| 芜湖市| 黔西县| 双辽市| 腾冲县| 霍州市| 扶沟县| 儋州市|