Linux:睡眠理发师问题(用C语言实现)

Linux:睡眠理发师问题(用C语言实现),第1张

/*基于信号量采用多线程技术实现进程同步*/

#include <pthread.h>

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <semaphore.h>

#include <sys/time.h>

#include <math.h>

#define CHAIRS 5 //椅子数

sem_t customers //等待服务的顾客信号量

sem_t barbers  //等待顾客的理发师信号量

pthread_mutex_t mutex //互斥变量

int waiting = 0 //正在等待的顾客数

void *barber(void *arg)

void *customer(void *num)

void cut_hair(void)

double timediff(struct timeval i,struct timeval j)

void seed_random(void)

double flat(void)

double normal(void)

double bursty(void)

int main()

{

   int i

   seed_random()

   pthread_t barber_t,customer_t

   int error

   error=pthread_create(&barber_t,NULL,barber,NULL)//创建理发师线程

   if(error!=0) {

      printf("pthread_create is not created.../n")

      return -1

   }

   while(1) {

      usleep(30000)//等待时间如果小于理发师理发时间则会出现等待者过多,否则不会出现等待者过多的现象

      error=pthread_create(&customer_t,NULL,customer,NULL)//创建顾客线程

      if(error!=0) {

         printf("pthread_create is not created.../n")

         return -1

      }

   }

}

double timediff(struct timeval now,struct timeval earlier)

{

   if(now.tv_sec == earlier.tv_sec)

      return (now.tv_usec - earlier.tv_usec)/1000000.0

   else

      return (1000000*(now.tv_sec - earlier.tv_sec) + now.tv_usec - earlier.tv_usec)/1000000.0

}

void *barber(void *arg)

{

   while(1)

   {

      sem_wait(&customers)//顾客信号量-1

      pthread_mutex_lock(&mutex)

      waiting = waiting -1

      sem_post(&barbers)//

      pthread_mutex_unlock(&mutex)

      cut_hair()//理发

   }

}

void cut_hair(void)

{

   printf("  Barber:I am cutting the customer's hair.../n")

   usleep(100000)//理发时间

   printf("  Barber:done./n")

}

void *customer(void *num)

{

   pthread_mutex_lock(&mutex)

   if(waiting<CHAIRS)

   {

       waiting = waiting + 1

       sem_post(&customers)

       pthread_mutex_unlock(&mutex)

       sem_wait(&barbers) 

   }

   else

   {

      printf("  Waiter is too much.../n")

      pthread_mutex_unlock(&mutex)

   }

   //释放占用的资源

}

void seed_random(void)

{

   struct timeval randtime

   unsigned short xsub1[3]

   gettimeofday(&randtime,(struct timezone *)0)

   xsub1[0] = (ushort)randtime.tv_usec

   xsub1[1] = (ushort)(randtime.tv_usec >> 16)

   xsub1[2] = (ushort)(getpid())

   seed48(xsub1)

}

double flat()

{

   return drand48()/5

}

第二问 加个理发师忙碌数量 用来判断 即可

问题分析

题目中要求描述理发师和顾客的行为,因此需要两类进程Barber ()和Customer()分别描述理发师和顾客的行为。当理发师看报时顾客近来需要唤醒理发师为其理发,当有顾客时理发师为其理发,没有的时候理发师看报,因此理发师和顾客之间是同步的关系,由于每次理发师只能为一个人理发,且可供等侯的椅子有限只有n个,即理发师和椅子是临界资源,所以顾客之间是互斥的关系。故引入3个信号量和一个控制变量:1)控制变量waiting用来记录等候理发的顾客数,初值均为0;2)信号量customers用来记录等候理发的顾客数,并用作阻塞理发师进程,初值为0;3)信号量barbers用来记录正在等候顾客的理发师数,并用作阻塞顾客进程,初值为0;4)信号量 mutex用于互斥,初值为1

问题实现

1.PV *** 作代码如下:

int waiting=0 ; //等候理发的顾客数

int chairs=n; //为顾客准备的椅子数

semaphore customers=0, barbers=0,mutex=1

barber()

{

while(TRUE) //理完一人,还有顾客吗?

P(cutomers) //若无顾客,理发师睡眠

P(mutex)//进程互斥

waiting := waiting – 1 //等候顾客数少一个

V(barbers) //理发师去为一个顾客理发

V(mutex)//开放临界区

cut-hair( ) //正在理发}

customer()

{

P(mutex)//进程互斥

if (waiting)

{ waiting := waiting+1 // 等候顾客数加1

V(customers) //必要的话唤醒理发师

V(mutex) //开放临界区

P(barbers) //无理发师, 顾客坐着养神

get-haircut( ) //一个顾客坐下等理/ }

else

V(mutex)//人满了,走吧!}

嵌入式软件开发内容简介《嵌入式软件开发》系统地介绍了嵌入式系统的软件开发方法。全书分为8章,首先讲述了嵌入式系统的概况和应用领域,各种典型的嵌入式处理器,嵌入式 *** 作系统的种类及选用等;然后以嵌入式Linux和市场占有率排名第一的VxWorks *** 作系统为例,详细讲解嵌入式 *** 作系统的组成、多任务环境的工作原理及其交叉开发环境的使用,以及嵌入式实时系统软件设计的几个核心问题和嵌入式系统的一般设计开发流程;最后给出了开发嵌入式系统的相关实训。

《嵌入式软件开发》可作为高职、专科院校计算机类、电子类、信息类专业高年级学生的教材,也可作为一些进修班的培训教材,同时亦可作为企业各类嵌入式产品开发人员、嵌入式技术爱好者的学习参考资料。 第1章嵌入式系统概述

1.1嵌入式系统的定义

1.2嵌入式系统的分类

1.3嵌入式系统的特点

1.4嵌入式系统的组成

1.5嵌入式系统的应用领域

1.6嵌入式系统的发展

1.6.1嵌入式系统的发展史

1.6.2嵌入式应用软件面临的挑战

1.7本章小结

习题

第2章嵌入式硬件系统基础

2.1嵌入式处理器的基本特征

2.2嵌入式处理器的分类

2.2.1嵌入式微处理器

2.2.2嵌入式微控制器

2.2.3嵌入式DSP处理器

2.2.4嵌入式片上系统

2.3典型嵌入式处理器

2.3.18051系列单片机

2.3.268K/ColdFire系列

2.3.3PowerPC系列

2.3.4ARM系列

2.3.5X86系列

2.3.6MIPS

2.4嵌入式处理器的选择

2.5嵌入式处理器的发展趋势

2.6本章小结

习题

第3章嵌入式 *** 作系统

3.1嵌入式 *** 作系统的发展

3.1.1嵌入式 *** 作系统的历史

3.1.2嵌入式 *** 作系统的发展趋势

3.2嵌入式 *** 作系统的分类

3.3嵌入式实时系统

3.3.1嵌入式实时系统介绍

3.3.2实时系统的分类

3.4嵌入式实时 *** 作系统

3.4.1VxWorks

3.4.2pSOS

3.4.3QNX

3.4.4DeltaOS

3.5嵌入式软实时 *** 作系统

3.5.1嵌入式Linux

3.5.2WindowsCE

3.5.3PalmOS

3.6嵌入式 *** 作系统的选择

3.7本章小结

习题

第4章基于Linux的嵌入式软件开发

4.1嵌入式Linux概述

4.2Linux基础

4.2.1VMware虚拟机中的Linux安装

4.2.2进入与退出Linux系统

4.2.3Linux常用命令

4.3嵌入式LinuxC语言开发工具

4.3.1C语言与嵌入式系统设计

4.3.2嵌入式LinuxC语言编程环境

4.3.3vi编辑器

4.3.4GCC编译器

4.3.5GNUmake

4.3.6GDB调试器

4.4μCLinux *** 作系统

4.4.1μCLinux简介

4.4.2μCLinux的基本架构

4.4.3μCLinux的相关知识

4.5建立μCLinux开发环境

4.5.1交叉编译环境

4.5.2基于Linux的宿主机建立交叉编译环境

4.5.3基于Cygwin建立交叉编译环境

4.5.4μCLinux内核编译

4.5.5内核的加载运行

4.6基于μCLinux的应用程序开发

4.6.1基本开发步骤

4.6.2应用程序开发实例

4.6.3添加用户应用程序到μCLinux

4.7本章小结

习题

第5章基于VxWorks的嵌入式软件开发

5.1Tornado简介

5.1.1Tornado的特点

5.1.2TornadoIDE

5.1.3VxWorks目标机环境

5.1.4宿主机与目标机的接口

5.2Tornado的安装和启动

5.2.1Tornado的安装

5.2.2Tornado的目录结构

5.2.3Tornado主窗口界面介绍

5.2.4入门实例--HelloWorld

5.2.5使用调试和分析工具

5.3Tornado环境下的工程开发

5.3.1创建可下载的应用

5.3.2创建用户定制的VxWorks映像

5.3.3创建可引导的应用

5.3.4宿主机与目标机的通信

5.3.5配置、构造引导程序及引导盘的制作

5.3.6主机Tornado调试环境配置

5.3.7多任务调试方法

5.4VxWorks *** 作系统

5.4.1VxWorks简介

5.4.2Vxworks *** 作系统的基本结构

5.4.3VxWorks任务

5.4.4共享代码和重入

5.4.5任务间通信

5.4.6中断服务程序

5.4.7时钟管理

5.5实例分析

5.5.1VxWorks任务间通信

5.5.2理发师问题

5.5.3哲学家进餐问题

5.6本章小结

习题

第6章嵌入式软件设计的几个问题

6.1实时多任务软件设计

6.1.1实时多任务软件的设计步骤

6.1.2任务划分

6.1.3实时多任务设计实例

6.2板级支持包BSP

6.2.1BSP简述

6.2.2BSP的职责

6.2.3BSP的组成

6.2.4VxWorks映像类型及其启动顺序

6.2.5BSP的开发

6.3外部设备的驱动

6.3.1外部设备

6.3.2外部设备的分类

6.3.3I/O设备的数据传送方式

6.3.4硬件驱动程序

6.3.5硬件驱动程序的主要功能

6.3.6硬件驱动程序的组成部分

6.4本章小结

习题

第7章嵌入式系统设计开发

7.1嵌入式系统设计开发概述

7.1.1嵌入式系统开发的特点

7.1.2嵌入式系统设计的目标

7.1.3嵌入式系统的设计开发方法

7.2嵌入式硬件系统选型及设计

7.2.1处理器的选择

7.2.2嵌入式系统硬件电路设计

7.2.3印刷电路板设计

7.3嵌入式软件系统选择

7.3.1软件平台的选择

7.3.2编程语言的选择

7.3.3集成开发环境的选择

7.4软、硬件协同开发

7.5嵌入式系统的调试

7.6嵌入式系统测试

7.7系统集成

7.8本章小结

习题

第8章实训

实训1Linux安装

实训2Linux常用命令

实训3嵌入式Linux下开发工具使用

实训4μCLinux交叉开发环境

实训5添加μCLinux应用程序

实训6Tornado集成开发环境

实训7使用Tornado中的调试和分析工具

实训8基于VMware建立VxWorks交叉开发环境

实训9VxWorks组件的裁减和配置

实训10信号量

实训11消息队列

实训12Wind内核功能

实训13多任务程序调试方法

实训14理发师问题

参考文献

……


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7966668.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-12
下一篇 2023-04-12

发表评论

登录后才能评论

评论列表(0条)

保存