实验目的
- 理解进程同步与进程互斥的概念。
- 学会使用peterson算法、PV信号量方法解决进程同步与互斥问题。
实验内容
第一步:我们假设一种最简单producer-consumer的情况:
当前系统中有两个进程在并发执行,它们分别是producer与consumer。其中,producer与consumer共享变量counter,它们分别对counter进行了修改。附件simple_producer_consumer_peterson.c给出了这样的一种情形。
- A. 运行该程序会出现什么后果?
- B. 请使用peterson算法解决该问题。
- C. 你的系统是如何调度peterson算法的?这个结果是否符合预期?
第二步:其实,我们可以使用更简单的系统调用来完成上述互斥问题。
只要定义一个互斥量mutex,然后使用系统的线程锁就可以完成上述事情。
可以参考下面的做法:
- pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
- pthread_mutex_lock(&mutex);
- pthread_mutex_unlock(&mutex);
现在你可以试着将上面的peterson算法换成线程锁。
第三步:现在,我们来尝试更复杂的producer-consumer的情况
当前系统中有P_NUM+C_NUM个进程在并发执行,它们分别是P_NUM个producer与C_NUM个consumer。其中,producer与consumer共享一个buffer,buffer的深度是BUF_SIZE。我们要求:一次只能有一个进程访问buffer,buffer满时不可以写,buffer空时不可以读。
现在,你可以思考下用信号量如何解决上述问题,然后参考我们的附件代码“complicated_producer_consumer.c”,观察参考代码是如何利用信号量解决问题。本部分需要你观察、运行所给的代码,掌握如何使用信号量解决进程同步问题。这个代码尽管能够实现所述功能,但也有点问题,欢迎同学们指出并完善它。
第四步:请将你的学号最后1位数字数模5,得到的结果对应接下来你需要解决的问题的序号,要根据PPT要求的输入输出来完成。如果对应的问题在PPT中没有要求,则需要自定义输入输出格式,保证整洁简单。可以在应做题目之外选择多做一题,有加分。
- 读者-写者问题,读者优先(PPT中有格式定义要求)
- 读者-写者问题,公平竞争(PPT中有格式定义要求)
- 读者-写者问题,写者优先(PPT中有格式定义要求)
- 哲学家进餐问题(需要用两种方法完成)
- 理发师问题
实验结果
第一步
-
原代码运行结果及分析
-
你的运行结果及分析
int counter;
int turn=0;
int flag[2];
void *producer(void *param){
flag[0] = 1;
turn = 1;
while(flag[1] && turn==1);
int i;
int a;
for (i=0;i<10;i++){
a=counter;
sleep_rand_time();//or sleep(1);
counter=a+1;
printf(