操作系統(tǒng)第五個實驗報告15_第1頁
操作系統(tǒng)第五個實驗報告15_第2頁
操作系統(tǒng)第五個實驗報告15_第3頁
操作系統(tǒng)第五個實驗報告15_第4頁
操作系統(tǒng)第五個實驗報告15_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、甘肅政法學院本科生實驗報告(五)姓名:xxx學院:信息工程學院專業(yè):計算機科學與技術(shù)班級:2013級計算機科學與技術(shù)本科班實驗課程名稱:操作系統(tǒng) 實驗日期: 2016年5月20 日開課時間:2015-2016 學年 第二學期甘肅政法學院實驗管理中心印制實驗題目進程的共享主存通信、進程的信號量通信小組合作否姓名謝慧敏班級2013級計算機科學與技術(shù)本科班學 號201381010144一、實驗目的1、 了解和熟悉了共享存儲機制;2、 加深對進程通信的理解。 3、 熟悉消息通信機制、共享存儲器通信機制,進一步認識其與信號量通信的區(qū)別。二實驗環(huán)境Windows 7操作系統(tǒng)Vmware 軟件Red hat

2、 linux操作系統(tǒng)三、 實驗內(nèi)容與步驟一、進程的共享主存通信1. 共享主存段使用的數(shù)據(jù)結(jié)構(gòu)(1)共享主存段控制塊(或共享主存段頭)每個共享主存段都有一個控制塊,用來描述共享主存段的一些屬性,共享主存段控制塊定義在sys/shm.h中,其結(jié)構(gòu)如下:struct shmid_dsstruct ipc_perm shmperm; / * 共享主存段訪問控制結(jié)構(gòu) * /int shmsegsz; / * 共享段以字節(jié)為單位的長度 * /struct ptentry * shmptbl; / * 共享頁表始址 * /ushort shmlpid; / * 最近執(zhí)行共享段操作的進程標識 * /ushor

3、t shmcpid; / * 創(chuàng)建共享段的進程標識 * /ushort shmnattch; / * 當前附件段號 * /ushort shmcnattch; / * 主存中的附加段號 * /time_t shmatime; / * 最近一次附件操作的時間 * /time_t shmdtime; / * 最近一次與進程分離操作的時間 * /time_t shmctime; / * 最近一次修改時間 * /為了便于管理,系統(tǒng)將維持的共享主存段組成一個表,共有SHMMNI=100個元素,其結(jié)構(gòu)如下:struct shmid_ds shmenSHMMNI; / * 共享段表 * /其訪問控制結(jié)構(gòu)定義

4、如下:struct ipc_perm key_t key; ushort uid; /* owner euid and egid * / ushort gid; ushort cuid; ushort cgid; ushort mode; /*lower 9 bits of shmflg*/ ushort seq /*sequence number*/;(2)共享主存段的數(shù)據(jù)結(jié)構(gòu)每個共享主存段都對應一個頁表和允許的存取權(quán)限,結(jié)構(gòu)如下;struct shmptdsint shmspte; /*開始也表項*/int shmsflg; /*對共享段的讀/寫權(quán)限*/每個進程最多允許6個共享主存段(SH

5、MSEG=6).2. 申請一個共享主存段參與通信的進程,通信前要先申請一個共享主存段,若是第一次申請,則要為其分配一個主存空間及頁表,并對共享主存區(qū)控制塊進行初始化,申請共享主存段調(diào)用語法如下:# include<sys/ipc.h># include<sys/shm.h>int shmget(key_t key,size_t size,int shmflg)其中,key為共享主存段的關(guān)鍵字,size是共享主存段字節(jié)長度,shmflg為創(chuàng)建和訪問標志。返回值:成功時,為與key值相關(guān)的共享主存段的標識號,且大小是頁對齊;失敗時,為-1。如果key的值為IPC_PRIVA

6、TE,或不為IPC_PRIVATE,創(chuàng)建的共享段與key無關(guān),關(guān)鍵字由系統(tǒng)分配。Shmflg由如下成分組成:.IPC_CREAT,創(chuàng)建一個新段。如果該標志沒有設置,將查找與key相關(guān)的段,且該段允許用戶訪問。.IPC_EXCL,與IPC_CREAT一起使用,確保創(chuàng)建一個新的共享段。若該段已經(jīng)存在,出錯。低9位為三類用戶的訪問方式的定義。3. 將共享段附加到申請通信的進程空間對于已申請通信所需的共享段,進程需把它附加到自己的虛擬空間后才能對其進行讀寫,將共享段附加到申請通信的進程空間的函數(shù)調(diào)用語法:#include < sys/sem.h >void shmat ( int shmi

7、d,void * shmadd,int shmflg);這里shmid是進程調(diào)用shmget后返回的共享段標識號;shmadd是給出的應附加到進程虛空間的地址;shmflg為允許對共享段的訪問方式。返回值:成功時為附加到進程地址空間的虛地址,失敗時為-1。連接到進程虛空間的地址規(guī)則為:.shmadd為0,則將該共享段附加到系統(tǒng)選擇的進程的第一個可用地址之后。.shmadd為非0,如果shmflg指定了SHM_RND標志,則將該共享段附加shmadd取整后指定的地址上。.shmadd為非0,如果shmflg未指定SHM_RND標志,則將該共享段附加shmadd指定的地址上。通常將shmadd指定

8、為0,由系統(tǒng)安排連接地址。4.將共享段與進程之間解除鏈接當進程不再需要共享段時,將其從它的地址空間拆下,調(diào)用語法為:#include < sys/sem.h >int shmdt( void * shmaddr );其中,shmaddr是共享段在進程地址空間的虛地址。返回值為0。5.對共享段進行控制#include < sys/sem.h >int shmctl(int shmid,int cmd,struct_ds * buf);返回值:成功時為0,失敗時為-1。系統(tǒng)調(diào)用shmctl根據(jù)控制命令cmd對共享段進行控制。cmd可能的取值有:. IPC_STAT,將有關(guān)共

9、享段的信息復制到具有shmid_ds結(jié)構(gòu)的buf中;. IPC_SET,用于用戶和用戶組,或?qū)ζ浯嫒?quán)限進行修改,要求用戶必須為超級用戶或擁有者;. IPC_RMID,用于標志刪除共享段。在共享段與所有進行分離時,實際進行刪除;. IPC_LOCK,在Linux環(huán)境下,將共享段鎖在主存中;. IPC_UNLOCK,在Linux環(huán)境下,允許將共享段鎖換出主存。二、進程的信號量【預備知識】在Linux中,一個或多個信號量構(gòu)成一個信號量集合。使用信號量機制用來實現(xiàn)進程之間的同步和互斥,允許并發(fā)進程一次對一組信號量進行相同或不同的操作。每個P、V操作不限于減1或加1,而是可以加減任何整數(shù)。在進程終止時

10、,系統(tǒng)可根據(jù)需要自動消除所有被進程操作過的信號量的影響。1.信號量機制中使用的數(shù)據(jù)結(jié)構(gòu)系統(tǒng)中的每個信號量都有一個數(shù)據(jù)結(jié)構(gòu)定義在sys/sem.h中。結(jié)構(gòu)定義如下:struct sem ushort semval; /*信號量的當前值*/ short sempid; /* 最近一次對該信號操作的進程標識*/ ushort semncnt; /*等待信號量值增加的進程數(shù)*/ ushort semzcnt; /*等待信號量值等于0的進程數(shù)*/2.信號量集合的數(shù)據(jù)結(jié)構(gòu)系統(tǒng)為每個信號集合保持一個頭文件定義在sys/sem.h中。結(jié)構(gòu)定義如下:struct semid_dsstruct ipc_perm

11、sem_perm; /*對信號量的訪問方式,見消息緩沖*/time_t sem_otime; /*最后操作信號量集合的時間*/time_t sem_ctime; /*最后修改信號量集合的時間*/struct sem *sem_base; /*指向集合中第一個信號量的指針*/ ushort sem_nsems; /*集合中的信號量個數(shù)*/ 3.信號量集合的建立任何進程在使用信號量之前,通過使用如下函數(shù)申請建立一個信號量集合:# include <sys/types.h># include <sys/ipc.h># include <sys/sem.h>int

12、semget(key_t key,int nsems,int semflg)其中,key為用戶進程指定的信號量集合的關(guān)鍵字,nsems為信號量集合中的信號量數(shù),semflg為訪問標志。返回值:成功時,返回信號量集合的標識號,失敗時,返回-1。semflg 由以下成分組成:·IPC_CREAT,創(chuàng)建一個新的信號量集合。如果該標志沒有設置,將查找于key相關(guān)的信號量集合。·IPC_EXCL,與IPC_CREAT一起使用,確保創(chuàng)建一個新的信號量集合。若該段已經(jīng)存在,出錯。低9位為三類用戶的訪問方式的定義。4.對信號量的操作通過調(diào)用semop()函數(shù),進程對一信號量集合中的一個或多

13、個信號執(zhí)行P/V操作,其操作命令由用戶提供的信號操作模版(sembuf)定義,該模版的結(jié)構(gòu)如下:Structsembuf ushort sem_num; /*信號量的序號*/ short sem_op /*具體執(zhí)行的操作(即P或V操作)* / short sem_flg; /*訪問標志*/調(diào)用語法為:# include <sys/sem.h>int semop(int semid,struct sembuf *sops,unsigned nsops);其中,semid是進程調(diào)用semget后返回的信號量集合的標識,sops是用戶提供的信號量操作模版數(shù)組(sembuf)的指針,nso

14、ps為數(shù)組sembuf中的元素數(shù)(即一次需進行的操作數(shù))。正常返回值為0。5.對信號量執(zhí)行控制操作當要讀取和修改信號量集合的有關(guān)狀態(tài)信息,或撤銷信號量集合時,調(diào)用命令semctl()對信號量執(zhí)行控制操作。其調(diào)用語法為:int semctl(int semid,int semnum,int cmd,union semun arg);其中,semid是信號量集合的標識,semnum是要處理信號量集合中的信號量序號,cmd為要執(zhí)行的操作命令,arg為控制操作需要的參數(shù),是一個指向聯(lián)合semun的指針。函數(shù)semctl成功返回時為0。semun定義為:union semun int val;/ * v

15、alue forSETVAL * / struct semid_ds * buf ; / * buffer for IPC_SET & IPC_STAT */ ushort array ;/ * buffor for IPC_INFO * / arg;cmd的可能取值有:GETPID 返回最近一個隊信號量操作的進程標識 GETVAL 返回索引為semnum的信號量的值 GETALL 返回一個集合中所有信號量的值到arg.array中GETNCNT 返回睡眠等待信號量值為正的進程的數(shù)GETZCNT 返回睡眠等待信號量值為0的進程數(shù)SETVAL 設置索引為semnum的信號量的值為arg.

16、valSETALL 按照數(shù)組arg.array,設置一個集合中所有信號量的值IPC_STAT 若為讀,可將指定semid的信號量頭結(jié)構(gòu)讀入arg.buf中獲得信號量的值IPC_SET 按照arg.buf設置用戶標識、組標識和訪問權(quán)限。若不是給定的有效用戶標識,立即返回IPC_RMID 刪除指定標識的信號量集合四、實驗過程與分析一、進程的共享主存通信1、編程實現(xiàn)一個是進程向共享段寫信息的例子。程序源代碼:#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#define SHMKEY 75

17、#define K 1024int shmid;main() int i,*pint; char *addr; extern char *shmat(); shmid=shmget(SHMKEY,16*K,0777|IPC_CREAT); /*申請創(chuàng)建一個16K大小的共享存儲段,其標識號為SHMKEY*/ addr=shmat(shmid,0,0); /*缺省地址將共享段附加到系統(tǒng)指定位置*/ printf(“addr ox%xn”,addr);/*打印附加到進程地址空間的地址*/ pint=(int *) addr; for (i=0;i<256;i+) *pint+=i; /*向共享

18、主存段寫入0255個數(shù)*/ pint=(int *)addr; *pint=256; /*共享段第一個字中寫入信息長度256,以便接收進程讀*/ pause(); /*暫停等待接收進程讀*/運行結(jié)果:2、 編程實現(xiàn)從共享段讀信息的例子程序源代碼:#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#define SHMKEY 75#define K 1024int shmid;main() int i,*pint; char *addr; extern char *shmat(); sh

19、mid=shmget(SHMKEY,8*K,0777); /*由SHMKEY得到共享段標識號*/ addr=shmat(shmid,0,0); /*將共享段與本進程相連*/ pint=(int *) addr; while (*pint=0); /*若共享區(qū)無信息時,在此等待*/for (i=0;i<256;i+) printf(“%dn”,*pint+);運行結(jié)果:二、進程的信號量通信1、編程實現(xiàn)多個進程對同一文件的互斥寫入。程序源代碼:#include < stdio.h >#include < stdlib.h >#include < unistd.h

20、 >#include < time.h >#include < sys/types.h >#include < sys/wait.h >#include < linux/sem.h >#define NUM_PROCS 5#define SEM_ID 250#define FILE_NAME ”/tmp/sem_MUTEX” /* 互斥共享寫入的文件名稱 */#define DELAY 400000/各子進程互斥寫文件的通用函數(shù)void update_file(int sem _set_id,char *file_name_path,int

21、 number) struct sembuf sem_op;FILE *file;/相當于執(zhí)行P操作,申請寫文件sem_op.sem_num=0;sem_op.sem_op=-1;sem_op.sem_flg=0;semop(sem_set_id,&sem_op,1);/向文件寫,寫入的數(shù)據(jù)是進程的標識file=fopen(file_name_path,”w”);if(file) fprintf(file,”%dn”,number); printf(“%dn”,number); fclose(file);/相當于執(zhí)行V操作,釋放文件的使用權(quán) sem_op.sem_num=0; sem_

22、op.sem_op=1; sem_op.sem_flg=0; semop(sem_set_id,&sem_op,1);/子進程準備寫文件的通用函數(shù)void do_child_loop(int sem_set_id,char *file_name) pid_t pid=getpid(); /得到本進程的標識 int i,j; for(i=0;i<3;i+) update_file(sem_set_id,file_name,pid); for(j=0;j<200000;j+); /*暫停一段時間*/ /主函數(shù)int main(int argc,char*argv) Int sem_set_id,child_pid;union semun sem_val;int i,rc;/創(chuàng)建一個信號量集合,標識為225,只有一個信號量sem_set_id=semget(SEM_ID,1,IPC_CREAT|0600);if(sem_set_id=-1) perr

溫馨提示

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

評論

0/150

提交評論