如果没有留言.ppt

如果没有留言.ppt

ID:49459795

大小:140.50 KB

页数:23页

时间:2020-02-05

如果没有留言.ppt_第1页
如果没有留言.ppt_第2页
如果没有留言.ppt_第3页
如果没有留言.ppt_第4页
如果没有留言.ppt_第5页
资源描述:

《如果没有留言.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、What’swrong?publicintlisten(){lock.acquire();if(!present)//如果没有留言empty.sleep();//则睡眠//取得留言intword=buffer;present=false;//唤醒正在等待发言的人full.wake();lock.release();returnword;}publicvoidspeak(intword){lock.acquire();if(present)//如果已有留言full.sleep();//则睡眠//留言buffer=word;present=true;//唤醒正在等

2、待接受留言的人empty.wake();lock.release();}WrongorNot?publicclassKThread{.../*Uniqueidentiferforthisthread.Usedtodeterministicallycomparethreads.*/privateintid=numCreated++;/*NumberoftimestheKThreadconstructorwascalled.*/privatestaticintnumCreated=0;...}HowtoReadcode?CaseStudy:KThread和TCB的

3、构造顺序分析一个KThread必然有一个TCB吗?每个TCB必然在运行一个KThread吗?先有第一个TCB,还有先有第一个KThread?KThread和TCB的构造顺序分析——先有鸡还是先有蛋?首先被构造出的是TCB,在Machine.main完成各种环境初始化后,最后一句写的是:newTCB().start(newRunnable(){publicvoidrun(){autoGrader.start(privilege);}});其实,autoGrader.start会构造一个Kernel的实例(根据Nachos.coff的设置,目前就是ThreadKe

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

5、tialize(String[]args){newKThread(null);//“newKThreadNo1”}检查整个工程,我们没有发现其他地方有这么写的,这么做的目的何在?我们需要看看KThread的构造函数干了什么:if(currentThread!=null){//currentThread是静态全局变量,//其初值默认为空tcb=newTCB();}else{//可见第一次进KThread()是执行这里…KThread和TCB的构造顺序分析——if(currentThread!=null)?…//接上else{readyQueue=Threaded

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

7、根据上述分析,“newKThreadNo1”和直觉上大相径庭,似乎改写成KThread.initialize();会更自然一点,那为何需要这么写?publicvoidinitialize(String[]args){newKThread(null);//是不是KThread.initialize();更自然?}(提示:currentThread=this这句话揭示了问题的答案)我们的目标是研究每个KThread是如何和一个TCB绑定并且运行起来的,“newKThreadNo1”没有给我们提供有用的东西。幸运的是,它的一个子过程:createIdleThread

8、引起了我们的注意:KThread和TC

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。