最近,操作系统课程设计使用伯克利大学的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版学习(一)的更多相关文章

  1. Nachos java版学习(二)

    threads.Lock类 提 供 了 锁 以 保 证 互 斥. 在 临 界 代 码 区 的 两 端 执 行 Lock.acquire()和Lock.release()即可保证同时只有一个线程访问临界 ...

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

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

  3. 《单元测试之道》Java版学习日志

    在软件工程这门课程中,首先谈单元测试的概念,单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的.很明确的功能是否正确.通常而言,一个单元测试是用于判断某个特定条件或某个特定函数的行为.我们 ...

  4. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  5. Java Web 学习路线

    实际上,如果时间安排合理的话,大概需要六个月左右,有些基础好,自学能力强的朋友,甚至在四个月左右就开始找工作了.大三的时候,我萌生了放弃本专业的念头,断断续续学 Java Web 累计一年半左右,总算 ...

  6. PetaPojo —— JAVA版的PetaPoco

    背景 由于工作的一些原因,需要从C#转成JAVA.之前PetaPoco用得真是非常舒服,在学习JAVA的过程中熟悉了一下JAVA的数据组件: MyBatis 非常流行,代码生成也很成熟,性能也很好.但 ...

  7. 20145213《Java程序设计学习笔记》第六周学习总结

    20145213<Java程序设计学习笔记>第六周学习总结 说在前面的话 上篇博客中娄老师指出我因为数据结构基础薄弱,才导致对第九章内容浅尝遏止地认知.在这里我还要自我批评一下,其实我事后 ...

  8. 【Head-First设计模式】C#版-学习笔记-开篇及文章目录

    原文地址:[Head-First设计模式]C#版-学习笔记-开篇及文章目录 最近一年断断续续的在看技术书,但是回想看的内容,就忘了书上讲的是什么东西了,为了记住那些看过的东西,最好的办法就是敲代码验证 ...

  9. python实现文章或博客的自动摘要(附java版开源项目)

    python实现文章或博客的自动摘要(附java版开源项目) 写博客的时候,都习惯给文章加入一个简介.现在可以自动完成了!TF-IDF与余弦相似性的应用(三):自动摘要 - 阮一峰的网络日志http: ...

随机推荐

  1. (4)打鸡儿教你Vue.js

    模板语法: <div id="app"> <p>{{ message }}</p> </div> html 使用 v-html 指令 ...

  2. 微信小程序客服系统

    微信公众平台 点击 客服 添加 微信文档-接收消息和事件   在页面中使用 第三方客服系统 芝麻小客服 填写对应的 appid && AppSecret 等信息 微信文档-接收消息和事 ...

  3. Windows10+Jupyter notebook+添加核

    链接:https://blog.csdn.net/ZWX2445205419/article/details/80113472 1. 安装Anaconda   2. 创建虚拟环境   > con ...

  4. E【中】假的字符串(trie+拓扑排序)

    题目 E[中]假的字符串 做法 一个字符串能作为最小值最基础的条件为不能出现前缀字符串 我们需要确定一种每个字符的排名使得\(s\)作为最小值,另有很多字符串\(t\),与\(s\)第一个不相同的位置 ...

  5. [线性代数] 线性代数入门A Gentle Introduction

    An Overview: System of Linear Equations Basically, linear algebra solves system of linear equations ...

  6. scanf和fgets比较

    scanf 长度限制 #include<stdio.h> int main() { char food[5]; printf("Enter food"); scanf( ...

  7. [Linux] pwm设备驱动调试

    转载请注明出处:https://www.cnblogs.com/lialong1st/p/11436190.html CPU:RK3288 系统:Linux 客户需求是通过 pwm 控制激光的强弱,写 ...

  8. Lasso回归的坐标下降法推导

    目标函数 Lasso相当于带有L1正则化项的线性回归.先看下目标函数:RSS(w)+λ∥w∥1=∑Ni=0(yi−∑Dj=0wjhj(xi))2+λ∑Dj=0∣wj∣RSS(w)+λ∥w∥1=∑i=0 ...

  9. Coroutine 协程

    https://en.wikipedia.org/wiki/Coroutine Coroutines are computer program components that generalize s ...

  10. [插件式开发][C#]

    Demo 下载 参考文章:https://www.cnblogs.com/hippieZhou/p/9398354.html 技术方面要使用到 依赖注入,可以参考此示例逐步学习:https://git ...