您好,欢迎来到五一七教育网。
搜索
您的当前位置:首页进程同步:实验报告

进程同步:实验报告

来源:五一七教育网
进程同步:实验报告

1.实验内容(进程的同步)(1) 阅读理解⽰例程序。

(2) 说明⽰例程序是否能适合解决 N 个⽣产者和 1 个消费者问题,并设计实验验证(3) 参照教材修改为 N 个⽣产者和 1 个消费者问题(4) 思考 N 个⽣产者和 M 个消费者问题的解决⽅案(不要求)(5) 利⽤信号量解决同步问题。2.实验⽬的

通过程序模拟及验证⽣产者消费者问题等经典问题,深⼊理解并发中的同步和互斥的概念3.实验原理(1)进程概念:

(1.定义:程序的⼀次执⾏过程

( 2.三种基本状态 :就绪状态,执⾏状态,阻塞状态(2)进程同步:

(1.定义:并发进程在执⾏次序上的协调,以达到有效的资源共享和相互合作,使程序执⾏有可再现性。

( 2.两种形式的制约关系: (⼀:资源共享关系:进程间接制约,需互斥地访问临界资源。)、(⼆:相互合作关系:进程直接制约)

(3.临界资源:⼀次仅允许⼀个进程访问的资源,引起不可再现性是因为临界资源没有互斥访问。(3)信号量:定义⼀个⽤于表⽰资源数⽬的整型量S,它与⼀般的整型量不同,除初始化

外,仅能通过两个标准的原⼦操作 wait(S)和 signal(S)来访问,俗称 P,V操作。通俗来讲就是⽤P 来访问资源后减去⼀个单位资源,⽤ V 操作来释放⼀个单位资源就是现有资源上加⼀个单位资源。

4.实验内容⼀:说明⽰例程序是否能适合解决 N 个⽣产者和 1 个消费者问题,并设计实验验证答:⽰例程序不能解决多个⽣产者和消费者的问题,它是解决单个消费者和⽣产者的。如果可以就要修改代码,如“⼆”所说。⼆:多个消费者和⽣产者的问题

⽣产者 1 如上图所⽰ :如果要解决多个⽣产者和消费者的问题:第⼀步:分析上图得出了两种关系,分别是异步和同步的关系 第⼆步:异步关系的是⽣产者和⽣产者之间的, 因为同⼀时刻只能有⼀个⽣产者 访问缓冲区,所以我们就可以设置临界资源 .获得临界资源的⽣产者才能把产品 放到缓冲区⾥

第三步:同步关系有两个, ⾸先是⽣产者和缓冲区之间, 再是缓冲区和消费者之 间。他们都满⾜⼀前⼀后的关系, 即当缓冲区空间未满时, ⽣产者才可以放产品; 缓冲区不为空的时候才可以让消费者取出产品消费。第四步:设计变量,⽤ C 语⾔编程,在 linux 上运⾏,观察结果。代码如下:#include#include#include#include

#include #include int n=10;int buffer[10];// 缓冲区空间⼤⼩

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);⽣产者 6缓冲区 消费者⽣产者 2⽣产者 3

⽣产者 4 ⽣产者 5相关头⽂件while(1){

nextPro = rand()%97;

sem_wait(∅); // ⽣产⼀个产品,并放⼊缓冲区,缓冲区空间⼤⼩-1 buffer[in] = nextPro;in = (in+1)%n;

sem_post(&full);// ⽣产⼀个产品,并放⼊缓冲区,产品数量 +1printf(\"production:%d\\n\

sem_post(&mutex);// 释放临界资源,给其它线程⽤ usleep(1000*1000/2);}}

void* consumer(void *arg) // 消费者int item;while(1){

sem_wait(&full);// 消费⼀个产品,缓冲区产品数量 -1 item = buffer[out];sem_post(∅); // 消费⼀个产品,缓冲区⼤⼩ +1printf(\"consume:%d\\n\

out = (out+1)%n; usleep(1000*1000/2);}}

int main(int argc, char const *argv[]){

pthread_t tid[6]; sem_init( &mutex, 0,1); sem_init( ∅, 0,10);

sem_init( &full, 0,0);

for(int i=0;i<6;i++){ pthread_create(&tid[i], NULL, producer, NULL);} // 执⾏⽣产者线程 //定义 7 个线程//对临界资源和信号量赋初值//

pthread_create(&tid[6], NULL, consumer, NULL);for(int i = 0; i < 6 ; i++)pthread_join(tid[i], NULL);return 0;}

三:开启 3个线程,这 3个线程分别输出 A 、B 、C 各 10遍,要求输出结果必须按 ABC 的 顺序显⽰;如:ABCAB

第⼀步:分析

源程序输出结果依次是⼗个 A ,⼗个 B ,⼗个 C ,⽽我们要求的是输出 A 、B 、C ,A 按顺 序输出,因此可以看出有同步关系, 即⼀前⼀后的⾏为, 存在多种同步机制,就可以引⼊前 趋图的原理来解决,使源程序输出变成要求所⽰前驱的概念: 1.要为每⼀对前驱关系各设置⼀个同步变量; 2.在“前操作”之后对相应

的同步变量执⾏ V 操作; 3 在“后操作”之前对应的同步变量执⾏ P 操作第三步:根据上图以及分析,写出修改代码,使代码输出如要求所⽰#include#include#include#include#include//执⾏消费者线程#include

sem_t a,b,c; //设置整型信号量void* p1(void *arg){// 线程输出 A for(inti=0;i<10;i++){ sem_wait(&c);//p - printf(\"A\\n\"); sem_post(&a);//v+ //usleep(1);}}

void* p2(void *arg){// 线程输出 B

for(int

i=0;i<10;i++){ sem_wait(&a);printf(\"B\\n\"); sem_post(&b);//usleep(1);}}

void* p3(void *arg){// 线程输出 C for(int i=0;i<10;i++){ sem_wait(&b);//p printf(\"C\\n\"); sem_post(&c);//v //usleep(1);}}int main()

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 517ttc.cn 版权所有 赣ICP备2024042791号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务