操作系统课设收银员与顾客.docx
- 文档编号:8192555
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:12
- 大小:99.39KB
操作系统课设收银员与顾客.docx
《操作系统课设收银员与顾客.docx》由会员分享,可在线阅读,更多相关《操作系统课设收银员与顾客.docx(12页珍藏版)》请在冰豆网上搜索。
操作系统课设收银员与顾客
目 录
1题目内容及要求
1.1题目名称
收银员与顾客(信号量操作)
1.2题目描述
编程模拟下面同步问题:
在某超市里有x(shouyin)个收银员,且同时最多允许有y(guke)个顾客购物,我们可以将顾客和收银员看成是两类不同的进程,且工作流程如下图所示。
为了利用PV操作正确地协调这两类进程之间的工作,设置了3个信号量xin_guke,x(shouyin)和y(guke)可由用户输入,信号量xin_guke初值等于shouyin。
1.3解题思路
(1)构筑收银员与顾客的队列
构造两个队列用来分别存放收银员与顾客的P,V信息
typedefstructLNode,typedefstructa
(2)判定顾客处于哪个操作
voidenque(linklist&l,charname)对顾客进行插入操作,从等待状态到付款(付款到付款完毕)
chardeque(linklist&l)对顾客进行删除操作,当顾客由等待到付款时,就从等待队列里将顾客删除,当顾客从付款到等待时,就从付款队列里将顾客删除
(3)对顾客进行P,V操作
P操作,对信号量xin_guke进行减1操作,判断结果是否大于等于0,如果大于等于0则进入付款队列,反之继续等待。
V操作,对信号量xin_guke进行加1操作,判断结果是否大于0,如果大于0,完成付款就结束,反之,从等待队列中摘下一个进程放入就绪队列中。
(4)控制流程:
用voidenque(linklist&l,charname),chardeque(linklist&l)这两个函数对顾客进行队列的插入和删除
创建收银员与顾客:
用voidsy()函数创建收银员相应的操作。
用voidgk()函数创建顾客相应的操作。
voidp()用来控制顾客的P操作。
Voidv()用来控制顾客的V操作。
收银员与顾客进程:
参见图3.4收银员—顾客的完整流程图。
N
图1.3.1P操作流程图
N
Y
图1.3.2V操作流程图
(4)构造收银员操作
当顾客付款后,收银员判断是否收到付款,判断成功后,付款成功,反之付款未成功。
N
图1.3.3收银员流程图
图1.3.4主函数流程图
1.4程序清单
#include
#include
usingnamespacestd;
intxin_guke;//初值为收银人数,代表当前可以进入付款状态的人数
intguke,shouyin;//顾客总人数,收银员总人数
typedefstructLNode//结点
{charname;
LNode*next;
}*Llist;
typedefstructa//链表
{LNode*front;
Llistlast;
}*linklist;
linklistdengdai,jiuxu;
voidinit(linklist&l)
{l=(linklist)malloc(sizeof(a));
l->front=l->last=NULL;
}
voidenque(linklist&l,charname)//将名为name的结点插入到L链表中
{
Llistp=(Llist)malloc(sizeof(LNode));
p->name=name;
p->next=l->front;
l->front=p;
//cout<
}
chardeque(linklist&l)//删除l链表中的结点
{
charname=NULL;
if(l->front!
=NULL)
{
name=l->front->name;
l->front=l->front->next;
}
//cout<<"del"< returnname; } voidshow(linklist&l)//输出链表L的信息 { while(l->front! =NULL) { cout< l->front=l->front->next; } } voidp()//在信号量上执行P操作: 当有多余收银员时,进入就绪队列, {当满时,进入等待队列 xin_guke--; if(xin_guke>=0) { if(dengdai->front! =NULL) { cout<<"顾客"< enque(jiuxu,deque(dengdai)); } }else{ cout<<"收银员忙,调度顾客到等待队列~~~"< } } voidv() { xin_guke++; if(xin_guke>0) { if(jiuxu->front! =NULL) { enque(dengdai,deque(jiuxu)); } } } voidsy() { for(intj=shouyin;j>0;j--) if(jiuxu->front! =NULL) { cout< ~~"< deque(jiuxu); guke--; } } voidgk() { intj=guke; for(inti=j;i>0;i--)p(); sy(); for(i=j;i>0;i--)v(); } intmain() { cout<<"请输入顾客数: "< cin>>guke; cout<<"请输入收银员数: "< cin>>shouyin; if(shouyin>0) { xin_guke=shouyin; /* guke=8; shouyin=xin_guke; */ init(dengdai);//初始化等待队列 init(jiuxu);//初始化就绪队列 for(inti=guke;i>0;i--) { enque(dengdai,(char)(i+96));//根据顾客数,将顾客插入等待队列 } while(dengdai->front! =NULL||jiuxu->front! =NULL) { gk(); } return0; } else { cout<<"对不起,不能没有收银员! "< return0; } } 1.5提交结果框图 1.用户输入客户数,如图1.5.1 图1.5.1输入顾客数 2.用户输入收银员数,如图1.5.2 图1.5.2输入收银员数 3.运行结果,如图1.5.3 图1.5.3运行结果 4.当输入数据有误时,如图1.5.4 图1.5.4出错时图 如图所示,可以输入任意数量的顾客数和收银员数。 当顾客数大于收银员数时,后面的顾客将到等待队列中等待前面的顾客付完款。 当前面的顾客将款付完后,后面的顾客进入就绪队列付款,付款后进入等待队列,表示付款完毕。 2总结 通过这次操作系统的课程设计,我研究了收银员与顾客的问题,进一步深入了解了同步与互斥机制。 比如什么是同步,什么是互斥,什么是信号量等等。 课程设计和平时的实验课比较起来有很大的差距,实验课只是将这一章的一部分内容练习操作一遍,而课程设计需要的是他们综合起来的东西,这要更难一些。 总体来说我认为操作系统这门学科在计算机科学当是中非常重要的。 他将我们学过的编程语言联系起来,可以说是第一次利用C++语言利用windows的API与系统进行“沟通”。 总而言之,这次操作系统的课程设计收获颇丰,复习了许多东西,也从新学会了许多东西。 我想这也许就是课程设计的最终目的吧。 3参考文献 [1]刘振安、刘燕君著.《C++程序设计课程设计》.北京: 机械工业出版社,2004 [2][美]AbrahamSilberschatz,PeterBaerGalvin,GregGagne著.郑扣根译.操作系统概念(第六版).北京: 高等教育出版社,2004 [3]陈向群,向勇等.Windows操作系统原理(第二版).北京: 机械工业出版社,2004. [4]宗大华、宗涛、陈吉人编著.《操作系统》人民邮电出版社,2011.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 收银员 顾客
![提示](https://static.bdocx.com/images/bang_tan.gif)