ipc.**件:
#include #include #include #include #include #include #include #define bufsz 256
//建立或獲取 ipc 的一組函式的原型說明
int get_ipc_id(char *proc_file,key_t key);
char *set_shm(key_t shm_key,int shm_num,int shm_flag);
int set_msq(key_t msq_key,int msq_flag);
int set_sem(key_t sem_key,int sem_val,int sem_flag);
int down(int sem_id);
int up(int sem_id);
/*訊號燈控制用的共同體*/
typedef union semuns sem_uns;
/* 訊息結構體*/
typedef struct msgbuf msg_buf;
//生產消費者共享緩衝區即其有關的變數
key_t buff_key;
int buff_num;
char *buff_ptr;
//生產者放產品位置的共享指標
key_t pput_key;
int pput_num;
int *pput_ptr;
//消費者取產品位置的共享指標
key_t cget_key;
int cget_num;
int *cget_ptr;
//生產者有關的訊號量
key_t prod_key;
key_t pmtx_key;
int prod_sem;
int pmtx_sem;
//消費者有關的訊號量
key_t c_pg_key;
key_t c_tp_key;
key_t c_tg_key;
key_t cmtx_key;
int c_pg_sem;
int c_tp_sem;
int c_tg_sem;
int cmtx_sem;
int sem_val;
int sem_***;
int shm_***;
ipc.c檔案:
#include "ipc.h"
/* * get_ipc_id() 從/proc/sysvipc/檔案系統中獲取ipc的id號
* pfile: 對應/proc/sysvipc/目錄中的ipc檔案分別為
* msg-訊息佇列,sem-訊號量,shm-共享記憶體
* key: 對應要獲取的ipc的id號的鍵值
*/ int get_ipc_id(char *proc_file,key_t key)
fgets(line, bufsz,pf);
while(!feof(pf))
fclose(pf);
return -1;
}/*
* 訊號燈上的down/up操作
* semid:訊號燈陣列識別符號
* semnum:訊號燈陣列下標
* buf:操作訊號燈的結構
*/ int down(int sem_id)
return exit_success;
}int up(int sem_id)
return exit_success;}/*
* set_sem 函式建立乙個具有 n 個訊號燈的訊號量
*如果建立成功,返回 乙個訊號燈陣列的識別符號 sem_id
*輸入引數:
* sem_key 訊號燈陣列的鍵值
* sem_val 訊號燈陣列中訊號燈的個數
* sem_flag 訊號等陣列的訪問許可權
*/int set_sem(key_t sem_key,int sem_val,int sem_***)
//設定訊號燈的初值
sem_arg.val = sem_val;
if(semctl(sem_id,0,setval,sem_arg) <0)
} return sem_id;}/*
* set_shm 函式建立乙個具有 n 個位元組 的共享記憶體區
*如果建立成功,返回 乙個指向該記憶體區首位址的指標 shm_buf
*輸入引數:
* shm_key 共享記憶體的鍵值
* shm_val 共享記憶體位元組的長度
* shm_flag 共享記憶體的訪問許可權
*/char * set_shm(key_t shm_key,int shm_num,int shm_***)
//shmat 將由 shm_id 標識的共享記憶體附加給指標 shm_buf
if((shm_buf = (char *)shmat(shm_id,0,0)) < (char *)0)
for(i=0; i
producer.c:
#include "ipc.h"
int main(int argc,char *ar**)
}} else
}}return exit_success;
}
consumer.c:
#include "ipc.h"
int main(int argc,char *ar**)
} else
}else
}} return exit_success;
}
makefile:
hdrs = ipc.h
opts = -g -c
c_src = consumer.c ipc.c
c_obj = consumer.o ipc.o
p_src = producer.c ipc.c
p_obj = producer.o ipc.o
all: producer consumer
consumer: $(c_obj)
gcc $(c_obj) -o consumer
consumer.o: $(c_src) $(hdrs)
gcc $(opts) $(c_src)
producer: $(p_obj)
gcc $(p_obj) -o producer
producer.o: $(p_src) $(hdrs)
gcc $(opts) $(p_src)
clean:
rm consumer producer *.o
作業系統 程序同步
臨界資源 critical resouce 臨界區 critical section 硬體同步機制 訊號量機制 訊號量的應用 管程3使用多道批處理系統不僅能有效的改善資源的利用率,還可以顯著地提高系統的吞吐量,但同時會使系統變得更加複雜,會使程式的執行結果存在不確定性。所以必須引入程序同步機制從而保...
作業系統 程序同步
引入程序 提高了資源的利用率和系統的吞吐量 程序的非同步性 會給系統造成混亂 程序同步基本概念 1,兩種形式的制約關係 a 間接相互制約 ab兩程序爭用一台印表機 b 直接相互制約 a程序放資料 緩衝區 b程序從緩衝區取資料 2,臨界資源 硬體臨界資源 軟體臨界資源 印表機,磁帶機,緩衝區。3,臨界...
作業系統 程序同步
生產者消費者問題 哲學家就餐 讀者寫著問題 銀行家演算法 程序同步是指在多道程式的環境下,存在著不同的制約關係,為了協調這種相互制約的關係,實現資源共享和程序協作,從而避免程序之間的衝突,進而引入程序同步。對於某些資源來說,在同一時間只能被乙個程序所占用,這些資源就被成為臨界資源。典型的臨界資源比如...