國嵌視訊學習第三天-程序控制
程序ID(PID):標示程序的唯一數字
父程序的ID(PPID)
啟動程序的使用者ID(UID)
程序互斥
程序互斥是指當有若干程序都要使用某一共享資源時,任何時刻最多允許一個程序使用,其他藥使用該資源的程序必須等待,直到佔用該資源者釋放了該資源為止。
臨界資源
作業系統中將一次只允許一個程序訪問的資源稱為臨界資源
臨界區
程序中訪問臨界資源的那段程式程式碼稱為臨界區。為實現對臨界資源的互斥訪問,應保證諸程序互斥地進入各自的臨界區
程序同步
一組併發程序按一定的順序執行的過程稱為程序間的同步。具有同步關係的一組併發程序稱為合作程序,合作程序間互發傳送的訊號稱為訊息或事件
程序排程
概念:按一定演算法,從一組待執行的程序(就緒態的程序)中選出一個來佔有CPU
排程方式: 搶佔式
非搶佔式
排程演算法
-----------先來先服務排程演算法
-----------短程序優先排程演算法
-----------高優先順序優先排程演算法
-----------時間片輪換法
死鎖
多個程序因競爭資源而形成一種僵局,若無外力作用,這些程序都將永遠不能再向前推進
獲取ID
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void)
獲取本程序ID
pid_t getppid(void)
獲取父程序ID
例.
程序建立-fork
#include <unistd.h>
pid_t fork(void)
功能:建立子程序
Fork的奇妙之處在於它被呼叫一次,卻返回兩次(父程序和子程序各返回一次),它可能有三種不同的返回值:
1.在父程序中,fork返回新建立的子程序的PID;
2.在子程序中,fork返回0(但是並不是說子程序的ID為0,而只是返回0!)
3.如果出現錯誤,fork返回一個負值
例.fork1.c
程序建立
子程序的資料空間、堆疊空間都會從父程序得到一個拷貝,而不是共享。
程序建立-vfork
#include <sys/types.h>
#include <unistd.h>
pid_t vfork(void)
功能:建立子程序
fork VS. vfork
區別:
1.fork:子程序拷貝父程序的資料段
vfork:子程序與父程序共享資料段
2.fork:父、子程序的執行次序不確定
vfork:子程序先執行,父程序後執行
例.
exec函式族
exec用被執行的程式替換呼叫它的程式。(包括資料段)
區別:
fork建立一個新的程序,產生一個新的PID
exec啟動一個新程式,替換原有的程序,因此程序的PID不會改變
#include <unistd.h>
int execl(const char* path, const char* arg1,...)
引數:
path:被執行程式名(還能完整路徑)
arg1 - argn:被執行程式所需的命令列引數,含程式名。以空指標(NULL)結束
例execl.c
#include <unistd.h>
int execlp(const char* path,const char* arg1,...)
引數:
path:被執行的程式名(不含路徑,將從path環境變數中查詢執行該程式)
arg1 - argn:被執行程式所需的命令列引數,含程式名。以空指標(NULL)結束
例execlp.c
#include <unistd.h>
int execv(const char* path, char* const argv[])
引數:
path:被執行程式名(含完整路徑)
argv[]:被執行程式所需的命令列引數陣列
例execv.c
#include <stdlib.h>
int system(const char* string)
功能:
該函式將呼叫fork產生子程序,由子程序來呼叫/bin/sh -c string來執行引數string所代表的命令
例system.c
程序等待
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int * status)
功能:
阻塞該程序,直到其某個子程序退出,wait返回的值是退出的子程序pid
例wait.c