Nachos java版学习(一)
最近,操作系统课程设计使用伯克利大学的Nachos做为实验平台,老师也照搬伯克利的Project要求,开始我们的操作系统课程设计。
结合自己的学习过程和课设要求,我觉得对Nachos的学习首先应该从KThread.java入手,首先应该看明白这个类的所有函数的意思。
这个主要是为第一个proj,实现join()函数做准备。 Join()方法的含义:当前线程a在运行,执行b.join(),则a阻塞,直到线程b结束,a继续执行。
具体的要求有:Join函数的作用即为等待某线程运行完毕。当前线程 (唯一一个正在运行的线程) A调用另一个线程 (处于就绪状态) B的join函数时 (A 和 B 在Nachos中均为KThread类型对象),A被挂起,直到B运行结束后, join函数返回,A才能继续运行。注意在一个KThread对象上只能调用一次join,且当前线程不能对自身调用join。Waits for this thread to finish. If this thread is already finished, return immediately. This method must only be called once; the second call is not guaranteed to return. This thread must not be the current thread.
public void join() {
Lib.debug(dbgThread, "Joining to thread: " + toString());
// 等待另外一个线程结束的这个线程不能是线程自己
Lib.assertTrue(this != currentThread);
if (this.status == statusFinished)
return;
boolean intStatus = Machine.interrupt().disable();
if (joinQueue == null) {
joinQueue = ThreadedKernel.scheduler.newThreadQueue(true);
// Notify this thread queue that a thread has received access,without going through request() and nextThread()
joinQueue.acquire(this);
}
// Notify this thread queue that the specified thread is waiting for
// access
joinQueue.waitForAccess(currentThread);
KThread.sleep();
Machine.interrupt().restore(intStatus);
}
为此,我设置了一个KThread的队列joinQueue,当B调用join函数时,将正在执行的A线程放入joinQueue,只有在B执行完后,在finish()里面会将队列中的A线程状态变为ready,从而继续执行A线程,具体finish()实现的代码如下:
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 joinedKThread;
if (currentThread.joinQueue != null)
while ((joinedKThread = currentThread.joinQueue.nextThread()) != null)
joinedKThread.ready();
sleep();
}
后续测试程序如下:
package nachos.threads;
import nachos.machine.*;
public class KThreadTest {
public KThreadTest() {
}
public static void simpleJoinTest() {
KThread A_thread = new KThread(new KThreadTest.A_thread(5));
KThread B_thread = new KThread(new KThreadTest.B_thread(A_thread));
B_thread.fork();
B_thread.join();
}
public static class B_thread implements Runnable {
B_thread(KThread joinee) {
this.joinee = joinee;
}
public void run() {
System.out.println("B_thread 就绪");
System.out.println("Forking and joining A_thread...");
this.joinee.fork();//Causes this thread to begin execution.
this.joinee.join();//启动a线程,阻塞b线程
System.out.println("B_thread 执行结束");
}
private KThread joinee;
}
public static class A_thread implements Runnable {
A_thread(int num) {
this.num = num;
}
public void run() {
System.out.println("A_thread 就绪");
System.out.println("A_thread开始执行");
// This should just kill some cycles
for (int i = 0; i < this.num; ++i) {
System.out.println("A_thread 循环 第" + i + " 次");
KThread.currentThread().yield();
}
System.out.println("A_thread 执行结束");
}
private int num;
}
}
Nachos java版学习(一)的更多相关文章
- Nachos java版学习(二)
threads.Lock类 提 供 了 锁 以 保 证 互 斥. 在 临 界 代 码 区 的 两 端 执 行 Lock.acquire()和Lock.release()即可保证同时只有一个线程访问临界 ...
- 20165234 [第二届构建之法论坛] 预培训文档(Java版) 学习总结
[第二届构建之法论坛] 预培训文档(Java版) 学习总结 我通读并学习了此文档,并且动手实践了一遍.以下是我学习过程的记录~ Part1.配置环境 配置JDK 原文中提到了2个容易被混淆的概念 JD ...
- 《单元测试之道》Java版学习日志
在软件工程这门课程中,首先谈单元测试的概念,单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的.很明确的功能是否正确.通常而言,一个单元测试是用于判断某个特定条件或某个特定函数的行为.我们 ...
- 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL
周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...
- Java Web 学习路线
实际上,如果时间安排合理的话,大概需要六个月左右,有些基础好,自学能力强的朋友,甚至在四个月左右就开始找工作了.大三的时候,我萌生了放弃本专业的念头,断断续续学 Java Web 累计一年半左右,总算 ...
- PetaPojo —— JAVA版的PetaPoco
背景 由于工作的一些原因,需要从C#转成JAVA.之前PetaPoco用得真是非常舒服,在学习JAVA的过程中熟悉了一下JAVA的数据组件: MyBatis 非常流行,代码生成也很成熟,性能也很好.但 ...
- 20145213《Java程序设计学习笔记》第六周学习总结
20145213<Java程序设计学习笔记>第六周学习总结 说在前面的话 上篇博客中娄老师指出我因为数据结构基础薄弱,才导致对第九章内容浅尝遏止地认知.在这里我还要自我批评一下,其实我事后 ...
- 【Head-First设计模式】C#版-学习笔记-开篇及文章目录
原文地址:[Head-First设计模式]C#版-学习笔记-开篇及文章目录 最近一年断断续续的在看技术书,但是回想看的内容,就忘了书上讲的是什么东西了,为了记住那些看过的东西,最好的办法就是敲代码验证 ...
- python实现文章或博客的自动摘要(附java版开源项目)
python实现文章或博客的自动摘要(附java版开源项目) 写博客的时候,都习惯给文章加入一个简介.现在可以自动完成了!TF-IDF与余弦相似性的应用(三):自动摘要 - 阮一峰的网络日志http: ...
随机推荐
- NetworkX系列教程(10)-算法之二:最小/大生成树问题
小书匠 Graph 图论 重头戏部分来了,写到这里我感觉得仔细认真点了,可能在NetworkX中,实现某些算法就一句话的事,但是这个算法是做什么的,用在什么地方,原理是怎么样的,不清除,所以,我决定 ...
- 第二次作业社团UML图
第二次作业 UML图 用例图: 时序图: 申请加入社团 学生可以在页面投递社团加入申请,送交给社团管理员审批 社团活动审批 团委通过社团提交胡活动进行审批 评价活动 社团活动举行完,会有相应的团委和学 ...
- [APIO2018]铁人两项——圆方树+树形DP
题目链接: [APIO2018]铁人两项 对于点双连通分量有一个性质:在同一个点双里的三个点$a,b,c$,一定存在一条从$a$到$c$的路径经过$b$且经过的点只被经过一次. 那么我们建出原图的圆方 ...
- NOIP提高组历年真题题解
2018 铺设道路 差分水题,推一下结论就好了. #include<cstdio> #include<algorithm> using namespace std; ],d[] ...
- LeetCode 第 152 场周赛
一.质数排列(LeetCode-1175) 1.1 题目描述 1.2 解题思路 先统计出1-n中有多少个质数,得到质数个数\(x\),剩下的数\(y = n - x\): 使用排列组合公式得出结果 \ ...
- Go by Example-图解数组
基本概念 1.数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形.字符串或者自定义类型. 2.在 Go 中因为数组的内存布局是连续的,所以可以通过索引(位置 ...
- Android数据绑定DataBinding(一)入门篇
早上看到了一篇推文"还在使用繁琐的findViewById,跟着尝试了一下DataBinding,之前使用ButteKnife就已经干掉了findViewById.因为写过微信小程序,那种在 ...
- js回车键事件
js回车键事件 一.总结 一句话总结: $("#focus").keypress(function(event){if(event.which === 13) { /*点击回车要执 ...
- Logback 输出 JPA SQL日志 到文件
Logback 输出 JPA SQL日志 到文件 使用Spring Boot 配置 JPA 时可以指定如下配置在控制台查看执行的SQL语句 spring.jpa.show-sql=true Sprin ...
- wordpress插件开发流程梳理
1.声明一个插件 首先我们必须明白,wordpress的插件可以是单文件,也可以是多文件,css/html都不是必须的,以下举例暂且在单文件模式下 比如我们要创建一个名为 hellophp的插件,那我 ...