南昌大学操作系统实验报告二编程模拟进程间的同步和互斥_第1页
南昌大学操作系统实验报告二编程模拟进程间的同步和互斥_第2页
南昌大学操作系统实验报告二编程模拟进程间的同步和互斥_第3页
南昌大学操作系统实验报告二编程模拟进程间的同步和互斥_第4页
南昌大学操作系统实验报告二编程模拟进程间的同步和互斥_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

南昌大学实验报告-(2)编程仿真过程之间的同步和互斥学生名称:张皓然学校编号:专业班:本硕151实验类型:验证综合设计创新实验日期:2017.5.5实验结果:一、实验目的通过实验,我们可以加强对进程同步和互斥的理解,掌握创建和调用进程(线程)的方法。学会使用信号量来解决资源共享问题。学生可以选择在视窗或Linux系统下写作。二、实验内容(1)下面是一个Linux系统下的参考程序。请编译、运行并观察程序的输出,分析实验结果并写实验报告。#include/标准输入和输出头文件# include/标准库stdlib.h# include/由POSIX标准定义的unix类系统定义的符号常量的头文件包含许多UNIX系统服务的函数原型,如读函数、写函数和getpid函数。#include/time.h是c stdlib.h,主要是一些与时间相关的函数#include/基本系统数据类型#包含/等待声明# include/信号量操作标志# define num _ proc S5/5子流程#定义标识号250/信号量#define FILE_NAME /tmp/sem_aaa #定义DELAYvoid update_file(int sem_set_id,char *file_path,int number)结构sem _ op文件;/创建文件指针/等待信号量值变为非负,并在这里将其设置为负,这相当于对信号量执行P操作SEM _ op . SEM _ num=0;SEM _ op . SEM _ op=-1;SEM _ op . SEM _ flg=0;sem_set_id,sem_op,1);/*操作一组信号。进程的标识符号是sem_set_id,sem_op是结构指针。如果该值为正,则将该值添加到现有的信号包含值中,该值通常用于释放受控资源的使用权;如果sem_op的值为负,并且其绝对值大于信号的当前值,则操作将被阻止,直到信号值大于或等于sem_op的绝对值,SEM _ op通常用于获得资源使用权。如果sem_op的值为0,操作将被暂时阻止,直到信号的值变为0。*/写一个文件。写入的值是当前进程的进程号。file=fopen(file_path,“w”);/写入文件,如果成功,返回文件的起始地址;否则设置为0If(文件)/关键区域fprintf(文件, %dn ,编号);/将进程号写入*文件printf(“% d n”,数字);在标准输出中输入当前流程编号。fclose(文件);/关闭文件/发送一个信号,并将信号量的值加1。这相当于信号量上的V操作。SEM _ op . SEM _ num=0;SEM _ op . SEM _ op=1;SEM _ op . SEM _ flg=0;sem_set_id,sem_op,1);/子进程写入文件void do _ child _ loop(int SEM _ set _ id,char *file_name)PID _ t PID=getpid();int i,j;/获取当前进程的标识,并返回当前进程的标识符对于(I=0;i3;i )更新文件(sem_set_id、文件名、PID);对于(j=0;j;j);int main(int argc,char *argv)int sem _ set _ id/信号量集的标识联合sem _ valsemctl()中使用的信号量的值int child _ pidint I;int rc/设置标识为250的信号量集,并且只有一个信号量sem_set_id=semget(SEM_ID,1,IPC _ CREAT | 0600);如果(sem_set_id=-1)/如果调用失败,输出错误类型并强制程序退出。perror(main : SEM get);出口(1);/将第一个信号量的值设置为1SEM _ val . val=1;rc=semctl(sem_set_id,0,SETVAL,SEM _ VAL);if(rc=-1)/测试是否成功调用了semclt()函数。perror( main : smctl );出口(1);/设置一些子进程,以便它们能够以竞争的方式同时访问信号量。对于(I=0;i#包括#包括/系统读写安全相关功能#包括#包括#包括/头文件包含通过错误代码报告错误信息的宏#包括#包括#定义MAXSEM 5/声明三个信号量标识int fullidint emptyidint mutxidint main()/*在sembuf结构中,sem_num是相对应的信号量集中的某一个资源,所以其值是一个从0到相应的信号量集的资源总数(ipc_perm.sem_nsems)之间的整数sem_op。指明所要执行的操作,sem_flg说明函数semop的行为sem_op。的值是一个整数。释放相应的资源数,将sem_op的值加到信号量的值上。*/p,V结构;工会semun arg/声明共享主存int *数组;int * sumint * setint * get/映射共享主存/*mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存而系统会自动回写脏页面到对应的文件磁盘上即完成了对文件的操作而不必再调用读,写等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间从而可以实现不同进程间的文件共享。*/数组=(int *)mmap(NULL,sizeof(int )* MAXSEM,PROT_READ|PROT_WRITE,映射_ SHARED |映射_ANONYMOUS,-1,0);sum=(int *)mmap(NULL,sizeof(int),PROT_READ|PROT_WRITE,映射_ SHARED |映射_ANONYMOUS,-1,0);get=(int *)mmap(NULL,sizeof(int),PROT_READ|PROT_WRITE,映射_共享|映射_匿名,-1,0);set=(int *)mmap(NULL,sizeof(int),PROT_READ|PROT_WRITE,映射_ SHARED |映射_ANONYMOUS,-1,0);*总和=0。* get=0;* set=0;/创建信号量、生成信号灯fullid=semget(IPC_PRIVATE,1,IPC _ CREAT | 00666);emptyid=semget(IPC_PRIVATE,1,IPC _ CREAT | 00666);mutxid=semget(IPC_PRIVATE,1,IPC _ CREAT | 00666);/为信号灯赋值参数值=0。if(semctl(fullid,0,SETVAL,arg)=-1)perror( SEM CTL setVAL错误);参数值=MAXSEMif(semctl(emptyid,0,SETVAL,arg)=-1)perror( SEM CTL SETVAL错误);啊。val=1;if(semctl(mutxid,0,SETVAL,arg)=-1)perror( setctl setVAL错误);/初始化p,V操作v .扫描电镜_数=0;v .扫描电镜观察值=1;V.sem _ flg=SEM _ UNDOp .扫描电镜_数=0;p .扫描电镜观察值=-1;扫描电镜图=扫描电镜撤销;/生产者进程if(fork()=0 ) 整数1=0;而(i 100)/semop(信号量,资源,数目)semop(emptyid,P,1);/互斥实现临界资源的互斥使用semop(mutxid,P,1);阵列*(集)% MAXsem=i1;printf(生成器%dn ,数组(*集)% MAXSEM);/生产产品的标号1(*套);semop(mutxid,V,1);semop(fullid,V,1);我;睡眠(10);printf(生产者结束”;退出(0);其他/消费时代进程if(fork()=0) 而(1)semop(fullid,P,1);semop(mutxid,P,1);/判断是否所有产品都被消费了如果(*get=100)休息;*总和=阵列(* get)% MAXSEM;printf( ComSumera获取号%dn ,数组(* Get)% MAXSEM);(*get)./判断这次消费是否为最后一次消费如果(*get=100)printf(总和为“%d n”,*总和);semop(mutxid,V,1);semop(emptyid,

温馨提示

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

评论

0/150

提交评论