操作系统刚上两周网课老师便布置了两道现阶段本人觉得是课设的”课设“,第一道题在之前的博客中报告过了,下面是第2道题的菜鸟报告。上一篇博客中有初次做这道题的具体分析过程了,这里就侧重后面的代码实现部分的分析。
先上题目:
题目
某寺庙,有小和尚、老和尚若干。有一水缸,由小和尚提水入缸,老和尚从缸中取水饮用。水缸可容纳10桶水,水取自同一水井中,水井径窄,每次只能容一个水桶取水。水桶总数为3个,每次入、取缸水仅为1桶,且不可同时进行。试给出取水、入水的算法描述。
1、初解
1、乍一看以为只是算法描述,然后课本和一些网上资源也只是P、V操作的伪代码。因此我的分析是这样子的:
看题过程把重点信息找出来(即找出资源),然后开始进一步捋清流程。
小和尚打水入缸流程:
拿桶--------->去水井取水(互斥,P、V操作)--------->把水倒入水缸(互斥,P、V操作)--------->放桶
老和尚取水饮用流程:
拿桶--------->去水缸取水(互斥,P、V操作)--------->放桶
2、伪代码如下:
semaphore mutex_well = 1, mutex_vat = 1;//互斥量
semaphore pail = 3, empty = 10, full = 0;//定义自然量,empty表示水的总容量,full表示满的标志
project small()//小和尚
{
while (true)
{
P(empty); //判断水缸是否还有容量,有则减一,程序向下执行
P(pail); //申请一个桶
P(mutex_well); //占用水井
从水井中打水; //活动
V(mutex_well); //用完水井,释放资源
P(mutex_vat); //占用水缸
将水倒入水缸中; //活动
V(mutex_vat) //释放资源
V(pail); //放桶
V(full); //full+1,即水缸中的水的桶数加1,注意成对出现问题!!!
}
}
project old()//老和尚
{
while (true)
{
P(full); //看是否有水,有则减一,程序向下执行
P(pail); //拿桶
P(mutex_vat); //占用水缸
从水缸中取水; //活动
V(mutex_vat); //用完水缸,释放资源
喝水; //此处虽可省,但有这一步更为具体形象
V(pail); //放桶
V(empty); //容量加一,可装入的水的桶数加1
}
}
通过看课本和在网上看一些别人的总结分享,我写出了这段伪代码。写完后心里还想着,咦,老师不是说比上次的题目困难很多吗?怎么这么容易就被我搞定了(是真的比较容易,只要求这样子的答案的话)。但,无论如何当时都觉得很开心,终于把这个每周都会有的令人担忧的操作系统实操作业搞定了!(毕竟我比较菜鸟)
2、再次上课
很多人都只是写了简单的一段伪代码,毕竟题目只是说算法描述,老师也没特别说明,就只是说回去把它搞好,So…
然后就被说了:”伪代码有啥可看的”,然后便"耐心“地讲解了关于这方面的内容,主要就是信号量的具体使用吧,下课前留了一句:回去接着把题目搞好啊…
课上老师讲解了一个简单的示例,如下: