日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

山东大学linux实验报告,山东大学操作系统实验四

發(fā)布時(shí)間:2025/3/12 linux 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 山东大学linux实验报告,山东大学操作系统实验四 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一.實(shí)驗(yàn)內(nèi)容:

抽煙者問(wèn)題。假設(shè)一個(gè)系統(tǒng)中有三個(gè)抽煙者進(jìn)程,每個(gè)抽煙者不斷地卷煙并抽煙。抽煙者卷起并抽掉一顆煙需要有三種材料:煙草、紙和膠水。一個(gè)抽煙者有煙草,一個(gè)有紙,另一個(gè)有膠水。系統(tǒng)中還有兩個(gè)供應(yīng)者進(jìn)程,它們無(wú)限地供應(yīng)所有三種材料,但每次僅輪流提供三種材料中的兩種。得到缺失的兩種材料的抽煙者在卷起并抽掉一顆煙后會(huì)發(fā)信號(hào)通知供應(yīng)者,讓它繼續(xù)提供另外的兩種材料。這一過(guò)程重復(fù)進(jìn)行。 請(qǐng)用以上介紹的IPC同步機(jī)制編程,實(shí)現(xiàn)該問(wèn)題要求的功能。

二.實(shí)驗(yàn)思路:

1.生產(chǎn)者要能提供三種組合的原料:煙草,紙(SP),煙草,膠水(SG),或是紙和膠水(PG),這就需要一個(gè)隨機(jī)數(shù),來(lái)決定提供哪種組合的原料。因?yàn)樾枰獌蓚€(gè)供應(yīng)者,所以要兩個(gè)生產(chǎn)者,兩個(gè)生產(chǎn)者生產(chǎn)的內(nèi)容一樣,決定通過(guò)父子進(jìn)程來(lái)實(shí)現(xiàn)。因?yàn)楦缸舆M(jìn)程同時(shí)向一個(gè)臨界區(qū)里寫(xiě)東西,所以加上互斥。并且生產(chǎn)者能發(fā)送三種信號(hào)來(lái)喚醒不同的消費(fèi)者。

2.需要三個(gè)消費(fèi)者分別消費(fèi)不同的內(nèi)容,通過(guò)父進(jìn)程創(chuàng)建兩個(gè)子進(jìn)程來(lái)實(shí)現(xiàn),父進(jìn)程和兩個(gè)子進(jìn)程分別執(zhí)行不同的內(nèi)容,這個(gè)和實(shí)驗(yàn)一的內(nèi)容很相似。三個(gè)進(jìn)程在取東西對(duì)臨界區(qū)進(jìn)行修改的時(shí)候要互斥。

3.因?yàn)殚_(kāi)始時(shí)沒(méi)有資源,所以將喚醒消費(fèi)者的三個(gè)信號(hào)的信號(hào)量初始值都設(shè)為0,因?yàn)樯a(chǎn)者一次僅供應(yīng)一個(gè)消費(fèi)者,所以將消費(fèi)者喚醒生產(chǎn)者的那個(gè)信號(hào)量初始值設(shè)為1。控制互斥的兩個(gè)信號(hào)量pmtx和cmtx都設(shè)為1。

代碼如下:

ipc.h:

#include#include#include#include#include#include#include#define BUFSZ256

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{

int val;

}Sem_uns;

typedef struct msgbuf{

long mtype;

char mtext[1];

}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;

//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_flg;

int shm_flg;

ipc.c:

#include "ipc.h"

int get_ipc_id(char *proc_file,key_t key)

{

FILE *pf;

int i,j;

char line[BUFSZ],colum[BUFSZ];

if((pf=fopen(proc_file,"r"))==NULL){

perror("Proc file not open.");

exit(EXIT_FAILURE);

}

fgets(line,BUFSZ,pf);

while(!feof(pf)){

i=j=0;

fgets(line,BUFSZ,pf);

while(line[i]==' ') i++;

while(line[i]!=' ') colum[j++]=line[i++];

colum[j]='\0';

if(atoi(colum)!=key) continue;

j=0;

while(line[i]==' ') i++;

while(line[i]!=' ') colum[j++]=line[i++];

colum[j]='\0';

i=atoi(colum);

fclose(pf);

return i;

}

fclose(pf);

return -1;

}

int down(int sem_id)

{

struct sembuf buf;

buf.sem_op=-1;

buf.sem_num=0;

buf.sem_flg=SEM_UNDO;

if((semop(sem_id,&buf,1))<0){

perror("down error");

exit(EXIT_FAILURE);

}

return EXIT_SUCCESS;

}

int up(int sem_id)

{

struct sembuf buf;

buf.sem_op=1;

buf.sem_num=0;

buf.sem_flg=SEM_UNDO;

if((semop(sem_id,&buf,1))<0){

perror("up error");

exit(EXIT_FAILURE);

}

return EXIT_SUCCESS;

}

int set_sem(key_t sem_key,int sem_val,int sem_flg){

int sem_id;

Sem_uns sem_arg;

if((sem_id=get_ipc_id("/proc/sysvipc/sem",sem_key))<0)

{

if((sem_id=semget(sem_key,1,sem_flg))<0)

{

perror("semaphore create error");

exit(EXIT_FAILURE);

}

sem_arg.val=sem_val;

if(semctl(sem_id,0,SETVAL,sem_arg)<0)

{

perror("semaphore set error");

exit(EXIT_FAILURE);

}

}

return sem_id;

}

char*set_shm(key_t shm_key,int shm_num,int shm_flg)

{

int i,shm_id;

char*shm_buf;

if((shm_id=get_ipc_id("/proc/sysvipc/shm",shm_key))<0)

{

if((shm_id=shmget(shm_key,shm_num,shm_flg))<0)

{

perror("shareMemory set error");

exit(EXIT_FAILURE);

}

if((shm_buf=(char*)shmat(shm_id,0,0))producer.c:

#include"ipc.h"

int main(int argc,char*argv[]){

int rate;

if(argv[1]!=NULL) rate=atoi(argv[1]);

else rate=3;

buff_key=101;

buff_num=8;

pput_key=102;

pput_num=1;

shm_flg=IPC_CREAT|0644;

buff_ptr=(char*)set_shm(buff_key,buff_num,shm_flg);

pput_ptr=(int*)set_shm(pput_key,pput_num,shm_flg);

prod_key=201;

pmtx_key=202;

c_PG_key=301;

c_SP_key=302;

c_SG_key=303;

sem_flg=IPC_CREAT|0644;

sem_val=1;

prod_sem=set_sem(prod_key,sem_val,sem_flg);

sem_val=0;

c_PG_sem=set_sem(c_PG_key,sem_val,sem_flg);

c_SG_sem=set_sem(c_SG_key,sem_val,sem_flg);

c_SP_sem=set_sem(c_SP_key,sem_val,sem_flg);

sem_val=1;

pmtx_sem=set_sem(pmtx_key,sem_val,sem_flg);

int pid;

pid=fork();

if(pid==0){

while(1){

int r=rand()%3;

if(r==0){

down(prod_sem);

down(pmtx_sem);

buff_ptr[*pput_ptr+1]='P';

buff_ptr[*pput_ptr+2]='G';

sleep(rate);

printf("%d渚涘簲鍟嗘彁渚涳細(xì)綰?c,鑳舵按%c\n",getpid(),buff_ptr[*pput_ptr+1],buff_ptr[*pput_ptr]+2);

up(pmtx_sem);

up(c_PG_sem);}

else if(r==1){

down(prod_sem);

down(pmtx_sem);

buff_ptr[*pput_ptr]='S';

buff_ptr[*pput_ptr+2]='G';

sleep(rate);

printf("%d渚涘簲鍟嗘彁渚涳細(xì)鐑?c,鑳舵按%c\n",getpid(),buff_ptr[*pput_ptr],buff_ptr[*pput_ptr]+2);

up(pmtx_sem);

up(c_SG_sem);

}

else if(r==2){

down(prod_sem);

down(pmtx_sem);

buff_ptr[*pput_ptr]='S';

buff_ptr[*pput_ptr+1]='P';

sleep(rate);

printf("%d渚涘簲鍟嗘彁渚涳細(xì)鐑?c,綰?c\n",getpid(),buff_ptr[*pput_ptr],buff_ptr[*pput_ptr]+1);

up(pmtx_sem);

up(c_SP_sem);}}

}else{

while(1){

int r=rand()%3;

if(r==0){

down(prod_sem);

down(pmtx_sem);

buff_ptr[*pput_ptr+1]='P';

buff_ptr[*pput_ptr+2]='G';

sleep(rate);

printf("%d渚涘簲鍟嗘彁渚涳細(xì)綰?c,鑳舵按%c\n",getpid(),buff_ptr[*pput_ptr+1],buff_ptr[*pput_ptr]+2);

up(pmtx_sem);

up(c_PG_sem);}

else if(r==1){

down(prod_sem);

down(pmtx_sem);

buff_ptr[*pput_ptr]='S';

buff_ptr[*pput_ptr+2]='G';

sleep(rate);

printf("%d渚涘簲鍟嗘彁渚涳細(xì)鐑?c,鑳舵按%c\n",getpid(),buff_ptr[*pput_ptr],buff_ptr[*pput_ptr]+2);

up(pmtx_sem);

up(c_SG_sem);

}

else if(r==2){

down(prod_sem);

down(pmtx_sem);

buff_ptr[*pput_ptr]='S';

buff_ptr[*pput_ptr+1]='P';

sleep(rate);

printf("%d渚涘簲鍟嗘彁渚涳細(xì)鐑?c,綰?c\n",getpid(),buff_ptr[*pput_ptr],buff_ptr[*pput_ptr]+1);

up(pmtx_sem);

up(c_SP_sem);}}

}

return EXIT_SUCCESS;

}

consumer.c:

#include"ipc.h"

int main(int argc,char*argv[]){

int rate;

if(argv[1]!=NULL) rate=atoi(argv[1]);

else rate=3;

buff_key=101;

buff_num=3;

cget_key=103;

cget_num=1;

shm_flg=IPC_CREAT|0644;

buff_ptr=(char*)set_shm(buff_key,buff_num,shm_flg);

cget_ptr=(int*)set_shm(cget_key,cget_num,shm_flg);

prod_key=201;

pmtx_key=202;

c_PG_key=301;

c_SP_key=302;

c_SG_key=303;

sem_flg=IPC_CREAT|0644;

sem_val=1;

prod_sem=set_sem(prod_key,sem_val,sem_flg);

sem_val=0;

c_PG_sem=set_sem(c_PG_key,sem_val,sem_flg);

c_SG_sem=set_sem(c_SG_key,sem_val,sem_flg);

c_SP_sem=set_sem(c_SP_key,sem_val,sem_flg);

sem_val=1;

cmtx_sem=set_sem(cmtx_key,sem_val,sem_flg);

int pid1,pid2;

if((pid1=fork())==0){

while(1){

down(c_PG_sem);

down(cmtx_sem);

sleep(rate);

printf("%d鏈夌儫鑽夌殑鍚哥儫鑰呬粠渚涘簲鍟嗗緱鍒扮焊%c,鑳舵按%c寮€濮嬪惛鐑焅n",getpid(),buff_ptr[*cget_ptr+1],buff_ptr[*cget_ptr]+2);

up(cmtx_sem);

up(prod_sem);}}

else if((pid2=fork())==0){

while(1){

down(c_SG_sem);

down(cmtx_sem);

sleep(rate);

printf("%d鏈夌焊鐨勫惛鐑熻€呬粠渚涘簲鍟嗗緱鍒扮儫%c,鑳舵按%c寮€濮嬪惛鐑焅n",getpid(),buff_ptr[*cget_ptr],buff_ptr[*cget_ptr]+2);

up(cmtx_sem);

up(prod_sem);}}

else{

while(1){

down(c_SP_sem);

down(cmtx_sem);

sleep(rate);

printf("%d鏈夎兌姘寸殑鍚哥儫鑰呬粠渚涘簲鍟嗗緱鍒扮儫%c,綰?c寮€濮嬪惛鐑焅n",getpid(),buff_ptr[*cget_ptr],buff_ptr[*cget_ptr]+1);

up(cmtx_sem);

up(prod_sem);}}

return EXIT_SUCCESS;

}

在linux系統(tǒng)中寫(xiě)的中文拿到windows系統(tǒng)上是亂碼。

總結(jié)

以上是生活随笔為你收集整理的山东大学linux实验报告,山东大学操作系统实验四的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。