信号量实验项目: 桌子上有一个能盛得下5个水果的空盘子,爸爸不停地向盘子中放入苹果或者桔子,儿子不停地从盘子中取出桔子享用,女儿不停的从盘子中取出苹果享用。规定三人不能同时从盘子中取放水果。试用信号量实现爸爸、儿子和女儿三个进程间的同步。


1.写出相应算法及相关说明。

semaphore mutex = 1,
semaphore empty = 5,//盘子最多可放5个水果
Semaphore apple = 0, orange = 0;//定义苹果、橘子信号量
void father()//父亲进程
{while (1){buy fruits;wait(empty);wait(mutex);put in a fruit;signal(mutex);if (fruit == apple)signal(apple);elsesignal(orange);}
}
void son()//儿子进程
{wait(orange);wait(mutex);put out an orange;signal(mutex);
signal(empty);
eat an orange;
}
void daughter()//女儿进程
{wait(apple);wait(mutex);put out an apple;signal(mutex);
signal(empty);
eat an apple;}

2.必须用程序设计语言实现整个循环进程的模拟

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <windows.h>
#include <time.h>sem_t plate;//定义盘子信号量
sem_t apple;//定义苹果信号量
sem_t orange;//定义橘子信号量
sem_t mutex;//定义互斥信号量void father(void *arg)
{while(plate){sem_wait(&plate);//信号量-1,P操作sem_wait(&mutex);//信号量-1,P操作srand((unsigned) time(NULL));//引入rand函数,随机分配水果int a= rand()%1000000;if(a%2==0){sem_post(&apple);//信号量+1,V操作printf("%d:爸爸放入一个苹果\n",a);}else{sem_post(&orange);//信号量+1,V操作printf("%d:爸爸放入一个橘子\n",a);}sem_post(&mutex);//信号量+1,V操作Sleep(3000);}
}void son(void *arg)
{while(orange) // 盘中是否有橘子{sem_wait(&orange);//信号量-1,P操作sem_wait(&mutex);//信号量-1,P操作sem_post(&plate);//信号量+1,V操作printf("      儿子吃了一个橘子\n");sem_post(&mutex);//信号量+1,V操作Sleep(8000);}
}void daughter(void *arg)
{while(apple) // 盘中是否有苹果{sem_wait(&apple);//信号量-1,P操作sem_wait(&mutex);//信号量-1,P操作sem_post(&plate);//信号量+1,V操作printf("      女儿吃了一个苹果\n");sem_post(&mutex);//信号量+1,V操作Sleep(8000);}
}int main()
{sem_init(&mutex,0,1);//初始化互斥信号量为1sem_init(&apple,0,0);//初始化苹果信号量为0sem_init(&orange,0,0);//初始化橘子信号量为0sem_init(&plate,0,5);//初始化盘子信号量为5,即盘子最大容量pthread_t x1,x2,x3;//定义三个进程pthread_create(&x1,NULL,(void*)father,NULL);//建立父亲进程pthread_create(&x2,NULL,(void*)son,NULL);//建立儿子进程pthread_create(&x3,NULL,(void*)daughter,NULL);//建立女儿进程pthread_join(x1,NULL);//等待父亲进程完成pthread_join(x2,NULL);//等待儿子进程完成pthread_join(x3,NULL);//等待女儿进程完成sem_destroy(&mutex);//销毁信号量sem_destroy(&apple);sem_destroy(&orange);sem_destroy(&plate);return 0;}

3.运行效果截图。

 4.心得体会。

通过不断的学习与修改,最后也是成功的把结果运行出来了,这个程序我设置了四个信号量来模拟分水果和吃水果的过程,但是好像还是无法解决老师所说出现女儿和儿子同时吃不到水果的情况,在实验过程中,我也是遇到了一个问题,就是我写了个只用一个信号量来模拟P、V操作,但是不知道为什么会出现父亲放了水果,然后只有一个人吃的情况,所以就改成了四个信号量的。刚开始的时候,还出现父亲只放一种水果的情况,后来发现是rand函数的值太小所导致的,在程序中我也是将rand函数所产生的值打印出来,只有是为了验证是否放入了正确的水果,将rand值修改后也是成功运行出想要的结果。

操作系统—信号量实验项目相关推荐

  1. ZUCC_操作系统原理实验_实验九 消息队列

    操作系统原理实验报告 课程名称 操作系统原理实验 实验项目名称 实验九 消息队列 实验目的 了解 Linux 系统的进程间通信机构 (IPC): 理解Linux 关于消息队列的概念: 掌握 Linux ...

  2. 操作系统进程同步实验报告

    华侨大学计算机科学与技术学院 操作系统实验报告 进程同步 课程名称:操作系统实验 实验项目名称:进程同步 学    院:计算机科学与技术学院 专业班级: 姓    名: 学    号: 目录 1.描述 ...

  3. 进程同步算法实现实验报告Linux,操作系统进程同步实验报告.doc

    操作系统进程同步实验报告 实验三:进程同步实验 一.实验任务: (1)掌握操作系统的进程同步原理: (2)熟悉linux的进程同步原语: (3)设计程序,实现经典进程同步问题. 二.实验原理: (1) ...

  4. Linux程序设计实验项目六,《linux程序设计》实验教学大纲

    <linux程序设计>实验教学大纲 课程名称:Linux程序设计 课程编号:408412420408436407 适用专业:计算机科学与技术网络工程软件工程 总 学 分:3 总 学 时:4 ...

  5. 操作系统期末实验:多用户二级文件系统

    多用户二级文件系统 写在最前面 问题描述 要 求: 1 功能设计 1.1 系统层次结构 1.2初始化 1.2 子功能设计 2 源程序 2.1 系统实现主要的软件技术 2.2 数据结构 2.3 后端 2 ...

  6. 计算器 android报告,bmi计算器android开放实验项目总结报告.pdf

    . 淮海工学院计算机工程学院 开放实验报告 实验项目: Android 应用开发 学生姓名: 学 号: 专业班级: 系( 院 ): 起止日期: 2016 年 10 月 10 日- 11 月 25 日 ...

  7. ZUCC_操作系统原理实验_Lab9进程的通信消息队列

    lab9进程的通信–消息队列 一.两个进程并发执行,通过消息队列,分别进行消息的发送和接收 1.代码: //接受消息 #include<stdio.h> #include<stdli ...

  8. 东北大学软件学院操作系统v实验报告

    课程编号:B080000070     <操作系统>实验报告             姓名   学号   班级   指导教师   实验名称 <操作系统>实验 开设学期 2016 ...

  9. 操作系统原理实验-进程同步

    操作系统原理实验报告 实验题目 实验二进程同步 实验二.进程同步 1.1 实验目的 现代操作系统的核心是多道程序设计.多处理器和分布式处理器,这些方案和操作系统设计技术的基础都是并发.当多个进程并发执 ...

最新文章

  1. 用jQuery实现文件的上传,后台为spring+mybatis
  2. Spring Cloud第十四篇: 服务注册(consul)
  3. FarBox--另类有趣的网站服务【转】
  4. maven netty 配置_SpringBoot整合Netty(附源码)
  5. CodeForces - 1512G Short Task(欧拉筛求因子和)
  6. 第20讲:代理的基本原理和用法
  7. php中的file_upload,PHP文件上传(PHP file upload)
  8. 兄弟3150cdn更换硒鼓_耗材知多点:一体式硒鼓及分离式硒鼓
  9. 《是碰巧还是执着?python所阅读的每一场知识点,唯一的共同点就是——参赛选手中,有python之socket编程!》
  10. ExtJS 4.2 教程-07:Ext.Direct
  11. 南开大学计算机学院课表,南开大学本科课程教学大纲.pdf
  12. IOS中延时执行的几种方式的比较
  13. php中execute函数,PHP:调用布尔值上的成员函数execute()
  14. 英特尔主板快捷启动键_电脑小匠电脑硬件知识科普——主板接口篇
  15. vue 时间方法(yyyy-mmmm-dddd hh:mm:ss)
  16. 目标跟踪常用算法——EKF篇
  17. 输入英文句子,导出英语单词个数和英文字母个数 Python
  18. 基于springOAuth2官方数据库表结构的简单权限控制
  19. 【UVA1723】Intervals
  20. Java8新特性-Optional类

热门文章

  1. 回复徐老师暨不成功教学的反思
  2. 从英文版VC到word复制粘贴的乱码问题
  3. HT66F018 -- HT1621 驱动程序
  4. 【Kafka生产者发消息流程】
  5. LINGO使用指南(转载)
  6. Unity新建项目报错
  7. iOS AOP 框架 - Aspects 源码解读
  8. CSS高度塌陷问题(float塌陷margin塌陷)
  9. java修改ppt格式_Java 加密、解密PPT文档
  10. python内建常用函数