作業系統 程序同步

2021-09-30 11:55:48 字數 3349 閱讀 4589

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,臨界...

作業系統 程序同步

生產者消費者問題 哲學家就餐 讀者寫著問題 銀行家演算法 程序同步是指在多道程式的環境下,存在著不同的制約關係,為了協調這種相互制約的關係,實現資源共享和程序協作,從而避免程序之間的衝突,進而引入程序同步。對於某些資源來說,在同一時間只能被乙個程序所占用,這些資源就被成為臨界資源。典型的臨界資源比如...