欢迎来到天天文库
浏览记录
ID:46962473
大小:73.19 KB
页数:56页
时间:2019-12-01
《山东大学计算机学院操作系统实验报告》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、....操作系统课程设计报告学院:计算机科学与技术学院专业:计算机科学与技术班级:20**级*班姓名:***学习参考....学号:20**********目录一实验平台3二Project1建立线程系统3Task1.1实现KThread.join()31.要求32.分析33.方案44.实现代码4Task1.2利用中断提供原子性,直接实现条件变量51.要求52.分析53.方案64.实现代码6Task1.3实现waitUntil81.要求82.分析83.方案94.实现代码9Task1.4用条件变量,不使用信号量,实现
2、同步发送接收消息,speak,listen111.要求112.分析123.方案124.实现代码12Task1.5完成PriorityScheduler实现优先级调度151.要求152.分析153.方案164.实现代码16Task1.6201.要求202.分析203.方案214.实现代码21三Project2多道程序设计30Task2.1311.要求312.分析313.方案324.实现代码34Task2.2391.要求392.分析403.方案404.实现代码41Task2.348学习参考....1.要求482.分
3、析483.方案484.实现代码50Task2.4531.要求532.分析533.方案534.实现代码53学习参考....一实验平台开发语言:Java开发工具:EclipseLuna操作系统:Ubuntu14.04二Project1建立线程系统Task1.1实现KThread.join()1.要求实现ImplementKThread.join()函数。注意:其它的线程不必调用join函数,但是如果它被调用的话,也只能被调用一次。对join函数第二次调用的执行结果是不被定义的(即使第二次调用的线程与第一次调用的线程
4、不同)。2.分析Join函数的作用即为等待某线程运行完毕.当前线程(唯一一个正在运行的线程)A调用另一个线程(处于就绪状态)B的join函数时(A和B在Nachos中均为KThread类型对象),A被挂起,直到B运行结束后,join函数返回,A才能继续运行。3.方案原KThread的join()中的Lib.assertTrue(this!=currentThread)已经实现线程只能调用一次join()方法,根据要求,在调用join()方法时,让当前运行线程休眠,并将当前运行的线程加入到一个阻塞队列中。在线程结
5、束时,finish()函数循环唤醒所有被阻塞的线程。学习参考....1.实现代码publicvoidjoin(){Lib.debug(dbgThread,"Joiningtothread:"+toString());Lib.assertTrue(this!=currentThread);booleanintStatus=Machine.interrupt().disable();if(status!=statusFinished){waitForJoin.waitForAccess(currentThread)
6、;KThread.sleep();}}publicstaticvoidfinish(){Lib.debug(dbgThread,"Finishingthread:"+currentThread.toString());Machine.interrupt().disable();Machine.autoGrader().finishingCurrentThread();Lib.assertTrue(toBeDestroyed==null);toBeDestroyed=currentThread;currentTh
7、read.status=statusFinished;学习参考....KThreadwaitThread;while((waitThread=currentThread.waitForJoin.nextThread())!=null){waitThread.ready();}sleep();}Task1.2利用中断提供原子性,直接实现条件变量1.要求通过利用中断有效和无效所提供的原子性实现条件变量。我们已经提供类似的例子用例实现信号量。你要按此提供类似的条件变量的实现,不能直接利用信号量来实现(你可以使用loc
8、k,虽然它间接地调用了信号量)。在你完成时要提供条件变量的两种实现方法。你的第二种条件变量实现要放在nachos.threads.Condition2中。2.分析threads.Lock类提供了锁以保证互斥.在临界代码区的两端执行Lock.acquire()和Lock.release()即可保证同时只有一个线程访问临界代码区.条件变量建立在锁之上,由threads.Condition实
此文档下载收益归作者所有