- 1、本文档共23页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一 题目
project1:实现nachos操作系统的project1中的join()方法,condition2类,Alarm类,Communicator类,PriorityScheduler类和Boat类
project2:实现nachos操作系统的project2中的creat open read write close unlink 文件系统调用,修改UserProcess.readVirtualMemory 和UserProcess.writeVirtualMemory使操作系统能够运行多用户程序,实现exec join exit系统调用,实现LotteryScheduler类
二 实验目的
熟悉nachos操作系统,深入理解操作系统内核
了解用户程序的加载过程以及多用户进程的内存分配机制
三 实验要求
完成nachos,提交设计文档和你的代码
四 实验说明,程序代码及测试结果
Project1:
1 join()
要求实现join()方法,注意,其他线程没必要调用join函数,但是如果它被调用的话,也只能被调用一次。join()方法第二次调用的结果是不被定义的,即使第二次调用的线程和第一次调用的线程是不同的。无论有没有被join,一个进程都能够正常结束
设计思想
当线程B执行A.join()时,将B放入A的等待队列,直到A完成时,唤醒在等待队列中的所有线程,因此需要实现join()方法和修改finish方法
源代码
public void join() {
Lib.debug(dbgThread, Joining to thread: + toString());
Lib.assertTrue(this != currentThread);
Lib.assertTrue(join_counter == 0);
join_counter++;
boolean status = Machine.interrupt().disable();
if (this.status != statusFinished) {
waitQueue.waitForAccess(KThread.currentThread()); currentThread.sleep();
}
Machine.interrupt().restore(status);
}
public static void finish() {
Lib.debug(dbgThread, Finishing thread: + currentThread.toString());
Machine.interrupt().disable(); Machine.autoGrader().finishingCurrentThread(); Lib.assertTrue(toBeDestroyed == null);
toBeDestroyed = currentThread;
currentThread.status = statusFinished;
KThread thread = currentThread().waitQueue.nextThread();
if (thread != null)
{
thread.ready();
}
sleep();
}
程序截图
线程1每次执行打出执行的次数,每次执行过后放弃cpu,线程2打出successful,线程2执行thread1.join().通过截图可以看出代码正确
2 Condition2
通过使用开关中断提供原子性来直接实现条件变量,我们利用信号量提供了一个简单的实现方式,你的工作就是不直接使用信号量提供相同的实现(你或许使用锁,即使它们也间接的使用了信号量)。一旦你实现了 ,你将会有两种可选择的实现方式来提供相同的功能。你的第二种条件变量的实现必须放在Condition2中
(a)设计思想
Condition2是对使用该条件变量的线程进行管理,所以要把在这个条件变量上等待的进程储存起来,因此可以使用一个队列。
sleep()方法是把等待该条件变量的线程阻塞,放入等待队列,直到执行了wake()并且获得cpu才能继续执行,执行步骤:关中断,释放锁,把线程放入等待队列,获得锁,开中断 。
wake()方法是把条件变量中的线程移出,放入就绪队列。执行步骤:关中断,线程移出等待队列移入就绪队列,开中断
wakeAll()方法是将条件变量中的所有线程移出,移入就绪队列
(b)源代码
public void sleep() {
Lib.assertTru
文档评论(0)