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

加入VIP,省得不是一点点
 

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

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

下载须知

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

版权提示 | 免责声明

本文(Dijkstra算法的实践与提高.ppt)为本站会员(da****u)主动上传,文客久久仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知文客久久(发送邮件至hr@wenke99.com或直接QQ联系客服),我们立即给予删除!

Dijkstra算法的实践与提高.ppt

1、Whats wrong?public int listen() lock.acquire(); if (!present) / 如果没有留言 empty.sleep(); / 则睡眠/ 取得留言int word = buffer;present = false; / 唤醒正在等待发言的人full.wake(); lock.release();return word;public void speak(int word) lock.acquire();if (present) / 如果已有留言 full.sleep(); / 则睡眠/ 留言buffer = word;present = true

2、;/ 唤醒正在等待接受留言的人empty.wake();lock.release();Wrong or Not?public class KThread ./* Unique identifer for this thread. Used to deterministicallycompare threads. */ private int id = numCreated+; /* Number of times the KThread constructor was called. */private static int numCreated = 0;.How to Read code?C

3、ase Study: KThread和 TCB的构造顺序分析u 一个 KThread必然有一个 TCB吗?u 每个 TCB必然在运行一个 KThread吗?u 先有第一个 TCB,还有先有第一个 KThread?KThread和 TCB的构造顺序分析 先有鸡还是先有蛋?首先被构造出的是 TCB, 在 Machine.main完成各种环境初始化后,最后一句写的是:new TCB().start(new Runnable() public void run() autoGrader.start(privilege); );其实, autoGrader.start会构造一个 Kernel的实例 (根

4、据 Nachos.coff的设置,目前就是 ThreadKernel),并且 调用 Kernel.initialize令其自我初始化转入 ThreadKernel.initialize, ThreadKernel首先装入自己需要的Scheduler和 FileSystem, 然后鬼使神差般地写了一句:new KThread(null);这就是最早的 KThread的实例。(我们称它叫 “new KThread No1”)KThread和 TCB的构造顺序分析 new KThread(null)?注意这么构造 KThread是 可疑 的。因为在过程里没有保存对这个实例的引用,所以这个 KThre

5、ad永远没有机会被 fork()!public void initialize(String args) new KThread(null); / “new KThread No1” 检查整个工程,我们没有发现其他地方有这么写的,这么做的目的何在?我们需要看看 KThread的构造函数干了什么: if (currentThread != null) / currentThread是静态全局变量,/ 其初值默认为空tcb = new TCB(); else / 可见第一次进 KThread()是执行这里KThread和 TCB的构造顺序分析 if (currentThread != null)?

6、 / 接上 else readyQueue = ThreadedKernel.scheduler.newThreadQueue(false);readyQueue.acquire(this);currentThread = this; tcb = TCB.currentTCB(); / 这句话非常重要,我们在下面会分析到createIdleThread();进入了 ”else”这个模块之后, currentThread被立即赋值了,结合上下文的语意,我们可以推测这个 ”else”模块不会被执行第二次。于是我们断言:首次调用 KThread的构造函数,作用仅仅是初始化!KThread和 TCB的

7、构造顺序分析 改造 “new KThread No1”根据上述分析, “new KThread No1” 和直觉上大相径庭,似乎改写成KThread.initialize(); 会更自然一点,那为何需要这么写? public void initialize(String args) new KThread(null); / 是不是 KThread.initialize(); 更自然? (提示: currentThread = this 这句话揭示了问题的答案 )我们的目标是研究每个 KThread是如何和一个 TCB绑定并且运行起来的, “new KThread No1”没有给我们提供有用的东

8、西。 幸运的是,它的 一个子过程: createIdleThread引起了我们的注意: KThread和 TCB的构造顺序分析 IdleThreadprivate static void createIdleThread() idleThread = new KThread(new Runnable() public void run() while (true) yield(); ); / “new KThread No2”idleThread.setName(“idle”).fork();我们又看到一句 new KThread(.); 可以叫作 “new KThread No2”。与”No

9、1” 不同,这一次 currentThread 不为 null了,于是, KThread的构造函数只会执行一句话:if (currentThread != null) tcb = new TCB(); KThread和 TCB的构造顺序分析 creatIdleThreadprivate static void createIdleThread() idleThread = new KThread(new Runnable() public void run() while (true) yield(); ); / “new KThread No2”idleThread.setName(“idl

10、e”).fork();我们又看到一句 new KThread(.); 可以叫作 “new KThread No2”。与”No1” 不同,这一次 currentThread 不为 null了,于是, KThread的构造函数只会执行一句话:if (currentThread != null) tcb = new TCB(); KThread和 TCB的构造顺序分析summaryinterrupt().enable()Main TCB Created By Machine():kernel.initializenew KThread(null)kernel.run();kernel.terminate();createIdleThreadcurrentThread = this tcb = TCB.currentTCB tcb=new TCB()初始化内核开启中断启动内核中止内核初始化全局变量建立空闲线程内核自检 kernel.selfTest();TCB Created By Main TCB:yield();yield();tcb=new TCB()Boat.selfTest();tcb=new TCB() process.execute (shellProgram

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。