進程相關概念
一、進程式控制制的理論基礎:在作業系統是這樣定義的,進程是一個具有一定獨立功能的程式的一次運行活動。一個程式在啟動並執行時候就叫做進程
二、進程有以下幾個特點:
1、動態性:程式是靜態,當運行起來的時候就是動態進程
2、並發性:多個進程同時運行
3、獨立性:進程之間之間是獨立的
4、非同步性:進程之間也是非同步
三、進程三態圖如下:思考進程被建立後的狀態?何種情況轉為運行、阻塞狀態?
四、進程ID
進程ID(PID):標識程的唯一數字,父進程的ID(PPID),啟動進程的使用者ID (UID )
五、進程互斥
進程互斥是指當有若干進程都要使用某一共用資源時,任何時刻最多允許一個進程使用其他要使用該資源的進程必須等待,直到佔用該資源者釋放了該資源為止。
六、臨界資源:
作業系統中將一次只允許一個進程訪問的資源稱為臨界資源。
七、臨界區:
進程中訪問臨界資源的那段程式碼稱為臨界區。為實現對臨界資源的互斥訪問,應保證諸進程互斥地入各自的臨界區。
八、進程同步:
一組並發進程按一定的順序執行的過程稱為進程間的同步。具有同步關係的一組並發進程稱為合作進程,合作進程間互相發送的訊號稱為訊息或事件。
九、進程調度:
進程調度是指按一定演算法,從一組待啟動並執行進程中選出一個來佔有CPU運行。
1、 調度方式:搶佔式和非搶佔式。搶佔式還在啟動並執行進程被迫停止。非搶佔式還在啟動並執行等待運行完。
2、 調度演算法: 先來先服務調度演算法
短進程優先調度演算法 :短進程優先就是指佔用CPU已耗用時間短的進程優先
高優先順序優先調度演算法
時間片輪轉法:是指將CPU劃分出來的時間輪流給幾個進程運行(進程不會運行完)。
十、死結的概念
多個進程因競爭資源而形成一種僵局,若無外力作用,這些進程都將永遠不能再向前推進。
進程編程
一、擷取進程的ID
父進程:產生當前啟動並執行進程的進程
子進程:父進程建立進程
擷取當前進程的ID函數vpid_t getpid(void)
擷取父進程的ID函數vpid_t getppid(void)
實驗程式如下
PID為當前進程的id,而PPID是當前進程的父進程!
二、建立進程
進程建立使用fork函數pid_t fork(void)
功能:建立子進程
fork的奇妙之處在於它被調用一次,卻返回兩次,它可能有三種不同的傳回值:
1.在父進程中,fork返回新建立的子進程的PID;
2.在子進程中,fork返回0;
3.如果出現錯誤,fork返回一個負值
進程建立程式如下
3、 進程使用執行個體2
在進程中
使用fork建立的子進程和父進程的程式碼片段是共用的,但是資料區段是獨立的!所以上面程式列印的語句應該是!
子進程的資料空間、堆棧空間都會從父進程得到一個拷貝,而不是共用。在子進程中對count行加1的操作,並沒有影響到父進程中的count值,父進程中的count值仍然為0。
4、 pid_t vfork(void)函數和fork函數的區別
區別:
1. fork:子進程拷貝父 程的資料區段,堆棧。
vfork:子進程與父進程共用資料區段,堆棧、程式碼片段。
2. fork:父、子 程的執行次序不確定
vfork:子進程先運行,父進程後運行
5、 exec函數族
exec用被執行的程式替換調用它的程式。
區別:
fork建立一個新的進程,產生一個新的PID。
exec啟動一個新程式,替換原有的進程,因此進程的PID不會改變。
1. #include<unistd.h>
int execl(const char * path,const char * arg1, ....)
參數:
path:被執行程式名(含完整路徑)。 arg1 – argn: 被執行程式所需的命令列參
數,含程式名。以null 指標 (NULL )結束。
程式如下
2.#include<unistd.h>
int execlp(constchar * path,const char * arg1, …)
參數:
path:被執行程式名(不含路徑,將從 path環境變數中尋找該程式)。
arg1 – argn: 被執行程式所需的命令列參數,含程式名。以null 指標 (NULL )結束。
程式如下:
3. #include<unistd.h>
int execv (const char * path, char * const argv[ ])
參數:
path:被執行程式名 (含完整路徑)。
argv[ ]: 被執行程式所需的命令列參數數組。
程式如下:
6、 系統函數 System 函數
#include <stdlib.h>
int system( const char* string )
功能:
調用fork產生子進程,由子進程來調用 /bin/sh -c string來執行參數string所代表
System函數會自己產生一個子進程!!!
7、 進程等待
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait (int * status)
功能:
阻塞該進程,直到其某個子進程退出。它返回的是子進程的ID
程式如下:
如果首先運行子進程,那麼列印第一條語句後進入睡眠3秒! 在這3秒內轉而運行父進程
父進程一開始進入等待,等待3秒一過然後執行子進程直到退出子進程,然後繼續執行父進程!