一.實驗內容:
抽菸者問題。假設乙個系統中有三個抽菸者程序,每個抽菸者不斷地捲菸並抽菸。抽菸者捲起並抽掉一顆煙需要有三種材料:菸草、紙和膠水。乙個抽菸者有菸草,乙個有紙,另乙個有膠水。系統中還有兩個**者程序,它們無限地**所有三種材料,但每次僅輪流提供三種材料中的兩種。得到缺失的兩種材料的抽菸者在捲起並抽掉一顆菸後會發訊號通知**者,讓它繼續提供另外的兩種材料。這一過程重複進行。 請用以上介紹的ipc同步機制程式設計,實現該問題要求的功能。
二.實驗思路:
1.生產者要能提供三種組合的原料:菸草,紙(sp),菸草,膠水(sg),或是紙和膠水(pg),這就需要乙個隨機數,來決定提供哪種組合的原料。因為需要兩個**者,所以要兩個生產者,兩個生產者生產的內容一樣,決定通過父子程序來實現。因為父子程序同時向乙個臨界區里寫東西,所以加上互斥。並且生產者能傳送三種訊號來喚醒不同的消費者。
2.需要三個消費者分別消費不同的內容,通過父程序建立兩個子程序來實現,父程序和兩個子程序分別執行不同的內容,這個和實驗一的內容很相似。三個程序在取東西對臨界區進行修改的時候要互斥。
3.因為開始時沒有資源,所以將喚醒消費者的三個訊號的訊號量初始值都設為0,因為生產者一次僅**乙個消費者,所以將消費者喚醒生產者的那個訊號量初始值設為1。控制互斥的兩個訊號量pmtx和cmtx都設為1。
**如下:
ipc.h:
#include#include#include#include#include#include#include#define bufsz 256
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 semunssem_uns;
typedef struct msgbufmsg_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;
//producer semaphore
key_t prod_key;
key_t pmtx_key;
int prod_sem;
int pmtx_sem;
//consumer semaphore
key_t c_pg_key;
key_t c_sg_key;
key_t c_sp_key;
key_t cmtx_key;
int c_pg_sem;
int c_sg_sem;
int c_sp_sem;
int cmtx_sem;
int sem_val;
int sem_***;
int shm_***;
ipc.c:
#include "ipc.h"
int get_ipc_id(char *proc_file,key_t key)
fgets(line,bufsz,pf);
while(!feof(pf))
fclose(pf);
return -1;
}int down(int sem_id)
return exit_success;
}int up(int sem_id)
return exit_success;
}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;
}char*set_shm(key_t shm_key,int shm_num,int shm_***)
if((shm_buf=(char*)shmat(shm_id,0,0))<(char*)0)
for(i=0;i
#include"ipc.h"
int main(int argc,char*argv)
else if(r==1)
else if(r==2)}
}else
else if(r==1)
else if(r==2)}
}return exit_success;
}
consumer.c:
#include"ipc.h"
int main(int argc,char*argv)}
else if((pid2=fork())==0)}
else}
return exit_success;
}
在linux系統中寫的中文拿到windows系統上是亂碼。
山東大學2023年作業系統試題
1.raid 2.system call 3.fat 4.blocking i o 5.block device 不確定了 6.file sharing 7.preemption 其他不記得了 順序也不記得了 1.簡述磁碟分配的三種方式 順序,鏈結,索引 各自的優缺點。2.給出allocation ...
山東大學數值計算實驗二(matlab)
數值計算實驗二 以及實驗報告位址 實驗題目 1 高斯消元法 computer problems p100 2.2,a b 1 用matlab語言提供的方法解方程組 x a b 2 寫出直接lu分解函式 參考例2.13 給出a的直接lu分解結果 3 寫前代 回代函式。結合lu分解,前代 回代解 a b...
山東大學資料庫系統實驗三
宣告 所有sql語句均在實驗平台驗證通過,實驗細節可能隨時間推移老師會進行修改。在此僅提供解答思路,畢竟我的方法肯定不是最優,而且實驗平台有查重功能,不要一昧的複製哦!1.刪除表中的學號不全是數字的那些錯誤資料,學號應該是數字組成,不能夠包含字母空格等非數字字元。create table test3...