山東大學(xué)操作系統(tǒng)實(shí)驗(yàn)報(bào)告4進(jìn)程同步實(shí)驗(yàn)_第1頁
山東大學(xué)操作系統(tǒng)實(shí)驗(yàn)報(bào)告4進(jìn)程同步實(shí)驗(yàn)_第2頁
山東大學(xué)操作系統(tǒng)實(shí)驗(yàn)報(bào)告4進(jìn)程同步實(shí)驗(yàn)_第3頁
山東大學(xué)操作系統(tǒng)實(shí)驗(yàn)報(bào)告4進(jìn)程同步實(shí)驗(yàn)_第4頁
山東大學(xué)操作系統(tǒng)實(shí)驗(yàn)報(bào)告4進(jìn)程同步實(shí)驗(yàn)_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院實(shí)驗(yàn)報(bào)告 實(shí)驗(yàn)題目:實(shí)驗(yàn)四、進(jìn)程同步實(shí)驗(yàn)學(xué)號(hào):日期:20120409班級(jí):計(jì)基地12姓名: 實(shí)驗(yàn)?zāi)康模杭由顚?duì)并發(fā)協(xié)作進(jìn)程同步與互斥概念的理解,觀察和體驗(yàn)并發(fā)進(jìn)程同步與互斥操作的效果,分析與研究經(jīng)典進(jìn)程同步與互斥問題的實(shí)際解決方案。了解 Linux 系統(tǒng)中 IPC 進(jìn)程同步工具的用法,練習(xí)并發(fā)協(xié)作進(jìn)程的同步與互斥操作的編程與調(diào)試技術(shù)。實(shí)驗(yàn)內(nèi)容:抽煙者問題。假設(shè)一個(gè)系統(tǒng)中有三個(gè)抽煙者進(jìn)程,每個(gè)抽煙者不斷地卷煙并抽煙。抽煙者卷起并抽掉一顆煙需要有三種材料:煙草、紙和膠水。一個(gè)抽煙者有煙草,一個(gè)有紙,另一個(gè)有膠水。系統(tǒng)中還有兩個(gè)供應(yīng)者進(jìn)程,它們無限地供應(yīng)所有三種材料,但每

2、次僅輪流提供三種材料中的兩種。得到缺失的兩種材料的抽煙者在卷起并抽掉一顆煙后會(huì)發(fā)信號(hào)通知供應(yīng)者,讓它繼續(xù)提供另外的兩種材料。這一過程重復(fù)進(jìn)行。 請(qǐng)用以上介紹的 IPC 同步機(jī)制編程,實(shí)現(xiàn)該問題要求的功能。硬件環(huán)境: 處理器:Intel® Core i3-2350M CPU 2.30GHz × 4 圖形:Intel® Sandybridge Mobile x86/MMX/SSE2內(nèi)存:4G操作系統(tǒng):32位磁盤:20.1 GB軟件環(huán)境:ubuntu13.04實(shí)驗(yàn)步驟:(1)新建定義了producer和consumer共用的IPC函數(shù)原型和變量的ipc.h文件

3、。(2)新建ipc.c文件,編寫producer和consumer共用的IPC的具體相應(yīng)函數(shù)。(3)新建Producer文件,首先定義producer的一些行為,利用系統(tǒng)調(diào)用,建立共享內(nèi)存區(qū)域,設(shè)定其長(zhǎng)度并獲取共享內(nèi)存的首地址。然后設(shè)定生產(chǎn)者互斥與同步的信號(hào)燈,并為他們?cè)O(shè)置相應(yīng)的初值。當(dāng)有生產(chǎn)者進(jìn)程在運(yùn)行而其他生產(chǎn)者請(qǐng)求時(shí),相應(yīng)的信號(hào)燈就會(huì)阻止他,當(dāng)共享內(nèi)存區(qū)域已滿時(shí),信號(hào)等也會(huì)提示生產(chǎn)者不能再往共享內(nèi)存中放入內(nèi)容。(4) 新建Consumer文件,定義consumer的一些行為,利用系統(tǒng)調(diào)用來創(chuàng)建共享內(nèi)存區(qū)域,并設(shè)定他的長(zhǎng)度并獲取共享內(nèi)存的首地址。然后設(shè)定消費(fèi)者互斥與同步的信號(hào)燈,

4、并為他們?cè)O(shè)置相應(yīng)的初值。當(dāng)有消費(fèi)進(jìn)程在運(yùn)行而其他消費(fèi)者請(qǐng)求時(shí),相應(yīng)的信號(hào)燈就會(huì)阻止它,當(dāng)共享內(nèi)存區(qū)域已空時(shí),信號(hào)等也會(huì)提示生產(chǎn)者不能再?gòu)墓蚕韮?nèi)存中取出相應(yīng)的內(nèi)容。運(yùn)行的消費(fèi)者應(yīng)該與相應(yīng)的生產(chǎn)者對(duì)應(yīng)起來,只有這樣運(yùn)行結(jié)果才會(huì)正確。結(jié)論分析與體會(huì): 實(shí)現(xiàn)方式: Consumer:#include "ipc.h" int main(int argc,char *argv) int rate = 3; int consumerid=atoi(argv1); buff_h = 101; buff_number = 1; cget_h = 103; cget_number = 1; s

5、hm_flg = IPC_CREAT | 0644; buff_ptr = (char *)set_shm(buff_h,buff_number,shm_flg); cget_ptr = (int *)set_shm(cget_h,cget_number,shm_flg); prod_h = 201; pmtx_h = 202; cons_h = 301; cmtx_h = 302;sem_flg = IPC_CREAT | 0644; sem_val = buff_number; prod_sem = set_sem(prod_h,sem_val,sem_flg); sem_val = 0;

6、 cons_sem = set_sem(cons_h,sem_val,sem_flg); sem_val = 1; cmtx_sem = set_sem(cmtx_h,sem_val,sem_flg); if(consumerid=0)*cget_ptr=0;while(1) if(buff_ptr0-'A'=consumerid)down(cons_sem); down(cmtx_sem); sleep(rate); if(buff_ptr0='A')printf("%d The consumer has glue.nThe consumer get

7、s tobacco and papern",getpid(); if(buff_ptr0='B')printf("%d The consumer has paper.nThe consumer gets tobacco and gluen",getpid(); if(buff_ptr0='C')printf("%d The consumer has tobacco.nThe consumer gets glue and papern",getpid(); *cget_ptr = (*cget_ptr+1);if(

8、*cget_ptr%2=0)buff_ptr0='D'elsebuff_ptr0='E'up(cmtx_sem); up(prod_sem); return EXIT_SUCCESS; Producer:#include "ipc.h"int main(int argc,char *argv)int rate=3;int producerid=atoi(argv1);buff_h=101;buff_number=1;pput_h=102;pput_number=1;shm_flg=IPC_CREAT|0644;buff_ptr = (char

9、 *)set_shm(buff_h,buff_number,shm_flg); pput_ptr = (int *)set_shm(pput_h,pput_number,shm_flg);prod_h = 201;pmtx_h = 202;cons_h = 301;cmtx_h = 302;sem_flg = IPC_CREAT|0644; sem_val = buff_number;prod_sem = set_sem(prod_h,sem_val,sem_flg); sem_val = 0; cons_sem = set_sem(cons_h,sem_val,sem_flg); sem_v

10、al = 1; pmtx_sem = set_sem(pmtx_h,sem_val,sem_flg); if(producerid=0)buff_ptr0='D'*pput_ptr=0;while(1) if(buff_ptr0-'D'=producerid)down(prod_sem);down(pmtx_sem);*pput_ptr = (*pput_ptr+1)%3;if(*pput_ptr=0)buff_ptr0 = 'A'printf("%d The producer gives tobacco and papern"

11、;,getpid(); if(*pput_ptr=1)buff_ptr0 = 'B'printf("%d The producer gives tobacco and gluen",getpid(); if(*pput_ptr=2)buff_ptr0 = 'C'printf("%d The producer gives glue and papern",getpid(); sleep(rate);up(pmtx_sem); up(cons_sem); return EXIT_SUCCESS; Ipc.h:#include

12、"ipc.h"int get_ipc_id(char *proc_file,h_t h) FILE *pf; int m,n; char lineBUFSZ,columBUFSZ; if(pf = fopen(proc_file,"r") = NULL) perror("Proc file not open");exit(EXIT_FAILURE); fgets(line, BUFSZ,pf); while(!feof(pf) m = n = 0;fgets(line, BUFSZ,pf); while(linem = ' &

13、#39;) m+; while(linem !=' ')column+ = linem+; column = '0' if(atoi(colum) != h) continue; n=0;while(linem = ' ')m+; while(linem !=' ')column+ = linem+;column = '0' m = atoi(colum); fclose(pf); return m; fclose(pf);return -1; int down(int sem_id) struct sembuf

14、buf; buf.sem_op = -1; buf.sem_number = 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_number = 0; buf.sem_flg = SEM_UNDO;if(semop(sem_id,&buf,1) &l

15、t;0) perror("up error "); exit(EXIT_FAILURE); return EXIT_SUCCESS; int set_sem(h_t sem_h,int sem_val,int sem_flg) int sem_id; Sem_uns sem_arg;if(sem_id = get_ipc_id("/proc/sysvipc/sem",sem_h) < 0 ) if(sem_id = semget(sem_h,1,sem_flg) < 0) perror("semaphore create error

16、");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(h_t shm_h,int shm_number,int shm_flg) int m,shm_id;char * shm_buf; if(shm_id = get_ipc_id("/proc/sysvipc/shm&qu

17、ot;,shm_h) < 0 ) if(shm_id = shmget(shm_h,shm_number,shm_flg) <0) perror("shareMemory set error"); exit(EXIT_FAILURE); if(shm_buf = (char *)shmat(shm_id,0,0) < (char *)0) perror("get shareMemory error"); exit(EXIT_FAILURE); for(m=0; m<shm_number; m+) shm_bufm = 0;if(s

18、hm_buf = (char *)shmat(shm_id,0,0) < (char *)0) perror("get shareMemory error"); exit(EXIT_FAILURE); return shm_buf; int set_msq(h_t msq_h,int msq_flg) int msq_id; if(msq_id = get_ipc_id("/proc/sysvipc/msg",msq_h) < 0 ) if(msq_id = msgget(msq_h,msq_flg) < 0) perror("

19、;messageQueue set error"); exit(EXIT_FAILURE); return msq_id; 實(shí)驗(yàn)結(jié)果:分析:多進(jìn)程的系統(tǒng)中避免不了進(jìn)程間的相互關(guān)系。進(jìn)程互斥是進(jìn)程之間發(fā)生的一種間接性作用,一般是程序不希望的。通常的情況是兩個(gè)或兩個(gè)以上的進(jìn)程需要同時(shí)訪問某個(gè)共享變量。我們一般將發(fā)生能夠問共享變量的程序段稱為臨界區(qū)。兩個(gè)進(jìn)程不能同時(shí)進(jìn)入臨界區(qū),否則就會(huì)導(dǎo)致數(shù)據(jù)的不一致,產(chǎn)生與時(shí)間有關(guān)的錯(cuò)誤。解決互斥問題應(yīng)該滿足互斥和公平兩個(gè)原則,即任意時(shí)刻只能允許一個(gè)進(jìn)程處于同一共享變量的臨界區(qū),而且不能讓任一進(jìn)程無限期地等待。進(jìn)程同步是進(jìn)程之間直接的相互作用,是合作進(jìn)程

20、間有意識(shí)的行為,典型的例子是公共汽車上司機(jī)與售票員的合作。只有當(dāng)售票員關(guān)門之后司機(jī)才能啟動(dòng)車輛,只有司機(jī)停車之后售票員才能開車門。司機(jī)和售票員的行動(dòng)需要一定的協(xié)調(diào)。同樣地,兩個(gè)進(jìn)程之間有時(shí)也有這樣的依賴關(guān)系,因此我們也要有一定的同步機(jī)制保證它們的執(zhí)行次序。 信號(hào)量機(jī)制就是其中的一種。信號(hào)燈機(jī)制即利用pv操作來對(duì)信號(hào)量進(jìn)行處理。PV操作由P操作原語和V操作原語組成(原語是不可中斷的過程),對(duì)信號(hào)量進(jìn)行操作,具體定義如下: P(S):將信號(hào)量S的值減1,即S=S-1; 如果S³0,則該進(jìn)程繼續(xù)執(zhí)行;否則該進(jìn)程置為等待狀態(tài),排入等待隊(duì)列。 V(S):將信號(hào)量S的值加1,即S=S+1; 如果S>0,則該進(jìn)程繼續(xù)執(zhí)行;否則釋放隊(duì)列中第一個(gè)等待信號(hào)量的進(jìn)程。PV操作的意義:我們用信號(hào)量及PV操作來實(shí)現(xiàn)進(jìn)程的同步和互斥。信號(hào)量的數(shù)據(jù)結(jié)構(gòu)為一個(gè)值和一個(gè)指針,指針指向等待該信號(hào)量的下一個(gè)進(jìn)程。信號(hào)量的值與相應(yīng)資源的使用情況有關(guān)。當(dāng)它的值大于0時(shí),表示當(dāng)前可用資源的數(shù)量;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論