一、多任務
多任務並不是一起執行,只是因爲所有程序都在獲取執行權,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);將父進程掛起,等子進程結束再釋放