欢迎来到天天文库
浏览记录
ID:51783169
大小:253.50 KB
页数:13页
时间:2020-03-15
《Nachos同步机制实习报告.doc》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、.【下载本文档,可以自由复制内容或自由编辑修改内容,更多精彩文章,期待你的好评和关注,我将一如既往为您服务】同步机制实习报告善良的大姐姐2015.3.3013..目录一:总体概述3二:任务完成情况3任务完成列表(Y/N)3具体Exercise的完成情况3三:遇到的困难以及解决方法12四:收获及感想12内容五:参考文献1313..一:总体概述Lab3首先要求阅读Nachos系统提供的同步机制代码,即Semaphore的实现。其次要求修改底层源代码,达到“扩展同步机制,实现同步互斥实例”的目标。具体来说,即要求在Semaphore的基础上,实现Lock锁和M
2、esa管程的Condition(条件变量)。此外,还要利用编写的同步机制,来实现互斥实例,进而证明同步机制编写的正确性。二:任务完成情况任务完成列表(Y/N)Exercise1Exercise2Exercise3Exercise4Challenge1Challenge2YesYesYesYesYesYes具体Exercise的完成情况Exercise1:调研任务:调研Linux中实现的同步机制调研情况:Linux的同步机制包括好几层。第一层:原子操作。以x86体系结构为例,定义在linuxX.X/include/asm-i386/atomic.h文件中。
3、文件内定义了原子类型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文件中。信号量的申请操作使用do
4、wn函数,释放操作使用up函数。即通常所说的PV操作。区别于自旋锁,当一个进程在等待一个锁时,会让出CPU进入休眠状态,直到其他进程释放锁后,将该进程放入可运行队列。13..Exercise2:源代码阅读任务阅读下列源代码,理解Nachos现有的同步机制。code/threads/synch.h和code/threads/synch.cccode/threads/synchlist.h和code/threads/synchlist.cc阅读情况Synch.cc(h)文件中有三个类:Semaphore,Lock,Condition。其中Semaphore是
5、已经编写完成的。主要功能是:通过一个名字和一个初始值可以初始化一个Semaphore。P函数的作用是:判断当前线程能否进入临界区,如果可以(即初始值≠0),则进入,且初始值减一;如果不能(即初始值=0),则将当前线程放入Semaphore的等待队列中,线程进入休眠状态。V函数的作用是:如果Semaphore的等待队列不为空,将等待队列的队头线程取出来,将其状态标识为ReadyToRun,并且初始值加1。另外两个类是本次作业需要完成的,会在之后说明。Synchlist.cc(h)文件中包括一个Synchlist类,实现了一个互斥访问的队列。具体来说,类中有
6、一个Append函数,用于将元素加入队列;有一个Remove函数,用于将队头元素移出队列。而互斥访问的实现方式为:用Lock锁将Append函数体和Remove函数体保护起来。保证了二者至多只有一个可以被被CPU运行,直到函数体结束。(即线程切换的中断不会造成线程交替运行)这两个函数模拟了monitor(管程)的函数体互斥性,因此在之后的作业中会用到。Exercise3:实现锁和条件变量任务可以使用sleep和wakeup两个原语操作(注意屏蔽系统中断),也可以使用Semaphore作为唯一同步原语(不必自己编写开关中断的代码)。完成情况1.Lock简述
7、:使用Semaphore作为同步原语,定义的时候创建一个初始值为1的Semaphore。对应的,Acquire函数就是执行Semaphore的P函数,Release函数就是执行Semaphore的V函数。验证正确性:采用基于优先级抢占式调度,一个线程递归生成优先级更高的线程。如果没有Lock,那么当前线程就会被抢占,那么运行结果会是这样:13..再接连输出afterfork接连输出beforefork但若在线程一开始加上了互斥锁,那么只有当当前线程运行结束后,它fork出来的线程才能获得锁,才能运行,运行结果如下:一个线程输出了beforefork和af
8、terfork之后,另一个线程才能输出1.Condition简述:修改情况简单解
此文档下载收益归作者所有