Nachos同步机制实习报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
同步机制实习报告
善良的大姐姐
2015.3.30
目录
一:总体概述 (3)
二:任务完成情况 (3)
任务完成列表(Y/N) (3)
具体Exercise的完成情况 (3)
三:遇到的困难以及解决方法 (12)
四:收获及感想 (12)
内容五:参考文献 (13)
一:总体概述
Lab3首先要求阅读Nachos系统提供的同步机制代码,即Semaphore的实现。其次要求修改底层源代码,达到“扩展同步机制,实现同步互斥实例”的目标。具体来说,即要求在Semaphore的基础上,实现Lock锁和Mesa管程的Condition(条件变量)。此外,还要利用编写的同步机制,来实现互斥实例,进而证明同步机制编写的正确性。
二:任务完成情况
任务完成列表(Y/N)
具体Exercise的完成情况
Exercise1:调研
任务:
调研Linux中实现的同步机制
调研情况:
Linux的同步机制包括好几层。
第一层:原子操作。
以x86体系结构为例,定义在linuxX.X/include/asm-i386/atomic.h文件中。文件内定义了原子类型atomic_t,其仅有一个字段counter,用于保存32位数据。其中原子操作函数atomic_inc完成自加原子操作。
第二层:自旋锁。
以x86体系结构为例,定义在linuxX.X/include/asm-i386/spinlock.h文件中。其中__raw_spin_lock完成自旋锁的加锁功能。自旋锁达到的效果为,在等待锁的线程会不断地申请锁,直到获得锁或是时间片用尽从而离开CPU。
第三层:信号量
以x86体系结构为例,定义在linuxX.X/include/asm-i386/semaphore.h文件中。信号量的申请操作使用down函数,释放操作使用up函数。即通常所说的PV操作。区别于自旋锁,当一个进程在等待一个锁时,会让出CPU进入休眠状态,直到其他进程释放锁后,将该进程放入可运行队列。
Exercise2:源代码阅读
任务
阅读下列源代码,理解Nachos现有的同步机制。
code/threads/synch.h和code/threads/
code/threads/synchlist.h和code/threads/
阅读情况
(h)
文件中有三个类:Semaphore, Lock, Condition。
其中Semaphore是已经编写完成的。主要功能是:通过一个名字和一个初始值可以初始化一个Semaphore。P函数的作用是:判断当前线程能否进入临界区,如果可以(即初始值≠0),则进入,且初始值减一;如果不能(即初始值=0),则将当前线程放入Semaphore 的等待队列中,线程进入休眠状态。V函数的作用是:如果Semaphore的等待队列不为空,将等待队列的队头线程取出来,将其状态标识为ReadyToRun,并且初始值加1。
另外两个类是本次作业需要完成的,会在之后说明。
(h)
文件中包括一个Synchlist类,实现了一个互斥访问的队列。
具体来说,类中有一个Append函数,用于将元素加入队列;有一个Remove函数,用于将队头元素移出队列。而互斥访问的实现方式为:用Lock锁将Append函数体和Remove 函数体保护起来。保证了二者至多只有一个可以被被CPU运行,直到函数体结束。(即线程切换的中断不会造成线程交替运行)
这两个函数模拟了monitor(管程)的函数体互斥性,因此在之后的作业中会用到。Exercise3:实现锁和条件变量
任务
可以使用sleep和wakeup两个原语操作(注意屏蔽系统中断),也可以使用Semaphore作为唯一同步原语(不必自己编写开关中断的代码)。
完成情况
1.Lock
简述:
使用Semaphore作为同步原语,定义的时候创建一个初始值为1的Semaphore。对应的,Acquire函数就是执行Semaphore的P函数,Release函数就是执行Semaphore的V函数。
验证正确性:
采用基于优先级抢占式调度,一个线程递归生成优先级更高的线程。如果没有Lock,那么当前线程就会被抢占,那么运行结果会是这样:
但若在线程一开始加上了互斥锁,那么只有当当前线程运行结束后,它fork 出来的线程才能获得锁,才能运行,运行结果如下:
2. Condition
简述:
Exercise4:实现同步互斥实例
任务
基于Nachos中的信号量、锁和条件变量,采用两种方式实现同步和互斥机制应用(其中使用条件变量实现同步互斥机制为必选题目)。具体可选择“生产者-消费者问题”、“读者-写者问题”、“哲学家就餐问题”、“睡眠理发师问题”等。(也可选择其他经典的同步互斥问题)
完成情况
1.基于Nachos信号量实现“生产者-消费者”问题
(基于时间片轮转调度,时间片长度随机。为了使得中断有可能在任何地方发生,在所有临界区中的代码语句后面都调用了interrupt->onetick)
测试结果截图:
2. 基于Nachos 的条件变量实现“生产者-消费者”问题
(基于时间片轮转调度,时间片长度随机。为了使得中断有可能在任何地方发生,在所有临界区中的代码语句后面都调用了interrupt->onetick ) 修改情况:
测试结果截图:
Challenge1:实现barrier
任务
可以使用Nachos 提供的同步互斥机制(如条件变量)来实现barrier ,使得当且仅当若干个线程同时到达某一点时方可继续执行。