计算机操作系统进程同步实验报告,操作系统进程同步实验报告

41528d3028836879cd698677c3999917.gif操作系统进程同步实验报告

实验三:进程同步实验 一、实验任务: (1)掌握操作系统的进程同步原理; (2)熟悉 linux 的进程同步原语; (3)设计程序,实现经典进程同步问题。 二、实验原理: (1)P、V 操作PV 操作由 P 操作原语和 V 操作原语组成(原语是不可中断的过程) ,对信号量进行 操作,具体定义如下:P(S):①将信号量 S 的值减 1,即 S=S-1;②如果 S³0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。V(S):①将信号量 S 的值加 1,即 S=S+1;②如果 S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。 (2)信号量 信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一 个进程。信号量的值与相应资源的使用情况有关。当它的值大于 0时,表示当前可用资源 的数量;当它的值小于 0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的 值仅能由 PV 操作来改变。 一般来说,信号量 S³0 时,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相同;参数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,int semnum,int ,union semun arg) 该系统调用实现对信号灯的各种控制操作,参数 semid 指定信号灯集,参数 指定具体的操作类型;参数 semnum 指定对哪个信号灯操作,只对几个特殊的 操作有意义; arg 用于设置或返回信号灯信息。 三、实验源程序: #include #include #include #include #include #include #include #include #include #include #include #include #include #define PERM S_IRUSR|S_IWUSR #define SEMKEY (key_t)0 x200 typedef union _senum{int 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_EXCL))==-1){if(errno==EEXIST)semid=semget(SEMKEY,3,0);}if(semctl(semid,0,SETVAL,x)==-1){perror(“semctl failed\n“);return(-1);}if(semctl(semid,1,SETVAL,x)==-1){perror(“semctl failed\n“);return(-1);}if(semctl(semid,2,SETVAL,x)==-1){perror(“semctl failed\n“);return(-1);}return(semid); }main() {int i,j,k;static int a[30];int shmid;int *pint,*pint2,addr,addr2; for(i=0;i<30;i++){a[i]=i;} if((shmid=shmget(IPC_PRIVATE,4,PERM))==-1) { fprintf(stderr,“Create Share Memory Error:%s\n\a“,strerror(errno)); exit(1); }addr=shmat(shmid,0,0) ; pint=(int*)addr; *pint=0;semid=initsem();if(fork()==0){ //writersemop(semid,printf(“call writer\n“);fp1=(“a.txt“,“w“);for(k=0;k<20;k++) {fprintf(fp1,“%d\n “,5*k);printf(“write %d\n “,5*k);}fclose(fp1);printf(“write finish!!!!\n“);semop(semid,exit(0); }else{ if(fork()==0){

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值