最近,操作系统课程设计使用伯克利大学的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.

1 public voidjoin() {2

3 Lib.debug(dbgThread, "Joining to thread: " +toString());4 //等待另外一个线程结束的这个线程不能是线程自己

5 Lib.assertTrue(this !=currentThread);6

7 if (this.status ==statusFinished)8 return;9

10 boolean intStatus =Machine.interrupt().disable();11

12 if (joinQueue == null) {13 joinQueue = ThreadedKernel.scheduler.newThreadQueue(true);14 //Notify this thread queue that a thread has received access,without going through request() and nextThread()15 joinQueue.acquire(this);17 }18 //Notify this thread queue that the specified thread is waiting for19 //access

20 joinQueue.waitForAccess(currentThread);21 KThread.sleep();22 Machine.interrupt().restore(intStatus);23 }

为此,我设置了一个KThread的队列joinQueue,当B调用join函数时,将正在执行的A线程放入joinQueue,只有在B执行完后,在finish()里面会将队列中的A线程状态变为ready,从而继续执行A线程,具体finish()实现的代码如下:

1 public static voidfinish() {2 Lib.debug(dbgThread, "Finishing thread: " +currentThread.toString());3

4 Machine.interrupt().disable();5

6 Machine.autoGrader().finishingCurrentThread();7

8 Lib.assertTrue(toBeDestroyed == null);9 toBeDestroyed =currentThread;10

11 currentThread.status =statusFinished;12

13 KThread joinedKThread;14 if (currentThread.joinQueue != null)15 while ((joinedKThread = currentThread.joinQueue.nextThread()) != null)16 joinedKThread.ready();17 sleep();18 }

后续测试程序如下:

packagenachos.threads;import nachos.machine.*;public classKThreadTest {publicKThreadTest() {

}public static voidsimpleJoinTest() {

KThread A_thread= new KThread(new KThreadTest.A_thread(5));

KThread B_thread= new KThread(newKThreadTest.B_thread(A_thread));

B_thread.fork();

B_thread.join();

}public static class B_thread implementsRunnable {

B_thread(KThread joinee) {this.joinee =joinee;

}public voidrun() {

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 执行结束");

}privateKThread joinee;

}public static class A_thread implementsRunnable {

A_thread(intnum) {this.num =num;

}public voidrun() {

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 intnum;

}

}

nachos java_Nachos java版学习(一)相关推荐

  1. 20165234 [第二届构建之法论坛] 预培训文档(Java版) 学习总结

    [第二届构建之法论坛] 预培训文档(Java版) 学习总结 我通读并学习了此文档,并且动手实践了一遍.以下是我学习过程的记录~ Part1.配置环境 配置JDK 原文中提到了2个容易被混淆的概念 JD ...

  2. 微信公众号开发-Java版学习笔记

    微信公众号开发整体不难,主要是熟悉微信公众号常用的一些接口文档,然后会一门后端语言(比如java)即可. 罗召勇老师教程:微信公众号开发-Java版(蓝桥罗召勇) 微信公众号文档:微信公众号官方文档 ...

  3. WorldWind Java 版学习:1、启动过程

    一.JOGL使用介绍 使用 JOGL,需要构造GLCapabilities.GLCanvas 和 GLEventListener 的对象,其中 GLCapabilities 对象用于构造 GLCanv ...

  4. world wind java_WorldWind Java 版学习:1、启动过程

    一.JOGL使用介绍 使用 JOGL,需要构造GLCapabilities.GLCanvas 和 GLEventListener 的对象,其中 GLCapabilities 对象用于构造 GLCanv ...

  5. WorldWind Java 版学习:8、事件响应

    1.在 WWPanelImpl 构造时,会调用 createView 构造一个 View 对象,此处是 BasicOrbitView 对象,在构造 BasicOrbitView 对象的时候,会构造一个 ...

  6. WorldWind Java 版学习:10、服务器响应

    一.服务器处理请求过程 1.服务器启动时,会先读一系列配置文件,然后启动 SocketListener 进行监听 ApplicationServerLauncher.main(String[]) li ...

  7. worldwind java加载3ds_WorldWind Java 版学习:3、配置文件的读取

    1.在 WorldWindow 启动过程中,直接读取的配置文件有三个: 一个是在程序启动前,使用静态模块配置程序的配置文件 System.setProperty("gov.nasa.worl ...

  8. 数据结构与算法Java版学习教程,最适合新手入门(通俗易懂)

  9. Java编程思想第四版学习总结

    Java编程思想第四版学习总结 文章目录 Java编程思想第四版学习总结 第 1 章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 实现方案的隐藏 1.4 方案的重复使用 1.5 继承:重 ...

  10. 《游戏学习》Java版俄罗斯方块小游戏源码实战

    [Java版俄罗斯方块]     增加保存配置信息到文件的功能,声音设置.显示设置.关卡选择等配置信息在修改后将会保存在jar包同级目录下(以jar相同的文件名+.cfg后缀保存) [菜单选项]    ...

最新文章

  1. C++中最好不要在构造函数和析构函数中调用虚函数!!!
  2. 程序员,你得一条道走到黑!
  3. 推荐一个妹子,播报汽车新闻
  4. 根据二叉树前序遍历和中序遍历重建二叉树
  5. 如何在Windows上解决蓝牙问题
  6. 中考物理可不可以用计算机,不能用计算机?2021年起广州中考课目改为“4+4”...
  7. 磁盘建立swap分区,gpt分区和磁盘LUKS加密、配额
  8. 中小微企业一大重要数据解析|司法数据指标与报告维度
  9. c++ 三角函数_精准备考 | 初中数学三角函数知识点全归纳
  10. kafka监控工具Burrow安装
  11. 7)Thymeleaf 内联表达式、文本、JavaScript、CSS
  12. python读取内存指针_从dll读取内存值+指针+偏移量
  13. linux 防火墙添加6309端口,关于在linux下部署垂直集群的问题
  14. Ubuntu18.04配置视觉SLAM十四讲代码运行环境
  15. 计算机网络——数据包抓取与分析
  16. 有道单词本添加js实现自动阅读单词
  17. 《电磁场与电磁波》课程笔记(一)——矢量与坐标系
  18. 快手加抖音自动刷视频脚本,引用的是python+易语言编程
  19. android lrc歌词解析,Android解析lrc里的歌词
  20. Bug:数据库的有数据,但是查出来是0

热门文章

  1. 软件架构设计师-ER图-关系模型转换
  2. Unity中内嵌网页插件 UniWebView 2.8使用
  3. Android 第一行代码(第2版).pdf 网盘
  4. 【深度学习】PyCorrector中文文本纠错实战
  5. 时序逻辑电路的分析和设计
  6. 数据结构课程设计(二)---算术表达式求值
  7. 用Python执行SQL、Excel常见任务?10个方法全搞定!
  8. 计算机硬件基本常识面试,硬件工程师面试题集(含答案_很全)要点
  9. 商用密码产品认证-数字证书认证系统
  10. 01背包问题c语言,遗传算法的0-1背包问题(c语言)