热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

操作系统导论OSTEP第二十八章作业答案锁

答案Github库https:github.comjzplpOSTEP-Answers问题1答案汇编代码尝试使用书类似中图28.1代码的方式来设置锁。问题2答案[testjzlo

答案Github库
https://github.com/jzplp/OSTEP-Answers


  • 问题 1 答案

  • 汇编代码尝试使用书类似中图28.1代码的方式来设置锁。

  • 问题 2 答案

[testjz@localhost threads-locks]$ ./x86.py -p flag.s -R ax,bx -M flag,count -c
ARG seed 0
ARG numthreads 2
ARG program flag.s
ARG interrupt frequency 50
ARG interrupt randomness False
ARG procsched
ARG argv
ARG load address 1000
ARG memsize 128
ARG memtrace flag,count
ARG regtrace ax,bx
ARG cctrace False
ARG printstats False
ARG verbose Falseflag count ax bx Thread 0 Thread 1 0 0 0 0 0 0 0 0 1000 mov flag, %ax0 0 0 0 1001 test $0, %ax0 0 0 0 1002 jne .acquire1 0 0 0 1003 mov $1, flag1 0 0 0 1004 mov count, %ax1 0 1 0 1005 add $1, %ax1 1 1 0 1006 mov %ax, count0 1 1 0 1007 mov $0, flag0 1 1 -1 1008 sub $1, %bx0 1 1 -1 1009 test $0, %bx0 1 1 -1 1010 jgt .top0 1 1 -1 1011 halt0 1 0 0 ----- Halt;Switch ----- ----- Halt;Switch ----- 0 1 0 0 1000 mov flag, %ax0 1 0 0 1001 test $0, %ax0 1 0 0 1002 jne .acquire1 1 0 0 1003 mov $1, flag1 1 1 0 1004 mov count, %ax1 1 2 0 1005 add $1, %ax1 2 2 0 1006 mov %ax, count0 2 2 0 1007 mov $0, flag0 2 2 -1 1008 sub $1, %bx0 2 2 -1 1009 test $0, %bx0 2 2 -1 1010 jgt .top0 2 2 -1 1011 halt

可以按预期工作。


  • 问题 3 答案

[testjz@localhost threads-locks]$ ./x86.py -p flag.s -R ax,bx -M flag,count -a bx=2,bx=2 -c
ARG seed 0
ARG numthreads 2
ARG program flag.s
ARG interrupt frequency 50
ARG interrupt randomness False
ARG procsched
ARG argv bx=2,bx=2
ARG load address 1000
ARG memsize 128
ARG memtrace flag,count
ARG regtrace ax,bx
ARG cctrace False
ARG printstats False
ARG verbose Falseflag count ax bx Thread 0 Thread 1 0 0 0 2 0 0 0 2 1000 mov flag, %ax0 0 0 2 1001 test $0, %ax0 0 0 2 1002 jne .acquire1 0 0 2 1003 mov $1, flag1 0 0 2 1004 mov count, %ax1 0 1 2 1005 add $1, %ax1 1 1 2 1006 mov %ax, count0 1 1 2 1007 mov $0, flag0 1 1 1 1008 sub $1, %bx0 1 1 1 1009 test $0, %bx0 1 1 1 1010 jgt .top0 1 0 1 1000 mov flag, %ax0 1 0 1 1001 test $0, %ax0 1 0 1 1002 jne .acquire1 1 0 1 1003 mov $1, flag1 1 1 1 1004 mov count, %ax1 1 2 1 1005 add $1, %ax1 2 2 1 1006 mov %ax, count0 2 2 1 1007 mov $0, flag0 2 2 0 1008 sub $1, %bx0 2 2 0 1009 test $0, %bx0 2 2 0 1010 jgt .top0 2 2 0 1011 halt0 2 0 2 ----- Halt;Switch ----- ----- Halt;Switch ----- 0 2 0 2 1000 mov flag, %ax0 2 0 2 1001 test $0, %ax0 2 0 2 1002 jne .acquire1 2 0 2 1003 mov $1, flag1 2 2 2 1004 mov count, %ax1 2 3 2 1005 add $1, %ax1 3 3 2 1006 mov %ax, count0 3 3 2 1007 mov $0, flag0 3 3 1 1008 sub $1, %bx0 3 3 1 1009 test $0, %bx0 3 3 1 1010 jgt .top0 3 0 1 1000 mov flag, %ax0 3 0 1 1001 test $0, %ax0 3 0 1 1002 jne .acquire1 3 0 1 1003 mov $1, flag1 3 3 1 1004 mov count, %ax1 3 4 1 1005 add $1, %ax1 4 4 1 1006 mov %ax, count0 4 4 1 1007 mov $0, flag0 4 4 0 1008 sub $1, %bx0 4 4 0 1009 test $0, %bx0 4 4 0 1010 jgt .top0 4 4 0 1011 halt

循环次数变为两次,还是可以按预期工作。


  • 问题 4 答案
    结果太长,这里仅仅给出命令。

./x86.py -p flag.s -R ax,bx -M flag,count -a bx=5,bx=5 -i 4 -c

中断频率越高(i值越低),bx越大,越容易产生不好的结果。


  • 问题 5 答案
    获取锁

mov $1, %ax
xchg %ax, mutex # atomic swap of 1 and mutex
test $0, %ax # if we get 0 back: lock is free!
jne .acquire # if not, try again

释放锁

mov $0, mutex

  • 问题 6 答案

./x86.py -p test-and-set.s -i 10 -R ax,bx -M mutex,count -a bx=5 -c

代码一直可以按预期工作,有时会导致CPU使用率高,看代码是否在获取锁的时候重复循环即可。


  • 问题 7 答案
    结果太长,这里仅仅给出命令。

./x86.py -p test-and-set.s -i 10 -R ax,bx -M mutex,count -a bx=5 -P 1100111000111000111000 -c

正确的事情发生了。


  • 问题 8 答案
    可以理解,这就是Peterson算法的汇编伪代码。

  • 问题 9 答案

[testjz@localhost threads-locks]$ ./x86.py -p peterson.s -M turn,count -R bx -i 5 -a bx=0,bx=1 -c
ARG seed 0
ARG numthreads 2
ARG program peterson.s
ARG interrupt frequency 5
ARG interrupt randomness False
ARG procsched
ARG argv bx=0,bx=1
ARG load address 1000
ARG memsize 128
ARG memtrace turn,count
ARG regtrace bx
ARG cctrace False
ARG printstats False
ARG verbose Falseturn count bx Thread 0 Thread 1 0 0 0 0 0 0 1000 lea flag, %fx0 0 0 1001 mov %bx, %cx0 0 0 1002 neg %cx0 0 0 1003 add $1, %cx0 0 0 1004 mov $1, 0(%fx,%bx,4)0 0 1 ------ Interrupt ------ ------ Interrupt ------ 0 0 1 1000 lea flag, %fx0 0 1 1001 mov %bx, %cx0 0 1 1002 neg %cx0 0 1 1003 add $1, %cx0 0 1 1004 mov $1, 0(%fx,%bx,4)0 0 0 ------ Interrupt ------ ------ Interrupt ------ 1 0 0 1005 mov %cx, turn1 0 0 1006 mov 0(%fx,%cx,4), %ax1 0 0 1007 test $1, %ax1 0 0 1008 jne .fini1 0 0 1009 mov turn, %ax1 0 1 ------ Interrupt ------ ------ Interrupt ------ 0 0 1 1005 mov %cx, turn0 0 1 1006 mov 0(%fx,%cx,4), %ax0 0 1 1007 test $1, %ax0 0 1 1008 jne .fini0 0 1 1009 mov turn, %ax0 0 0 ------ Interrupt ------ ------ Interrupt ------ 0 0 0 1010 test %cx, %ax0 0 0 1011 je .spin10 0 0 1006 mov 0(%fx,%cx,4), %ax0 0 0 1007 test $1, %ax0 0 0 1008 jne .fini0 0 1 ------ Interrupt ------ ------ Interrupt ------ 0 0 1 1010 test %cx, %ax0 0 1 1011 je .spin10 0 1 1006 mov 0(%fx,%cx,4), %ax0 0 1 1007 test $1, %ax0 0 1 1008 jne .fini0 0 0 ------ Interrupt ------ ------ Interrupt ------ 0 0 0 1009 mov turn, %ax0 0 0 1010 test %cx, %ax0 0 0 1011 je .spin10 0 0 1012 mov count, %ax0 0 0 1013 add $1, %ax0 0 1 ------ Interrupt ------ ------ Interrupt ------ 0 0 1 1009 mov turn, %ax0 0 1 1010 test %cx, %ax0 0 1 1011 je .spin10 0 1 1006 mov 0(%fx,%cx,4), %ax0 0 1 1007 test $1, %ax0 0 0 ------ Interrupt ------ ------ Interrupt ------ 0 1 0 1014 mov %ax, count0 1 0 1015 mov $0, 0(%fx,%bx,4)1 1 0 1016 mov %cx, turn1 1 0 1017 halt1 1 1 ----- Halt;Switch ----- ----- Halt;Switch ----- 1 1 1 1008 jne .fini1 1 1 ------ Interrupt ------ ------ Interrupt ------ 1 1 1 1009 mov turn, %ax1 1 1 1010 test %cx, %ax1 1 1 1011 je .spin11 1 1 1012 mov count, %ax1 1 1 1013 add $1, %ax1 1 1 ------ Interrupt ------ ------ Interrupt ------ 1 2 1 1014 mov %ax, count1 2 1 1015 mov $0, 0(%fx,%bx,4)0 2 1 1016 mov %cx, turn0 2 1 1017 halt

我看不同i值的运行情况都挺好的,没有出现不是预期的结果。不过一定要给两个线程的bx初值肤质,否则锁不起效果。


  • 问题 10 答案
    结果太长,这里仅仅给出命令。

./x86.py -p peterson.s -M turn,count -R bx -a bx=0,bx=1 -P 0000011111 -c
./x86.py -p peterson.s -M turn,count -R bx -a bx=0,bx=1 -P 00000011111 -c

这两个是分别是线程0和线程1循环等待的例子,可以自行修改P试试其它情况。


  • 问题 11 答案
    相符的。

  • 问题 12 答案
    结果太长,这里仅仅给出命令。

./x86.py -p ticket.s -a bx=1000,bx=1000 -i 5 -M count,ticket,turn -c

线程没出现花很长时间自旋等待锁的情况。


  • 问题 13 答案
    结果太长,这里仅仅给出命令。

./x86.py -p ticket.s -t 3 -a bx=100,bx=100,bx=100 -i 5 -M count,ticket,turn -c

并未发现。(太长了看的眼疼)


  • 问题 14 答案
    结果太长,这里仅仅给出命令。

./x86.py -p yield.s -M count,mutex -a bx=10,bx=10 -i 5 -c

经常看到锁被占用时,调用yield主动放弃CPU的情况。


  • 问题 15 答案
    相比于test-and-set.s,多了上面的不用xchg的测试锁的步骤,这样实际上对mutex测试了两次。我猜测xchg指令对资源消费更多(时间更长)。虽然第一次没有提供测试不能提供完整的测试,但是可以排除大部分情况了,因此大部分时间都是在第一个测试处自旋,相比于xchg自旋对资源的消耗更小。
    (我的猜测不一定正确)

推荐阅读
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • 标题: ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
author-avatar
Perz
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有