ImageVerifierCode 换一换
格式:DOCX , 页数:35 ,大小:31.34KB ,
资源ID:16001570      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/16001570.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(山东大学计算机学院操作系统实验报告Word文件下载.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

山东大学计算机学院操作系统实验报告Word文件下载.docx

1、Java开发工具:Eclipse Luna操作系统:Ubuntu14.04二 Project1建立线程系统Task1.1实现KThread.join()1. 要求实现Implement KThread.join()函数。注意:其它的线程不必调用join函数,但是如果它被调用的话,也只能被调用一次。 对join函数第二次调用的执行结果是不被定义的(即使第二次调用的线程与第一次调用的线程不同)。2. 分析Join函数的作用即为等待某线程运行完毕. 当前线程 (唯一一个正在运行的线程) A调用另一个线程 (处于就绪状态) B的join函数时 (A 和 B 在Nachos中均为KThread类型对象)

2、, A被挂起, 直到B运行结束后, join函数返回, A才能继续运行。3. 方案原KThread的join()中的Lib.assertTrue(this != currentThread)已经实现线程只能调用一次join()方法,根据要求,在调用join()方法时,让当前运行线程休眠,并将当前运行的线程加入到一个阻塞队列中。在线程结束时,finish()函数循环唤醒所有被阻塞的线程。4. 实现代码public void join() Lib.debug(dbgThread, Joining to thread: + toString(); Lib.assertTrue(this != cur

3、rentThread);boolean intStatus = Machine.interrupt().disable();if (status != statusFinished) waitForJoin.waitForAccess(currentThread); KThread.sleep(); public static void finish() Finishing thread: + currentThread.toString(); Machine.interrupt().disable(); Machine.autoGrader().finishingCurrentThread(

4、); Lib.assertTrue(toBeDestroyed = null); toBeDestroyed = currentThread; currentThread.status = statusFinished; KThread waitThread; while (waitThread = currentThread.waitForJoin.nextThread() != null) waitThread.ready(); sleep();Task1.2利用中断提供原子性,直接实现条件变量通过利用中断有效和无效所提供的原子性实现条件变量。我们已经提供类似的例子用例实现信号量。你要按此

5、提供类似的条件变量的实现,不能直接利用信号量来实现(你可以使用lock,虽然它间接地调用了信号量)。在你完成时要提供条件变量的两种实现方法。你的第二种条件变量实现要放在nachos.threads.Condition2中。threads.Lock类提供了锁以保证互斥. 在临界代码区的两端执行Lock.acquire() 和Lock.release() 即可保证同时只有一个线程访问临界代码区. 条件变量建立在锁之上, 由threads.Condition实现, 它是用来保证同步的工具. 每一个条件变量拥有一个锁变量 (该锁变量亦可被执行acquire和release操作, 多个条件变量可共享同一

6、个锁变量). 当处于临界区内的拥有某锁L的当前线程对与锁L联系的条件变量执行sleep操作时, 该线程失去锁L并被挂起. 下一个等待锁L的线程获得锁L (这个过程由调度程序完成) 并进入临界区. 当拥有锁L的临界区内的当前线程对与锁L联系的条件变量执行wake操作时 (通常调用wake之后紧接着就是Lock.release), 等待在该条件变量上的之多一个被挂起的线程 (由调用sleep引起) 被重新唤醒并设置为就绪状态. 若执行wakeall操作, 则等待在该条件变量上的所有被挂起的线程都被唤醒.condition.sleep 采用waiter.P() 实现休眠 (waitor是一个信号量)

7、 并将waitor放入信号量队列, 在我们的实现中改成用KThread.sleep()实现休眠并将当前线程放入线程队列, 并在sleep函数开始/结尾处屏蔽/允许中断以保证原子性。condition.wake中从等待信号量队列中取出信号量并对其进行V操作实现唤醒, 在我们的实现中改成从线程队列中取出线程用KThread.ready() 实现唤醒 (同样要在wake函数开始/结尾处屏蔽/允许中断)。wakeall函数的实现依赖于wake(). 只需不断地wake 直到队列为空为止.private ThreadQueue waitQueue =ThreadedKernel.scheduler.ne

8、wThreadQueue(false);private boolean hasWaiter = false;public void sleep() Lib.assertTrue(conditionLock.isHeldByCurrentThread();waitQueue.waitForAccess(KThread.currentThread();hasWaiter = true;conditionLock.release();KThread.sleep();conditionLock.acquire();Machine.interrupt().restore(intStatus);publi

9、c void wake() boolean intStatus = Machine.interrupt().disable(); KThread thread = waitQueue.nextThread();if (thread != null) thread.ready(); else hasWaiter=false; Machine.interrupt().restore(intStatus);public void wakeAll() Lib.assertTrue(conditionLock.isHeldByCurrentThread();while (hasWaiter) wake(

10、);Task1.3实现waitUntil通过实现waitUntil(int x)方法来完成Alarm类。一个线程通过调用waitUntil函数来挂起它自己,直到now+x后才被唤醒。在实时操作中,对线程是非常有用的,例如实现光标每秒的闪烁。这里并不要求线程被唤醒后马上执行它,只是在它等待了指定时间后将它。放入等待队列中。不要通过产生任何附加的线程来实现waitUntil函数,你仅需要修改waitUntil函数和时间中断处理程序。waitUntil函数并不仅限于一个线程使用,在任意时间,任意多的线程可以调用它来阻塞自己。于Alarm类有关的是machine.Timer类. 它在大约每500个时钟

11、滴答使调用回调函数 (由Timer.setInterruptHandler函数设置). 因此, Alarm类的构造函数中首先要设置该回调函数Alarm.timerInterrupt().为了实现waitUntil, 需要在Alarm类中实现一个内部类Waiter, 保存等待的线程及其唤醒时间.在调用waitUntil(x) 函数时, 首先得到关于 该线程的信息: (线程: 当前线程, 唤醒时间: 当前时间+x), 然后构造新的Waiter对象, 并调用sleep操作使当前线程挂起. 在时钟回调函数中 (大约每500个时钟间隔调用一次) 则依次检查队列中的每个对象。 如果唤醒时间大于当前时间,

12、则将该对象移出队列并执行wake操作将相应线程唤醒。class WaiterWaiter(long wakeTime,KThread thread) this.wakeTime=wakeTime; this.thread=thread; private long wakeTime; private KThread thread;public void waitUntil(long x) long wakeTime = Machine.timer().getTime() + x; Waiter waiter = new Waiter(wakeTime,KThread.currentThread(

13、); waitlist.add(waiter); System.out.println(KThread.currentThread().getName() +线程休眠,时间为:+Machine.timer().getTime()+,应该在 +wakeTime+醒来.); KThread.sleep();public void timerInterrupt() Waiter waiter; for(int i=0;iwaitlist.size();i+) waiter=waitlist.remove(); if(waiter.wakeTime= Machine.timer().getTime() System.out.println(唤醒线程:+waiter.thread.getName()+,时间为:+Machine.timer().getTime(); waiter.thread.ready();/线程进入就绪状态 else waitlist.add(waiter); KThread.currentThread().yield();private LinkedList waitlist;Task1.4用条件变量,不使用信号量,实现同步发送接收消息,speak,listen使用条件变量来实现一个字长信息的发送和接收同步。使用void speak(int word) 和

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1