第七章、程序間通訊
1、程序間通訊簡介
多個程序之間相互通訊、交換資訊的方法
方法:1)本地程序通訊:共享記憶體、訊號量、管道、命名管道、訊息佇列
2)遠端通訊:套介面、全雙工管道
2、共享記憶體和訊號量
1)共享記憶體
通過兩個或多個程序共享同一塊記憶體區域實現程序間通訊
最底層的通訊機制,最快速的通訊機制(不需要中間介質)
不足:同步問題,通過訊號量實現程序的同步
兩種方法:對映/dev/mem裝置(引起系統崩潰)和記憶體映像(檔案系統額外開銷)
①共享記憶體建立與開啟
#include
#include
#include
int shmget(key_t key, int size, int flag);
key表示建立或開啟的共享記憶體的鍵,size表示共享記憶體的大小(建立時才有效),flag表示呼叫函式的操作型別或訪問許可權
呼叫成功,返回共享記憶體的引用識別符號;呼叫失敗,返回-1
②附加
void *shmat(int shmid, void *addr, int flag);
shmid表示要附加的共享記憶體段的引用識別符號,flag表示shmat函式的操作方式,addr表示位址
③分離程序對共享記憶體區域訪問完成後,呼叫shmdt使共享記憶體區域與該程序的位址空間分離
int shmdt(void *addr);
並不刪除共享記憶體本身。addr為要分離的共享記憶體區域的指標
④共享記憶體的控制
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
shmid為共享記憶體的引用識別符號,cmd表示希望執行的操作,buf是指向shmid_ds結構體的指標
2)訊號量
用於對多個程序訪問共享資源進行控制的機制
為了解決互斥共享資源的同步問題,實質是整數計數器,記錄了可供訪問的共享資源的單元個數
當有程序要求使用資源,首先檢測資源的訊號量,當大於0時,可以使用,訊號量值減一,結束使用,訊號量值加一;當等於0時,程序休眠,知道訊號量值大於0被喚醒,訪問該資源
①訊號量集的建立與開啟
#include
int semget(key_t key, int nsems, int flag);
key表示建立或開啟的訊號量集的鍵,nsems表示訊號量的個數(建立時才有效),flag表示呼叫函式的操作型別或訪問許可權
呼叫成功,返回訊號量的引用識別符號;呼叫失敗,返回-1
②對訊號量的操作
int semop(int semid, struct sembuf semoparray, size_t nops);
semid為訊號量集的引用id,semoparray用於指定呼叫semop函式所做的操作,nops指出semoparray元素個數
③訊號量的控制
int semctl(int semid, int semnum, int cmd, union semun arg);
semid為訊號量集的引用識別符號,semnum致命某個特定的訊號量,cmd表示希望執行的操作,arg是semun聯合
3、管道通訊
當乙個管道建立後,將獲得來那個檔案描述符,分別成為讀取端和匯入端
不足:只能用於兩個程序通訊;同源性,即同乙個程序派生的程序;半雙工,即只允許單方向傳輸資料;只存在系統核心,不存在檔案系統
1)管道的建立和關閉
int pipe(int filedescriptors[2]);
int close(int filedescriptor);
2)管道的讀寫操作
特殊的檔案,read、write
4、命名管道
先入先出佇列,一種特殊的管道
特點:任何兩個程序,不限制同源;存在檔案系統,除非對其刪除
1)命名管道的建立
#include
#include
①int mkfifo(const char *pathname, mode_t mode);
pathname存放管道的檔名,mode指定檔案許可權
②int mknod(char *pathname, mode_t mode, dev_t dev);
dev只有在檔案為裝置檔案時起作用
③shell命令
mkfifo fifo_test
mknod fifo_test p
2)命名管道的使用
open、read、write、close
5、訊息佇列
一系列連續排列的訊息,儲存在核心中,與管道類似
為每個訊息指定型別,接受下一條訊息,或接受下一條特定型別的訊息
傳遞的訊息由兩部分組成,即訊息型別和傳遞的資料
1)訊息佇列的建立與開啟
#include
#include
#include
int msgget(key_t key, int flag);
key表示建立或開啟的訊息佇列的鍵,flag表示呼叫函式的操作型別或訪問許可權
呼叫成功,返回訊息佇列的引用識別符號;呼叫失敗,返回-1
2)向訊息佇列中傳送訊息
訊息被新增到訊息佇列的末尾
int msgsnd(int msqid, const void *ptr, size_t nbytes, int flag);
msqid是訊息佇列的引用識別符號,ptr指向要傳送的訊息,nbytes表示訊息資料長度,flag指定訊息佇列滿時的處理方法
3)從訊息佇列中接收訊息
int msgrcv(int msqid, const void *ptr, size_t nbytes, long type, int flag);
msqid是訊息佇列的引用識別符號,ptr指向要存放的緩衝區,nbytes表示訊息資料長度,flag指定訊息長度大於指定值時的處理方法,type表示接受的訊息型別
4)訊息佇列的控制
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
msqid為訊息佇列的引用識別符號,cmd表示希望執行的操作,buf是指向msqid_ds結構體的指標
第七章 程序環境
1.main 函式 c程式總是從main函式開始執行的。main函式的原型是 int main int argc,char argv 其中,argc是命令列引數的數目,argv是指向引數的各個指標構成的陣列。當核心執行c程式時 使用乙個exec函式 在呼叫main前先呼叫乙個特殊的啟動例程。可執行程...
第七章 程序排程 介紹
7.2 排程指標 t周轉時間 t完成時間 t到達時間 7.3 先進先出 fifo example 1 工作平均周轉時間為 10 20 30 3 20 example 2 工作平均周轉時間為 100 110 120 3 120 7.4 最短任務優先 sjf example 1 工作平均周轉時間為 10...
第七章 進度計畫
一 單項選擇題 1.快速跟進是指 採用並行執行任務,加速專案進展 用乙個任務取代另外的任務 如有可能,減少任務數量 減輕專案風險 試題解析 a 參 採用並行執行任務,加速專案進展 2.下面哪一項可以決定進度的靈活性?pert 總浮動adm 趕工 試題解析 b 參 總浮動 3.是專案衝突的主要原因,尤...