nachos操作系统初步认识
一、Nachos总体描述
1.1 Nachos虚拟机
Nachos模拟一个真实的CPU和硬件设备,包括中断和内存管理。Java中的包nachos.machine提供了这个模拟器。
Nachos模拟器用nachos.conf文件安装在不同的工程上。它详细描述了模拟器中包含哪些硬件设备和Nachos内核如何使用硬件。工程的说明书包括适当的配置文件,如果必要的话,可以改动工程的宣传册文件需要完成这个工程。
Nachos的启动进程类似于真实的虚拟机。nachos.machine.Machine.class的一个实例用来启动Nachos。计算机硬件(虚拟机类)首先初始化设备包括中断控制器,定时器,电梯控制器,MIPS进程,和文件系统。
虚拟机类对象把控制权交给特定的自动分级AutoGrader装置,相当于从硬盘上载入启动引导程序的代码。是AutoGrader产生了Nachos内核,并开始运行系统。学生们不必关心这一步启动工作,真正有趣的部分从内核开始。
Nachos的内核仅仅是nachos.machine.Kernal的一个子类。比如说,线程项目用的是nachos.threads.ThreadedKernel。
Nachos虚拟机包括很多硬件设备。有一些在现代计算机中普遍存在(如:网络接口),但有些(比如说电梯控制)是Nachos特有的。Machine文件中的大多数类是硬件模拟的一部分,而在machine文件之外的类是Nachos操作系统的。
Nachos中断管理是通过nachos.machine.Interrupt 类通过维持一个事件队列来模拟。
1.2 jdb的使用
在跟踪程序分析执行流程时仅仅使用System.out输出信息只能进行一些简单的验证,很难完成庞大工程的调试分析,这时候我用到了jdb来进行调试。jdb的主要命令包括:
run -- 开始运行程序
stop in 包.类.函数名 -- 设置在对应函数进入时触发的断点
stop at 包.类:行号 -- 设置在指定文件特定行的断点 print 变量名或者表达式 -- 输出变量或者经过运算的值 cont -- 在断点处理后继续执行 threads -- 显示正在运行的线程
suspend/resume id -- 挂起/恢复一个线程 thread tid -- 切换到特定线程
在进行多线程的调试时,要不断对线程进行跟踪,挂起原线程进入子线程,执行完毕后回到父线程,用jdb调试可以清晰的看到多线程的运行过程。
1.3 代码分析过程
下面是我对nachos运行过程的详细解读:
分析nachos脚本,发现脚本中有 java nachos.machine.Machine 找到machine.java
开始从main函数分析源代码 进入autoGrader.java
分析出selfTest进行演示,进程创建 进入Kernel.java
因为Kernel是一个抽象类,所以肯定有实现Kernel的实例
nachos.conf配置文件中包含Kernel.kernel = nachos.threads.ThreadedKernel 在threadedKernel.java中,找到selfTest() 进入Kthread.java
通过selfTest()找到PingTest
在PingTest里就包含了完整的运行proj1的信息
PingTest是继承runnable接口的类,runnable是一个Java中的接口
解读KThread.java代码: 解析KThread中的方法:
KThread():
创建线程时如果是第一个线程,即当前线程未空,就调用ThreadedKernel.scheduler 也就是nachos.threads.RoundRobinScheduler的newThreadQueue方法,并创建一个先进先出队列,并创建一个空闲线程,名为idle 如果当前线程非空,就创建线程控制块tcb();
setName(); 设置名字
getName(); 取得名字
toStirng(); 重写toString方法
compareTo(Object o); 线程之间通过线程id进行比较
fork()
导致线程开始执行,结果就是两个线程正在执行,一个是当前线程,一个是被执行的线程。
Finish()
结束当前线程并加入调度销毁线程,当一个线程的方法返回时自动执行该方法。如果当前的线程因为栈或者另一个之星状态一直在被使用不能被立即销毁,那么这个线程就会在其他线程运行时自动销毁。
Sleep()
由于当前线程结束或者阻塞,而放弃CPU;如果当前的线程被阻塞,一些线程会把它唤醒,然后将它加入就绪等待队列,这样它可以被重新调度了。或者是该线程结束,那么就调度此线程在下一个线程运行时销毁该线程。 调用sleep就可以让CPU切换给其他线程执行
ready()
将当前线程加入就绪队列,并将该线程的状态改为ready状态
run()
将这个线程放在CPU上执行,保存进程的当前状态并调用新线程,载入新线程的状态。新线程就成了当前线程,如果新线程与旧线程是相同的,这个方法必须被调用,之前运行的线程必须从运行状态转到阻塞或者就绪等待状态(取决语之前运行的线程在sleep状态还是yield状态)
二、Nachos中线程的运行机制
2.1 线程与TCB
1)KThread构造函数创建线程时创建TCB,若当前无线程时,创建第一个线程直接使用main线程执行并将tcb指向currentTCB。
2)当线程调用fork()方法,即在增加一个线程时调用tcb.start()
3)当线程调用run()方法,使CPU运行当前线程发生上下文切换时,调用
tcb.contextSwitch切换到新的线程
4)恢复运行环境时调用销毁被标记删除状态的tcb
2.2 线程调度
线程调度是通过队列控制的,队列决定线程切换顺序。 线程调度主要在文件KThread.java中
1)在系统创建第一个线程时创建线程队列readyQueue
2)每次创建线程时将线程加入队列
3)当线程状态为就绪时,在线程队列中标记为可以进入,加入等待队列waitQueue并等待调度
4)发生线程切换时,即调用yield()方法或sleep()方法时,将从线程队列中取下一个线程执行
5)每一个线程都有一个优先级,由调度器对线程的优先级进行增减,决定线程队列中线程的出队顺序。不同的调度器对于优先级控制的实现不同。
Schedule 分为RoundRobinSchedule,PriorityScheduler,LotteryScheduler。 RoundRobinSchedule为轮换调度调度器,使用FiFo队列 ;PriorityScheduler为带权优先调度器,根据线程执行时间、启动顺序等计算优先级 ; LotteryScheduler为彩票随机调度器,随机决定出队顺序,但是优先级高的线程被调用的概率更大。
2.3 线程的创建
创建一个线程时先创建线程TCB,指定线程名setName(),绑定Runnable对象 即使用调用tcb.start(new Runnable() { public void run() { runThread(); } });
内核创建第一个空闲线程时直接命名 main并设为当前线程。
tcb = TCB.currentTCB(); name = "main";
fork()方法启动新线程,具体过程是,保存cpu状态intStatus =
Machine.interrupt().disable(),调用TCB的start方法创建java线程执行到线
程切换 tcb.start();再恢复 cpu状态,同时引发新线程执行,若有多个线程则唤醒下一个线程。 对于创建的第一个线程直接使用main线程执行。
nachos操作系统初步认识相关推荐
- Nachos操作系统synch(lab3)
这一篇来讲一下Nachos里面的同步 首先,在synch.h里面,定义了三种与同步有关的类:Semaphore,Lock,Condition,下面来分析一下这三种数据类型 Semaphore 其类型定 ...
- nachos操作系统(一)
今天来了解一下整个系统的构成. nachos-3.4下有一个C++例子文件夹和一个code文件夹,code文件夹下才是程序的源码,总文件夹下的makefile呢,就是进入各个子文件夹,make他们自己 ...
- 大脑-计算机界面(bci,BrainOS人类大脑智能操作系统初步成果被展出
美国东部时间8月26日晚上10点,北京时间8月27日早上10点,哈佛创新实验室的华人脑机接口创业企业BrainCo在位于美国波士顿的哈佛大学展示了BrainOS人类大脑智能操作系统的初步成果. 据了解 ...
- 操作系统实验一:操作系统初步 实验报告
实验题目 一. (系统调用实验)了解系统调用不同的封装形式. 1.参考下列网址中的程序.阅读分别运行用API接口函数getpid()直接调用和汇编中断调用两种方式调用Linux操作系统的同一个系统调用 ...
- 【操作系统/OS笔记02】操作系统的历史、操作系统结构
本次笔记内容: 1.4 如何学习操作系统 1.5 操作系统的实例 1.6 操作系统的历史 1.7 操作系统结构 1.8 小结 文章目录 操作系统的大概分支 操作系统的历史和演变过程 操作系统结构 微内 ...
- Nachos系统简介
Nachos是一款教学用的操作系统平台,它的全名叫做"Not Another Completely Heuristic Operating System",Nachos的运行必须借 ...
- 操作系统高级课程-1
操作系统高级课程-1 声明 Course Introduction 系统能力培养 三个层次: 问题: 教学目的: 教学计划: 课程环节: 参考书: Nachos操作系统 e.g. 线程切换 Nacho ...
- 高分操作系统 第一章 操作系统概论
这是一篇大学课程--操作系统同步笔记,最后有期末大礼包!! [目录] 1.1 操作系统初步认识 1.2 操作系统的定义 1.3 操作系统的功能 1.所处位置:中间 2.发展动力 1.4 操作系统发展阶 ...
- 计算机基础我的课堂调控,计算机基础课堂析及实验安排.doc
计算机基础课堂析及实验安排 <计算机基础>实验课程分析与设计 该设计完全遵循实验教学大纲和考试大纲的要求,通过这些努力和尝试,旨在促进和理论课教师的配合和协调,实现对理论课知识点的巩固.验 ...
- 【访客必读 - 指引页】一文囊括主页内所有优质博客
前言 嘿!彩蛋!感觉有帮助就三连呗! 本人现为一名「机器学习」方向的研究生,本科专业为 CS,期间主要参与 ACM 竞赛,因此主页内的博客一共分为如下四类: 机器学习 ACM 各类算法详细解析 + 题 ...
最新文章
- 【翻译】Ext JS 6 Beta发布
- Day19-File操作-创建 删除,文件过滤
- 《统计学习方法》-李航、《机器学习-西瓜书》-周志华总结+Python代码连载(一)--模型选择+误差评估
- Z-Stack - Modification of Zigbee Device Object for better network access management
- 【Android休眠】之PowerKey唤醒源实现【转】
- paramiko -SSH学习
- jQuery banner切换插件
- Spring框架中的单例Bean是线程安全的吗?
- Linux shell编程中read参数说明
- Excel写入与保存openpyxl
- [转]MySQL游标特性
- oppo手机硬件测试软件,OPPO怎么测试手机硬件,只需要做这一步,进入工程模式...
- msm8996平台的 camera 框架笔记
- python正则表达式匹配数字和字母_只能输入数字和字母组合的正则表达式怎么写?...
- 应用程序无法正常启动(0xc000007b)解决办法
- oslo_messaging使用及测试
- final cut pro10.5 mac版支持M1芯片
- android的资源混淆,android混淆资源引发的血案以及学习感受资源混淆
- 加百利号角/托里拆利小号
- 掘金万亿母婴市场,宝宝树价值在哪里? | 一点财经