linux进程创建与同步实验报告,操作系统进程同步实验报告

《操作系统进程同步实验报告》由会员分享,可在线阅读,更多相关《操作系统进程同步实验报告(8页珍藏版)》请在人人文库网上搜索。

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;当S#include key_t ftok (char*pathname, char proj);它返回与路径pathname相对应的一个键值。int semget(key_t key, int nsems, int semflg) 参数key是一个键值,由ftok获得,唯一标识一个信号灯集,用法与msgget()中的key相同;参。

3、数nsems指定打开或者新创建的信号灯集中将包含信号灯的数目;semflg参数是一些标志位。参数key和semflg的取值,以及何时打开已有信号灯集或者创建一个新的信号灯集与msgget()中的对应部分相同。该调用返回与健值key相对应的信号灯集描述字。调用返回:成功返回信号灯集描述字,否则返回-1。int semop(int semid, struct sembuf *sops, unsigned nsops); semid是信号灯集ID,sops指向数组的每一个sembuf结构都刻画一个在特定信号灯上的操作。nsops为sops指向数组的大小。int semctl(int semid,in。

4、t semnum,int cmd,union semun arg) 该系统调用实现对信号灯的各种控制操作,参数semid指定信号灯集,参数cmd指定具体的操作类型;参数semnum指定对哪个信号灯操作,只对几个特殊的cmd操作有意义;arg用于设置或返回信号灯信息。三、实验源程序:#include#include#include#include#include#include#include#include#include #include #include #include #include #define PERM S_IRUSR|S_IWUSR#define SEMKEY (key_t)。

5、0x200typedef union _senumint val;struct semid_ds *buf;ushort *array;semun;int semid;static int count=0;FILE *fp,*fp1,*fp2;struct sembuf prmutex=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。

6、_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,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 shmi。

7、d;int *pint,*pint2,addr,addr2;for(i=0;i30;i+)ai=i;if(shmid=shmget(IPC_PRIVATE,4,PERM)=-1) fprintf(stderr,Create Share Memory Error:%sna,strerror(errno);exit(1);addr=shmat(shmid,0,0) ; pint=(int*)addr; *pint=0;semid=initsem();if(fork()=0) /writersemop(semid,&pwmutex,1);printf(call writern);fp1=fopen(。

8、a.txt,w);for(k=0;k20;k+) fprintf(fp1,%dn ,5*k);printf(write %dn ,5*k);fclose(fp1);printf(write finish!n);semop(semid,&vwmutex,1);exit(0); else if(fork()=0) /reader 1semop(semid,&prmutex,1);addr2=shmat(shmid,0,0); pint2=(int*)addr2; if(*pint2=0) semop(semid,&pwmutex,1);*pint2=*pint2+1;printf(reader 1。

9、 enter- count=%dn,*pint2);semop(semid,&vrmutex,1); fp=fopen(a.txt,r);while(!feof(fp) fscanf(fp,%d ,&i);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,&vrm。

10、utex,1);exit(0);else if(fork()=0) /readersemop(semid,&prmutex,1);addr2=shmat(shmid,0,0); 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=count-1;*pint2=*pint2-1;printf(Read 2 exit+ count=%dn,*pint2);/printf(Read 2 count=%dn,count);if(*pint2=0) semop(semid,&vwmutex,1);semop(semid,&vrmutex,1);exit(0);四、实验结果:8欢迎下载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值