操作系统概念第六章部分作业题答案

操作系统概念第六章部分作业题答案题目一:如果将peterson算法中的flag[i]=true与turn=j两条语句交换顺序,会导致求解临界区问题所需三个要求(互斥、有空让进、有限等待)中的哪些要求得不到满足?请举例并分析说明得不到满足的情况解答:假设两个进程i和j:进程i的进入区代码是这样的flag[i]=TRUE;turn=j;while(flag[j]==TRUE&&…

大家好,又见面了,我是你们的朋友全栈君。

题目一:

如果将 peterson 算法中的 flag[i] = true 与 turn = j 两条语句交换顺序,会导致求解临界区问题所需三个要求(互斥、有空让进、有限等待)中的哪些要求得不到满足?请举例并分析说明得不到满足的情况
解答:
假设两个进程i和j:
进程i的进入区代码是这样的
flag[i] = TRUE;
turn = j;
while(flag[j] == TRUE && turn == j);
进程j的进入区代码是这样的:
flag[j] = TRUE;
turn = i;
while(flag[i] == TRUE && turn == i);
如果进程i和进程j已经在并发执行了,它们的调度顺序是未知的,假设程i先执行,那么它会先将turn“谦让”地设置为j,但接下来轮到进程j执行了,它也“谦让”地将turn设置为i。这时又轮到了进程i执行了,而且我们可以发现,while中第二个条件已经不满足了!这时进程i就进入了临界区!
如果顺序颠倒,总共会六种可能的语句组合情况:
在这里插入图片描述
如果仅仅从结果来看,似乎六种情况都满足三个条件:
在这里插入图片描述
但如果考虑中间能够进入临界区的情况,那么情况三和情况四将会不满足互斥条件,进程i与进程j将有可能同时进入临界区:
在这里插入图片描述
所以,会存在不满足互斥的情况,所以不可以。

题目二:

试分析说明为何自旋锁(spinlocks)不适合单处理器系统但却常用于多处理器系统。
解答:
在单处理机环境中可以使用硬件提供的swap指令或test_and_set指令实现进程互斥,这些指令涉及对同一存储单元的两次或两次以上操作,这些操作将在几个指令周期内完成,但由于中断只能发生在两条机器指令之间,而同一指令内的多个指令周期不可中断,从而保证swap指令或test_and_set指令的执行不会交叉进行。
但在多处理机环境中情况有所不同,例如test_and_set指令包括“取”、“送”两个指令周期,两个CPU执行test_and_set(lock)可能发生指令周期上的交叉,假如lock初始为0, CPU1和CPU2可能分别执行完前一个指令周期并通过检测(均为0),然后分别执行后一个指令周期将lock设置为1,结果都取回0作为判断临界区空闲的依据,从而不能实现互斥。
为在多CPU环境中利用test_and_set指令实现进程互斥,硬件需要提供进一步的支持,以保证test_and_set指令执行的原子性. 这种支持目前多以“锁总线”(bus locking)的形式提供的,由于test_and_set指令对内存的两次操作都需要经过总线,在执行test_and_set指令之前锁住总线,在执行test_and_set指令后开放总线,即可保证test_and_set指令执行的原子性。

题目三:

请用比较并交换指令(compare_and_swap())实现互斥锁机制。互斥锁包含的数据结构及函数如下所示,其中 available == 0 表示锁可用,available == 1 表示锁不可用。
typedef struct {

int available ;
} lock ;
void acquire ( lock *mutex ) ;
void release ( lock *mutex ) ;
解答:
互斥锁是指当一个线程尝试获取某个锁时,如果该锁已被其他线程占用,该线程挂起或睡眠。互斥锁适用于临界区持锁时间比较长的操作,比如下面这些情况都可以考虑:
·临界区有IO操作
·临界区代码复杂或者循环量大
·临界区竞争非常激烈
·单核处理器
CAS(compare and swap),它通过原子操作交换两个变量的值来达到对变量的修改。我们可以把它看作是 i = i+1 这个表达式的原子操作版本。它的实现类似如下:
int compare and swap(int *value, int expected, int new_value) {

int temp = *value;
if (*value == expected)
*value = new_value;
return temp;
}
在一些线程库里面,mutex 是最简单的一种锁,也是最常见的锁。它的作用主要是对一段临界区上锁,对其他试图访问已经上锁的资源禁止访问。因此 mutex 也叫互斥锁,它的是英文单词 mutual exclustion 的缩写。mutex 可以使用 SAS 或 CAS 来实现:
mutex 通过让试图获取的锁的执行单元进入到一个等待队列里排队,当锁用完了以后再把等待的执行单元拿出来获取锁并继续执行:
void acquire (){

if(lock->available){

//把当前的执行单元加入到等待队列
add_process_to_waitlist(current_pocess)
sleep()//休眠
}
}
void release (){

compare_and_swap(lock,1,0)
//唤醒休眠的线程
wakeup_process()
}
顺便,写一下自旋锁,自旋锁之所以被叫做自旋锁,就是因为他会在锁被其他占用的时候会一直循环,不断地询问锁是否打开,也就是所谓的轮询,即:如果一个执行单元锁住了一块资源,另一个执行单元试图进入会一直轮询知道获取到锁为止:
void acquire (){

while(lock->available)//轮询
;
}
void release (){

compare_and_swap(lock,1,0)
}

题目四:

理发师问题:理发店里有一位理发师、一把理发椅和 n 把供等候理发的顾客坐的椅子。如果没有顾客,理发师便在理发椅上睡觉。当一个顾客到来时,它必须叫醒理发师。如果理发师正在理发时又有顾客到来,如果有空椅子可坐,就坐下来等待,否则就离开。请用信号量机制(wait(),signal())来解决上述问题。
解答:
首先设置一个count表示等待的人数(包括理发椅上的那个人),初值为0,以供后来者判断是否应该离开。同时对count的访问要保证互斥,所以设置mutex信号量来保证互斥,初值为1。
临界资源:凳子,理发椅。 分别设置waitchair,barchair信号量,初值分别为n和1,表示临界资源数量。
同步关系:顾客和理发师之间有同步关系,用ready和done信号量来表示,初值均为0,ready表示顾客有没有准备好,done表示理发师是否完成一次理发。
注意:并非每一个进程都需要while(1)无限循环,比如此例,顾客剪完一次头发就走了,不可能马上再来剪,而以前的生产者-消费者不同,他们都是可以不断生产消费的。
Semaphore waitchair = n;
Semaphore barchair = 1;
Semaphore ready = done = 0;
int count = 0;
Semaphore mutex = 1;
barber:
while(1) {

wait(ready);
理发
signal(done);
}
consumer:
wait(mutex);
if(count <= n) {

count = count + 1;
signal(mutex);
}
else {

signal(mutex);
离开
}
wait(waitchair);
wait(barchair);
signal(waitchair); //离开等待椅去理发椅需要释放等待椅!
signal(ready); //准备好了
wait(done); //等待理发完成
signal(barchair);
wait(mutex);
count = count – 1;
signal(mutex);
离开

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159080.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • echarts饼图labelLine颜色_旭日图怎么做

    echarts饼图labelLine颜色_旭日图怎么做前言如果你想要用较少的代码实现比较酷炫的数据统计表,echarts是值得你考虑的一种实现方式。官网提供了很多实例供参考。并且配置项手册很详细,几乎囊括了所有的绘图需求。但是再全的配置,偶尔也会有不满足需求的时候。最近在开发过程中就遇到了一个比较头疼的问题。先看下UI效果dy20180512171652810.jpg思路拿到需求,先看echarts的配置手册,很容易想到使用旭日图来做。但是还没等大致…

    2022年9月26日
    4
  • Photoshop CC 2019选区的基本操作(快捷键)

    Photoshop CC 2019选区的基本操作(快捷键)1.全选与反选ctrl+A2.取消选择和重新选择取消:ctrl+D重新选择:ctrl+shift+D3.运算选区shift+拖动鼠标,添加到选区alt+拖动鼠标,从选区减去alt+shift+拖动,与选区交叉4.移动选区鼠标到选区边缘即可移动…

    2022年6月16日
    46
  • pycharm中如何导入库_库乐队如何导入相册的视频

    pycharm中如何导入库_库乐队如何导入相册的视频大家都知道,Python是一个极其方便的由库构建的编程语言。比如机器学习的库sklearn,文件读取pandas,文件读写xlwt,xlrt,矩阵运算numpy等等等等等等等等等等,多到你无法想象!那到底如何导入Python库呢?我们今天就来学习一下~点击File->NewProject,创建一个PyCharm项目,然后点击File->Settings->P…

    2022年8月27日
    7
  • JMS activeMQ

    JMS activeMQ

    2022年3月3日
    35
  • 光棍节程序员闯关秀过关攻略「建议收藏」

    光棍节程序员闯关秀过关攻略「建议收藏」光棍节,与我无关,结果昨夜下了场雨,导致路面结冰,大侠的出行计划泡汤了,只好在家淘宝抢东西。结果网友发来一个光棍节程序员闯关秀游戏,让大侠一发不可收拾。。。游戏地址http://segmentfault.com/game/花了两个小时过了9关,最后一关没过去。欢迎大家补充。第一关:本关用右键查看URL就能得到地址,大侠用的GoogleChrome,查看元素,下面的…

    2022年7月16日
    27
  • 狂神说Linux_狂神说docker笔记

    狂神说Linux_狂神说docker笔记Linux在服务器端,很多大型项目都是部署在Linux服务器上利用VM + Centos7搭建本地Linux系统你可以使用 man [命令]来查看各个命令的使用文档,如 :man cp。概念云服务器就是一个远程电脑Linux中一切皆文件根目录/,所有的文件都挂载在这个节点下/bin:bin是Binary的缩写, 这个目录存放着最经常使用的命令。/boot: 这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。/dev : dev是Device(设备

    2022年8月9日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号