Linux的多任務多進程

一、多任務

多任務並不是一起執行,只是因爲所有程序都在獲取執行權,CPU處理速度很快,看上去是在進行多任務

二、進程

(一)、進程是一個具有一定獨立功能的程序的一次運行活動,同時也是資源分配的最小單元
相關術語:
1、資源:一般指內存    2、CPU時間片:比如給5秒的時間處理一個事件    3、進程控制塊:保存進程的啓動信息
Linux命令行下查看所有進程:ps -a
(二)、進程狀態
執行狀態:正在佔用CPU
就緒狀態:進程已經具備一切條件,正在等待分配CPU的處理時間片
等待狀態:進程不能使用CPU,若等待事件發生則可將其喚醒

圖釋:


(三)、進程特點:
1、並行性    2、互不干擾    3、開銷大(缺點)
(四)、Linux進程結構
1、數據段:存放全局標量、常數
2、代碼段:存放的爲程序代碼和數據
3、堆棧段:子程序的返回值,子程序的參數,程序的局部變量
(四)、進程互斥
當有若干個進程都要使用某一共享資源時,任何時刻最多允許一個進程使用,所以需要進程同步,且併發進程需要按順序執行。
(五)、臨界資源
同意時刻只允許一個進程訪問的資源,進程中訪問臨界資源的那段程序代碼稱爲臨界區
(六)、進程調度
1、方式:1>搶佔式    2>非搶佔式
2、死鎖:多個進程因競爭資源而形成一種僵局,若無外力作用這些進程,這些進程都將永遠無法獲取資源,不能再前進。
(七)、創建進程
1、fork
頭文件:#include <unistd.h>    #include <sys/tyeps.h>
pid_t fork(void);
執行過程:
1>給子進程分配空間
2>將父進程的數據段、堆棧段拷貝到子進程
3>將父進程的代碼段共享給子進程
4>給父進程的PID返回一個大於0的數,給子進程的PID返回等於0的數,錯誤返回-1
所以fork產生的子進程只共享代碼段,不共享堆棧段,數據段,所以父子進程之間互不影響
2、vfork
pid_t vfork(void);
只有當子進程執行之後,父進程纔可執行,且共享數據段和堆棧段
vfork在執行完子進程之後應該加exit(1),因爲其共享數據段,不加exit(1)異常退出,其數據會被子進程釋放,父進程無法執行
3、exec函數族
exec函數族啓動一個新程序,替換原有的進程,但不產生新的PID
具體見數p225(不常用)
4、system
可以在一個程序中執行另一個進程,等該程序執行完畢再執行接下來的進程,例如:system("./hello");
(八)、殭屍進程
子進程的資源一定是由父進程交還給系統,如果父進程先於子進程退出,則會出現殭屍進程,可以在父進程中調用wait(NULL);將父進程掛起,等子進程結束再釋放

發佈了47 篇原創文章 · 獲贊 31 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章