进程同步实验报告
- 格式:docx
- 大小:35.64 KB
- 文档页数:5
中北大学软件学院
实验报告
专 业: 软件工程
方 向: 软件开发与测试
课程名称: 操作系统
班 级:
学 号:
姓 名:
辅导教师:
2017年9月制
成绩:
实验时间
2017年11月5日8时至10时 学时数2 2学时
1.实验名称
进程同步
2.实验内容
编程实现生产者-消费者问题的模拟。
3.基本要求
1. 生产者消费者对缓冲区进行互斥操作。
2. 缓冲区大小为10,缓冲区满则不允许生产者生产数据,缓冲区空则不允许消费者消费数据。
3. 生产者消费者各循环操作10次。
4. 实验原理或流程图
生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。
5.源程序
#include
#include
#include
#include
void *producter_f (void * arg);
void *consumer_f (void *arg);
sem_t empty; //信号量 empty
sem_t full; //信号量 full
int running = 1;
int apple_num = 0;
int main(void)
{
pthread_t consumer_t; //消费者
pthread_t producter_t; //生产者
//pshared表示信号量共享类型, 为 0时,表示只能在当前进程的
//多个线程之间共享,不为 0 时,是可以和其他进程间共享该信号量
//使用信号量,用来协作生产者和消费者的顺序,即实现同步效果
sem_init (&empty,0,1); //初始化empty信号量
sem_init (&full,0,0); //初始化full信号量
pthread_create(&consumer_t,NULL,consumer_f,(void*)&running);
//创建消费者线程
pthread_create(&producter_t,NULL,producter_f,(void
*)&running); //创建生产者线程
//sleep(1); //睡眠 3 秒
usleep(1000); //睡眠10微秒
running = 0;
pthread_join(consumer_t,NULL);
pthread_join(producter_t,NULL);
sem_destroy(&empty);
sem_destroy(&full);
return 0;
}
void *producter_f(void *arg)
{
while(*(int*)arg)
{
sem_wait(&empty);
apple_num++;
printf("producter 生产第 %d 个香蕉\n",apple_num);
sem_post(&full);
usleep(1);
}
}
void *consumer_f(void *arg)
{
while(*(int *)arg)
{
sem_wait(&full);
printf("consumer 消费第 %d 个香蕉\n",apple_num);
sem_post(&empty);
usleep(1);
}
}
6.运行截图
7.实验心得
本次实验学习了进程的同步问题,进程是计算机操作系统重要的一个功能,学好进程才能学好其他。