山東大學作業系統實驗四

2021-07-02 07:16:43 字數 2709 閱讀 1528

一.實驗內容:

抽菸者問題。假設乙個系統中有三個抽菸者程序,每個抽菸者不斷地捲菸並抽菸。抽菸者捲起並抽掉一顆煙需要有三種材料:菸草、紙和膠水。乙個抽菸者有菸草,乙個有紙,另乙個有膠水。系統中還有兩個**者程序,它們無限地**所有三種材料,但每次僅輪流提供三種材料中的兩種。得到缺失的兩種材料的抽菸者在捲起並抽掉一顆菸後會發訊號通知**者,讓它繼續提供另外的兩種材料。這一過程重複進行。 請用以上介紹的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...