- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
同步机制实习报告 目录
一:总体概述 3
二:任务完成情况 3
任务完成列表(Y/N) 3
具体Exercise的完成情况 3
三:遇到的困难以及解决方法 12
四:收获及感想 12
内容五:参考文献 13
一:总体概述
Lab3首先要求阅读chos系统提供的同步机制代码即的基础上实现ock锁和管程的dition(条件变量
二:任务完成情况
任务完成列表(Y/N)
Exercise1 Exercise2 Exercise3 Exercise4 Challenge1 Challenge2 Yes Yes Yes Yes Yes Yes
具体Exercise的完成情况
Exercise1:调研
任务
调研
调研情况
Linux的同步机制包括好几层
第一层:原子操作。
以定义在linuxX.X/include/asm-i386/atomic.h文件中文件内定义了原子类型
第二层
以
第三层信号量
以
Exercise2:源代码阅读
任务
code/threads/synch.h和code/threads/synch.cc
code/threads/synchlist.h和code/threads/synchlist.cc
阅读情况
Synch.cc h
文件中有三个类:Semaphore, Lock, Condition。
其中Semaphore是已经编写完成的主要功能是通过一个名字和一个初始值可以初始化一个maphore。P函数的作用是:判断当前线程能否进入临界区,如果可以(即初始值≠0),则进入,且初始值减一;如果不能(即初始值=0),则将当前线程放入Semaphore的等待队列中,线程进入休眠状态。V函数的作用是:如果Semaphore的等待队列不为空,将等待队列的队头线程取出来,将其状态标识为ReadyToRun,并且初始值加1。
另外两个类是本次作业需要完成的会在之后说明
Synchlist.cc h
文件中包括一个 具体来说,类中有一个Append函数,用于将元素加入队列;有一个Remove函数用于将队头元素移出队列而互斥访问的实现方式为保护起来 这两个函数模拟了monitor(管程cise3:实现锁和条件变量
任务
Lock
简述
使用Semaphore作为同步原语,定义的时候创建一个初始值为1的Semaphore。对应的,Acquire函数就是执行maphore的
验证正确性:
采用基于优先级抢占式调度一个线程递归生成优先级更高的线程如果没有Lock
但若在线程一开始加上了互斥锁那么只有当当前线程运行结束后它
Condition
简述
修改情况 简单解释 新增List变量conditionlistWait函数
对传入的Lock参数执行关中断
将当前线程加入
对传入的ck参数执行
开中断lease的原因是由于管程的互斥访问性当一个线程需要
关中断如果oRun队列
开中断cast函数
关中断
将
开中断dcast函数即唤醒所有正在等待这个条件变量的线程4:实现同步互斥实例
任务
基于Nachos中的信号量、锁和条件变量,采用两种方式实现同步和互斥机制应用(其中使用条件变量实现同步互斥机制为必选题目)。具体可选择“生产者-消费者问题”、“读者-写者问题”、“哲学家就餐问题”、“睡眠理发师问题”等。(也可选择其他经典的同步互斥问题)
完成情况
基于
(基于时间片轮转调度,时间片长度随机。为了使得中断有可能在任何地方发生,在所有临界区中的代码语句后面都调用了interrupt- onetick)
修改情况isFull信号量初始值为isEmpty信号量初始值为
M1信号量
生产数组如果生产数组内元素数量达到
M1信号量用于保证生产数组的互斥访问。 Producer函数
isEmpty- P
在
isFull- V 由于IsEmpty信号量初始值为Consumer函数
isFull- P
在
isEmpty- V 由于isFull信号量在生产者生产之后会被释放,因此此时消费者可以消费。相应的,isEmpty信号量被释放,使得生产者可以继续生产。 Test_Producer函数
For循环函数_consumer函数
For循环函数0次Test函数
新生成1个生产者线程_producer函数和_consumer函数
测试结果截图
基于
修改情况:
增改测试变量和函数 简单解释 Synchlist.cc: 新增变量
ListEmpty条件变量
Full条件变量
Listcount计数值
计数值用于判断生产队列是否满了
加锁
如果生产队列满Empty条件变量
Signal listFull条件变量
解锁
如果生产队列满,则等待消费者消费之后,发送listEmpty条件变量。
生
文档评论(0)