操作系统进程同步实验报告_第1页
操作系统进程同步实验报告_第2页
操作系统进程同步实验报告_第3页
操作系统进程同步实验报告_第4页
操作系统进程同步实验报告_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验三:进程同步实验一、实验任务:(1)掌握操作系统的进程同步原理;(2)熟悉linux的进程同步原语;(3)设计程序,实现经典进程同步问题。二、实验原理:(1)P、V操作 PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下: P(S):将信号量S的值减1,即S=S-1; 如果S0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。 V(S):将信号量S的值加1,即S=S+1; 如果S0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。(2)信号量信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。

2、信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的值仅能由PV操作来改变。一般来说,信号量S0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个单位资源,因此S的值减1;当S0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。而执行一个V操作意味着释放一个单位资源,因此S的值加1;若S0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。(3)linux的进程同步原语wait();阻塞父进程,子进程执行;#include #include

3、 key_t ftok (char*pathname, char proj);它返回与路径pathname相对应的一个键值。int semget(key_t key, int nsems, int semflg) 参数key是一个键值,由ftok获得,唯一标识一个信号灯集,用法与msgget()中的key相同;参数nsems指定打开或者新创建的信号灯集中将包含信号灯的数目;semflg参数是一些标志位。参数key和semflg的取值,以及何时打开已有信号灯集或者创建一个新的信号灯集与msgget()中的对应部分相同。该调用返回与健值key相对应的信号灯集描述字。调用返回:成功返回信号灯集描述字

4、,否则返回-1。int semop(int semid, struct sembuf *sops, unsigned nsops); semid是信号灯集ID,sops指向数组的每一个sembuf结构都刻画一个在特定信号灯上的操作。nsops为sops指向数组的大小。int semctl(int semid,int semnum,int cmd,union semun arg) 该系统调用实现对信号灯的各种控制操作,参数semid指定信号灯集,参数cmd指定具体的操作类型;参数semnum指定对哪个信号灯操作,只对几个特殊的cmd操作有意义;arg用于设置或返回信号灯信息。三、实验源程序:#i

5、nclude#include#include#include#include#include#include#include#include #include #include #include #include #define PERM S_IRUSR|S_IWUSR#define SEMKEY (key_t)0x200typedef union _senum int val; struct semid_ds *buf; ushort *array;semun;int semid;static int count=0;FILE *fp,*fp1,*fp2;struct sembuf prmu

6、tex=0,-1,0,pwmutex=1,-1,0,ps=2,-1,0;struct sembuf vrmutex=0,1,0,vwmutex=1,1,0,vs=2,1,0;int initsem() semun x; x.val=1; if(semid=semget(SEMKEY,3,0600|IPC_CREAT|IPC_EXCL)=-1) if(errno=EEXIST) semid=semget(SEMKEY,3,0); if(semctl(semid,0,SETVAL,x)=-1) perror(semctl failedn); return(-1); if(semctl(semid,

7、1,SETVAL,x)=-1) perror(semctl failedn); return(-1); if(semctl(semid,2,SETVAL,x)=-1) perror(semctl failedn); return(-1); return(semid); main() int i,j,k; static int a30; int shmid; int *pint,*pint2,addr,addr2; for(i=0;i30;i+) ai=i; if(shmid=shmget(IPC_PRIVATE,4,PERM)=-1) fprintf(stderr,Create Share M

8、emory Error:%sna,strerror(errno);exit(1); addr=shmat(shmid,0,0) ; pint=(int*)addr; *pint=0; semid=initsem(); if(fork()=0) /writer semop(semid,&pwmutex,1); printf(call writern); fp1=fopen(a.txt,w); for(k=0;k20;k+) fprintf(fp1,%dn ,5*k); printf(write %dn ,5*k); fclose(fp1); printf(write finish!n); sem

9、op(semid,&vwmutex,1); exit(0); else if(fork()=0) /reader 1 semop(semid,&prmutex,1); addr2=shmat(shmid,0,0); pint2=(int*)addr2; if(*pint2=0) semop(semid,&pwmutex,1); *pint2=*pint2+1; printf(reader 1 enter- count=%dn,*pint2); semop(semid,&vrmutex,1); fp=fopen(a.txt,r); while(!feof(fp) fscanf(fp,%d ,&i

10、); printf(reader 1 %dn ,i); semop(semid,&prmutex,1); *pint2=*pint2-1; printf(reader 1 exit- count=%dn,*pint2); /count=count-1; /printf(count=%dn,count); if(*pint2=0) semop(semid,&vwmutex,1); semop(semid,&vrmutex,1); exit(0); else if(fork()=0) /reader semop(semid,&prmutex,1); addr2=shmat(shmid,0,0);

11、pint2=(int*)addr2; if(*pint2=0) semop(semid,&pwmutex,1); *pint2=*pint2+1; printf(Read 2 enter+ count=%dn,*pint2); / printf(Read 2 count=%dn,count); /count=2; /printf(count=%dn,count); semop(semid,&vrmutex,1); fp=fopen(a.txt,r); while(!feof(fp) fscanf(fp,%d ,&i); printf(reader 2 %dn ,i); semop(semid,&prmutex,1); /count=cou

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论