linux學習之進程式控制制

來源:互聯網
上載者:User

進程相關概念

一、進程式控制制的理論基礎:在作業系統是這樣定義的,進程是一個具有一定獨立功能的程式的一次運行活動。一個程式在啟動並執行時候就叫做進程

二、進程有以下幾個特點:

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秒一過然後執行子進程直到退出子進程,然後繼續執行父進程!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.