Nachos同步机制实习报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 ,使得当且仅当若干个线程同时到达某一点时方可继续执行。

相关文档
最新文档