进程同步实验报告

  • 格式: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.实验心得

本次实验学习了进程的同步问题,进程是计算机操作系统重要的一个功能,学好进程才能学好其他。