进程同步:试验报告_第1页
进程同步:试验报告_第2页
进程同步:试验报告_第3页
进程同步:试验报告_第4页
进程同步:试验报告_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

1、.实验内容(进程的同步)(1)阅读理解示例程序。(2)说明示例程序是否能适合解决N个生产者和1个消费者问题,并设计实验验证(3)参照教材修改为N个生产者和1个消费者问题(4)思考N个生产者和M个消费者问题的解决方案(不要求)(5)利用信号量解决同步问题。.实验目的通过程序模拟及验证生产者消费者问题等经典问题,深入理解并发中的同步和互斥的概念.实验原理(1)进程概念:(1.定义:程序的一次执行过程(2.三种基本状态:就绪状态,执行状态,阻塞状态(2)进程同步:(1.定义:并发进程在执行次序上的协调,以达到有效的资源共享和相互合作,使程序 执行有可再现性。(2.两种形式的制约关系:(一:资源共享关

2、系:进程间接制约,需互斥地访问临界资 源。)、(二:相互合作关系:进程直接制约)(3.临界资源:一次仅允许一个进程访问的资源,引起不可再现性是因为临界资源没有 互斥访问。(3)信号量:定义一个用于表示资源数目的整型量S,它与一般的整型量不同,除初始化外,仅能通过两个标准的原子操作wal(S)和signal(S)来访问,俗称P,V操作。通俗来讲就是用P来访问资源后减去一个单位资源,用 V操作来释放一个单位资源就是现有资源上加一 个单位资源。.实验内容一:说明示例程序是否能适合解决N个生产者和1个消费者问题,并设计实验验证答:示例程序不能解决多个生产者和消费者的问题,它是解决单个消费者和生产者的。

3、如果可以就要修改代码,如“二”所说。二:多个消费者和生产者的问题生产者1生产者6生产者2生产者3生产者4生产者5消费者如上图所示:如果要解决多个生产者和消费者的问题:第一步:分析上图得出了两种关系,分别是异步和同步的关系第二步:异步关系的是生产者和生产者之间的, 因为同一时刻只能有一个生产者 访问缓冲区,所以我们就可以设置临界资源.获得临界资源的生产者才能把产品 放到缓冲区里第三步:同步关系有两个,首先是生产者和缓冲区之间,再是缓冲区和消费者之 问。他们都满足一前一后的关系,即当缓冲区空间未满时,生产者才可以放产品; 缓冲区不为空的时候才可以让消费者取出产品消费。第四步:设计变量,用C语言编程

4、,在linux上运行,观察结果。代码如下:#include #include * /小 z4相关头文件#include #include #include #include int n=10;int buffer10;/缓冲区空间大小int in=0,out=0;sem_t mutex,empty,full;/设置临界资源,定义两个同步关系的信号量void* producer(void *arg) /生产者sem_wait(&mutex);访问临界资源int tag= pthread_self()%100;int nextPro;srand(time(NULL)+tag);while(1)ne

5、xtPro = rand()%97;sem_wait(&empty);/生产一个产品,并放入缓冲区,缓冲区空间大小-1bufferin = nextPro;in = (in+1)%n;sem_post(&full);生产一个产品,并放入缓冲区,产品数量 +1 printf(production:%dn,nextPro);sem_post(&mutex);/释放临界资源,给其它线程用 usleep(1000*1000/2);void* consumer(void *arg)/消费者int item;while(1)sem_wait(&full);/消费一个产品,缓冲区产品数量-1item = b

6、ufferout;sem_post(&empty);/消费一个产品,缓冲区大小 +1 printf(consume:%dn,item);out = (out+1)%n;usleep(1000*1000/2);int main(int argc, char const *argv口)/定义7个线程/对临界资源和信号量赋初值/pthread_t tid6;sem_init( &mutex, 0,1);sem_init( &empty, 0,10);sem_init( &full, 0,0);for(int i=0;i6;i+)pthread_create(&tidi, NULL, producer

7、, NULL); 执行生产者线程pthread_create(&tid6, NULL, consumer, NULL);执行消费者线程for(int i = 0; i 6 ; i+)pthread_join(tidi, NULL);return 0;三:开启3个线程,这3个线程分别输出 A、B、C各10遍,要求输出Z果必须按 ABC的 顺序显示;如:ABCAB第一步:分析源程序输出结果依次是十个 A,十个B,十个C,而我们要求的是输出 A、B、C, A按顺 序输出,因此可以看出有同步关系,即一前一后的行为, 存在多种同步机制,就可以引入前趋图的原理来解决,使源程序输出变成要求所示前驱的概念:1

8、.要为每一对前驱关系各设置一个同步变量;2.在“前操作”之后对相应第三步:根据上图以及分析,写出修改代码,使代码输出如要求所示的同步变量执行 V操作;3在“后操作”之前对应的同步变量执行P操作#include #include #include #include #include #include sem_t a,b,c; /股置整型信号量void* p1(void *arg)/ 线程输出 Afor(int i=0;i10;i+) sem_wait(&c);/p - printf(An);sem_post(&a);/v+ /usleep(1);void* p2(void *arg)/ 线程输出

9、 B for(int i=0;i10;i+)sem_wait(&a);printf(Bn);sem_post(&b);/usleep(1);void* p3(void *arg)/ 线程输出 C for(int i=0;i10;i+)sem_wait(&b);/pprintf(Cn);sem_post(&c);/v/usleep(1);int main()sem_init( &a, 0,0);/设置信号量初值sem_init( &b, 0,0);sem_init( &c, 0,1);/ 对信号量 a赋初值pthread_t tid3;pthread_create(&tid0, NULL, p1

10、, NULL);pthread_create(&tid1, NULL, p2, NULL);pthread_create(&tid2, NULL, p3, NULL);for(int i = 0; i 3; i+)pthread_join(tidi, NULL);printf(main is overn);.调试分析.生产者和消费者:最开始没理解到什么是同步, 和互斥关系,用信号量怎么表示, 当把这些概念依次搞懂,然后在看代码就豁然开朗了。.依次军出A、B、C:在做这道题的时候,没理解到前驱关系,以至程序输出结果 不对,或者就是没有输出。最后仔细思考,发现输出A、B、C是一个循环,因该给信号量

11、a赋初值1,才可以解决。为了使输出程序的结果更稳定,可以在三个线程中加入 睡眠sleep();增加响应时间。.测试测试数据预期结果实际结果pthread_t tid6; /依次创建 7个线程,其中tid05为 生产者吗,tid6为消费者, 缓冲区一共有11个单位大 小当生产者获得临界资源时, 就放入缓冲区,消费者随机 取出一个产品消费,当缓冲 区满了就只有等消费者消 费,或者缓冲区空了就生产 者生产3-r-t -i 卜Mr Latei 11 卜修如 卜 卜*U.金 LlfWH-: uidd 1 VW卜9 pndfc 卜* 匕1i14IjridH. |k|I IwH g,iwJ3, :H II Ik4 屏 y fi 值尊 鹏sem_t a,b,c;/设置信号量,实现前驱同步关系pthread_t tid3;/ 创建线程,使输出A、B、C的代码独 立运行sleep (); 加入三个线程, 使线程有一定的反映时间当代表A、B、C的线程运行 时,只有获得属于自己的信 号量时才能运行,并输出

温馨提示

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

评论

0/150

提交评论