linux编写c语言程序 存钱取钱 利用信号量,Linux操作系统利用信号量实现银行叫号排队系统.docx...

Linux操作系统利用信号量实现银行叫号排队系统

Linux操作系统课程设计题目:进程通信与进程同步机制实践(银行叫号排队模拟系统)所在学院:所在班级:学生姓名:学生学号:指导教师:一、题目某银行提供5个服务窗口(3个对私服务窗口,1个对公服务窗口,1个理财服务窗口)和10个供顾客等待的座位。顾客到达银行时,若有空座位,则到取号机上领取一个号,等待叫号;若没有空座位,则在门外等待或离开。取号机每次仅允许一位顾客使用,有对公、对私和理财三类号,每位顾客只能选取其中一个。当营业员空闲时,通过叫号选取一位顾客,并为其服务。请用P、V操作写出进程的同步算法。二、目的 1、 掌握基本的同步与互斥算法 。 2、学习使用 Linux 中基本的同步对象,掌握相关 API 的使用方法。 3、了解 Linux 中多任务的并发执行机制,实现进程的同步与互斥。三、实验环境Linux CentOS、Ubuntu、Fedora等Linux系统编译器GCC编程语言 C语言四、要求1、当有顾客取号的时候,不允许其他顾客取号。2、当服务窗口满的情况下,其他人必须等待。3、当没有顾客的情况下,服务窗口必须等待。4、打印:A、 初始状态B、 中间变化的状态信息C、以及最终状态信息。五、原理及算法本程序中设计6个信号量,其中signal_A、signal_B和signal_C分别是对私、对公、理财窗口的同步信号量。若信号量值的等于0,说明当前没有空闲空口,顾客需要等待。另设置一个signal_seat同步信号量,记录当前的座位情况,若该信号量等于0,说明当前没有空座位,顾客需要等待。另有一个signal_customer同步信号量用于记录当前已经取过票的总人数,用于生成票号信息。还有一个mutex互斥信号量,用于实现各进程在对信号量进行操作时的互斥。顾客进入银行之后,先看通过一个依据系统时间的随机数来确定自己是需要对私、对公还是理财服务(在本程序中分别对应于A类顾客,B类顾客和C类顾客),这三个类型的顾客的比例为3:1:1.然后顾客根据自己需要的服务类型,查看提供相应类型服务的窗口是否空闲,若窗口有空闲,则系统直接按照signal_customer记录的信息,生成票面信息;若窗口没有空闲,则再去查看signal_seat信号量看看是否有空座位,若有空座位,则根据signal_customer记录的信息,生成票面信息;若没有空座位,则通过一个以系统时间为种子的随机数生成器生成一个随机数,帮助顾客确定是要继续等待还是离开,这两种情况的比例为1:1.若顾客选择离开,则相应的进程退出。当顾客取到票后,便开始查看对应类型的窗口是否有空闲,如果有空闲,则上前办理业务。顾客办理业务需要的时长通过以系统时间为种子的随机数生成器来确定,时长均在10秒到60秒之间。在程序执行的过程中,顾客的状态每有变换,都会有相应的输出提示信息,并在输出的行尾输出发生该动作时当前的系统时间,以便于我们分析各个顾客进程的执行情况。本实验在Linux环境下完成,该程序是通过进程实现的。包含一个service可执行文件,一个customer可执行文件和一个deletesem可执行文件。其中service可执行文件用于在内存中申请一个共享内存空间,并将这个内存空间与自身进程绑定;customer可执行文件每执行一次,就增加一个进程,即代表有一位顾客来到。通过多次执行customer可执行文件来模拟多位顾客;deletesem可执行文件用于在service进程和customer进城都执行完毕后,删除内存空间中的信号集。实验中利用GCC编译器,通过编写Makefile文件来快速编译源代码生成以上三个可执行文件。六、程序中各主要函数说明1、intcreateshm( char * pathname, intproj_id, size_t size)创建共享内存的函数,操作成功则返回共享内存标识符,失败返回-1.2、intcreatesem (const char * pathname, intproj_id, int members, intinit_val[])在共享内训中创建信号量的函数,操作成功则返回信号集标识符,失败返回-1.3、intopensem(const char * pathname, intproj_id)打开信号集函数,操作成功则返回信号集标识符,失败返回-1.4、intsem_p(intsemid, int index)P操作函数,操作成功则返回0,失败返回-1.5、int sem_v(intsemid, int index)V操作函数,操作成功则返回0,失败返回-1.6、int wait_sem(intsemid, int index)等待信号量为1函数,操作成功返回1.7、int delete_sem (intsemid)删除信号集函

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值