Nachos同步机制实习报告

2019-04-21 19:35

同步机制实习报告

善良的大姐姐 2015.3.30

目录

一:总体概述 ................................................................................... 3 二:任务完成情况 ............................................................................ 3 任务完成列表(Y/N) ................................................................ 3 具体Exercise的完成情况 ........................................................... 3 三:遇到的困难以及解决方法 ...................................................... 12 四:收获及感想 ............................................................................. 12 内容五:参考文献 .......................................................................... 13

2

一:总体概述

Lab3首先要求阅读Nachos系统提供的同步机制代码,即Semaphore的实现。其次要求修改底层源代码,达到“扩展同步机制,实现同步互斥实例”的目标。具体来说,即要求在Semaphore的基础上,实现Lock锁和Mesa管程的Condition(条件变量)。此外,还要利用编写的同步机制,来实现互斥实例,进而证明同步机制编写的正确性。

二:任务完成情况

任务完成列表(Y/N)

Exercise1 Yes Exercise2 Yes Exercise3 Yes Exercise4 Yes Challenge1 Yes Challenge2 Yes 具体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进入休眠状态,直到其他进程释放锁后,将该进程放入可运行队列。

3

Exercise2:源代码阅读

任务

阅读下列源代码,理解Nachos现有的同步机制。 code/threads/synch.h和code/threads/synch.cc code/threads/synchlist.h和code/threads/synchlist.cc 阅读情况 Synch.cc(h)

文件中有三个类:Semaphore, Lock, Condition。

其中Semaphore是已经编写完成的。主要功能是:通过一个名字和一个初始值可以初始化一个Semaphore。P函数的作用是:判断当前线程能否进入临界区,如果可以(即初始值≠0),则进入,且初始值减一;如果不能(即初始值=0),则将当前线程放入Semaphore的等待队列中,线程进入休眠状态。V函数的作用是:如果Semaphore的等待队列不为空,将等待队列的队头线程取出来,将其状态标识为ReadyToRun,并且初始值加1。

另外两个类是本次作业需要完成的,会在之后说明。

Synchlist.cc(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,那么当前线程就会被抢占,那么运行结果会是这样:

4

接连输出before fork 再接连输出after fork

但若在线程一开始加上了互斥锁,那么只有当当前线程运行结束后,它fork出来的线程才能获得锁,才能运行,运行结果如下:

一个线程输出了before fork和after fork之后,另一个线程才能输出

2. Condition

简述:

修改情况 新增List变量conditionlist Wait函数:

简单解释 容纳正在等待某个signal的线程 Release的原因是,由于管程的互斥访问5


Nachos同步机制实习报告.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:碧护各个作物的使用方法及效果

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: