ImageVerifierCode 换一换
格式:DOCX , 页数:5 ,大小:22.21KB ,
资源ID:3903750      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3903750.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Nachos源码分析与补充完善.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Nachos源码分析与补充完善.docx

1、Nachos源码分析与补充完善山东科技大学信息学院 eagle_ 姓 名 XXX 学 号 20060105XXXX 班 级 计算机(计算机科学方向)06-2班 指导教师 X X 撰写日期 2009年1月1日 山东科技大学信息学院 eagle_ . 31、概述 . 32机器模拟 . 43进程管理 . 83.1 Nachos进程概述 . 83.2 线程运行与切换 . 124. CPU调度 . 145. 用户程序的运行 . 166.系统调用 . 18Nachos . 201.系统调用部分 . 202. 进程调度部分 . 24 山东科技大学信息学院 eagle_ 一、 1 Nachos(全称为Not

2、Another Completely Heuristic Operating System)是加州大学伯克利分校开发的教学用操作系统。作为教学用操作系统,Nachos实现简单并且尽量缩小与实际操作系统之间的差距,目的是为了向学生展示一个相对真实的操作系统的内部结构及其实现方式。它有几个突出的特点: 85 采用虚拟机实现 Nachos是建立在一个软件模拟的虚拟机之上的,模拟了MIPS R2/3000的指令集、主存、中断系统、网络以及磁盘系统等操作系统所必须的硬件系统。许多现代操作系统大多是先在用软件模拟的硬件上建立并调试,最后才在真正的硬件上运行。用软件模拟硬件的可靠性比真实硬件高得多,不会因为

3、硬件故障而导致系统出错,便于调试。虚拟机可以在运行时报告详尽的出错信息并统计系统运行情况。 85 可以方便扩展 Nachos不是向学生展示一个成功的操作系统,而是让学生在一个框架下进行扩展。例如一个完整操作(例如Unix)的进程管理机制是很复杂的,但是总的来说,就是需要实现进程调度以及进程同步和互斥、进程间通信等机制以及与其有关的重要数据结构的维护。Nachos中实现这些内容的大部分,但是在很多方面作了一定的限制,比如只实现了FIFO的调度算法、缺乏进程间通信等,学生可以运用操作系统的相关知识去完善Nachos,逐步消除这些限制。 易于理解 Nachos的主体是用C实现的。利用面向对象语言的抽

4、象性,它能够清楚地描述操作系统各个部分的接口。Nachos没有用到面向对象语言的所有特征,如继承性、多态性等,所以它的代码就更容易阅读和理解。 除了运行在虚拟机上以外,Nachos和真实的操作系统相比还有几点不同。 首先是不确定性,Nachos是在宿主机上运行的进程,在本质上是一个程序,因此在同样的输入顺序、输入参数的情况下,Nachos运行的结果是完全一样的,山东科技大学信息学院 eagle_ 不会有硬件错误的干扰。这样可以让使用者将注意力集中在程序代码上,而不受操作系统不确定性的干扰。但是不确定性是操作系统所必须具有的特征,Nachos采用了随机因子模拟了真实操作系统的不确定性。其次,Na

5、chos中的时间是虚拟的,它利用一个Timer类模拟了真正的时间,通过增加计数变量的值实现时钟的前进,它的时间是跳跃的,而真实操作系统中的时间利用了石英晶振,因而是连续的(相对于我们的感受而言)。 图1.1是Nachos的基本结构,下面分别介绍Nachos的架构和已实现的功能,包括机器模拟、进程管理、系统调用、虚拟内存和文件系统。 NachosFileSystemStatusInterruptMachineTimerSynchDiskPostOfficeSchedulerThread图1.1 2 Nachos只是运行在宿主操作系统以及宿主机器上的一个进程,这个进程包含了系统内核、MIPS指令集

6、代码和虚拟机,在其上可以运行用户程序。相比系统内核运行于宿主机的内存中,用户程序运行于Nachos 模拟出的内存中。 如上所述,Nachos 的虚拟机模拟了一台计算机的基本部分,如CPU、主存、寄存山东科技大学信息学院 eagle_ 器、中断系统,还包括一些外部设备,如终端设备、网络以及磁盘系统。下面对机器模拟部分的各个类和数据结构作分析说明。 Machine Machine类用来模拟计算机主机,提供了一些基本功能,部分属性和接口函数如下: void Run 运行一个用户程序, char mainMemory int registersNumTotalRegs 模拟主存和寄存器组 int Re

7、adRegisterint num void WriteRegisterint num int value 读/写寄存器 void Debugger bool singleStep 用户程序调试(汇编级)和调试标志 Interrupt Interrupt类用来模拟硬件中断系统。主要数据结构如下: enum IntStatus IntOff IntOn 中断状态,有IntOn(开),IntOff(关)两种, enum MachineStatus IdleMode SystemMode UserMode 中断类型,有TimerInt(时钟中断) DiskInt(磁盘中断) ConsoleWrite

8、Int ConsoleReadInt (控制台读/写中断)NetworkSendIn t(网络发送) NetworkRecvInt(网络接收)。 山东科技大学信息学院 eagle_ enum IntType TimerInt DiskInt ConsoleWriteInt ConsoleReadInt NetworkSendInt NetworkRecvInt 机器状态,有 SystemMode(内核) UserMode(用户)和IdleMode(空闲)。 中断系统提供的接口如下: IntStatus SetLevelIntStatus level /开/关中断 MachineStatus g

9、etStatus return status void setStatusMachineStatus st status st 读/写机器状态 Interrupt:ScheduleCallBackObj toCall int fromNow IntType type 生成一个中断放入中断队列 和Interrupt类密切相关的是PendingInterrupt类,它的构造函数如下 PendingInterrupt:PendingInterruptCallBackObj callOnInt int time IntType kind callOnInterrupt callOnInt when t

10、ime type kind 它的作用是生成一个即将发生的中断,其中callOnInt指出了中中断发生时需要调用的虚拟硬件,when指出了中断发生的时间,type指出中断类型。 Interrupt 类还有一个数据结构SortedListltPendingInterrupt gt pending 它是一个中断等待队列,记录了即将发生的中断,Nachos的中断在两个时刻被处理 当机器时钟前进时和系统处于Idle时,两个中断处理的过程分别如图 1.2 和图1.3所示,山东科技大学信息学院 eagle_ 关中断中断队列为空否取出队列中一个中断并调用其处理函数处理中断开中断是需要context switc

11、hcontext switch是否结束图1.2 关中断中断队列为空否取出队列中一个中断并调用其处理函数处理中断开中断是调整系统时间至第一个等待中断要发生的时间退出系统有其它中断是否结束 图1.3 这样,以中断系统为基础,加上指令解释,就可以实现进程管理、文件系统管理、虚拟内存、用户程序和网络管理等所有操作系统功能,图1.4展示了Nachos系统的整体结构。 图1.4 在Nachos中时钟中断还担负了进程调度的任务,因此对时钟类Timer进行分析。该模块的作用是模拟时钟中断。Nachos虚拟机可以如同实际的硬件一样,每隔一定的时间会发生一次时钟中断。如果运行Nachos时指定-rs参数启动时钟中

12、断,在每次的时钟中断处理的最后就会进行线程的切换。但是正如概述中提到的,这种进程调度是不完山东科技大学信息学院 eagle_ 善的,如果系统就绪进程不止一个的话,每次时钟中断都一定会发生进程的切换。所以运行Nachos时,如果以同样的方式提交进程,系统的结果将是一样的。这不符合操作系统的运行不确定性的特性。所以在模拟时钟中断的时候,加入了一个随机因子,如果该因子设置的话,时钟中断发生的时机将在一定范围内是随机的。这样有些用户程序在同步方面的错误就比较容易发现。但是这样的时钟中断和真正操作系统中的时钟中断将有不同的含义。不能象真正的操作系统那样通过时钟中断来计算时间等等。是否需要随机时钟中断可以

13、通过设置选项-rs来实现。 3 3.1 Nachos Nachos广泛采用线程的概念,线程是Nachos处理机调度的单位,在Nachos中线程分成两类,一类是系统线程,只运行核心代码的线程,它运行在核心态下,并且占用宿主机的资源,系统线程共享Nachos操作系统本身的正文段和数据段。 Nachos的另一类线程同Nachos中的用户进程有关。Nachos中用户进程由两部分组成,核心代码部分和用户程序部分。每当系统接收到生成用户进程的请求时,首先生成一个系统线程,该线程的作用是给用户程序分配虚拟机内存空间,并把用户程序的代码段和数据段装入用户地址空间,然后调用解释器解释执行用户程序;由于Nacho

14、s模拟的是一个单机环境,多个用户进程会竞争使用Nachos唯一的处理机资源,所以在Nachos用户进程的进程控制块中增加有虚拟机运行现场空间以及进程的地址空间指针等内容,保证用户进程在虚拟机上的正常运行。 在图2.1中可以看出,系统线程竞争使用宿主机的CPU资源,而用户进程的用户程序部分竞争使用的是虚拟机的CPU和寄存器。所以用户进程在被切换下处理机时,需要保存其系统线程部分的现场,同时还需要保存虚拟机部分的现场。 系统线程 系统线程 系统线程 系统线程 用户程序 用户进程 系统线程 用户程序 系统线程 用户程序 图2.1 山东科技大学信息学院 eagle_ Nachos中的进程有以下几个部分

15、构成, Address space(地址空间),包括进程可以访问的所有内存空间,为进程所独占,只有内核线程会共享系统的代码段和数据段,用户线程之间不会有课本上讲的那种共享块,但是用户线程的核心部分依然共享系统的资源。地址空间进一步可以被细分为可执行代码、堆和栈。主线程和所有的子线程共享进程的可执行代码部分,但是每个线程都有自己的堆栈空间和寄存器,用于保存运行状态。 Registers寄存器组,包括PC指针、堆栈指针和其它寄存器。 Executable code Heap Stack . Executable code Heap Stack . . 线程状态,共有4个状态,如图2.2所示。 JU

16、ST_CREATED 当刚刚被创建时,线程在构造函数中状态被初始化为JUST_CREATED; JUST_CREATEDREADY 进程被创建后进入READY状态等待分配处理机资源; READYRUNNING 得到处理机资源后进程转至RUNNING状态运行; RUNNINGREADY如果允许时钟中断,每次时钟中断发生时,会强制当前运行的进程放弃处理机回到READY状态; RUNNINGBLOCKED 当需要I/O等操作或者发生了其它产生阻塞的操作(例如信号量的wait)时,进入BLOCKED状态; BLOCKEDREADY 引发阻塞的事件发生后进程返回READY状态。 运行结束后,进程需要释放

17、其占用的机器资源。由于Nachos中没有相关守护进程,因此进程结束时仅仅是用一个Thread类型的指针ToBeDestoryed指向自身,下一个得到处理机的进程将检测ToBeDestoryed,如果不为空,则进行资源的回收工作。 而且,Nachos中只有一个记录等待状态进程的队列ReadyList,没有数据结构去维护全部进程,处于其它状态的进程全部游离在系统中。当等待队列为空时,系统转入Idle状态,如果此时也没有将要发生的中断,则系统将退出。这里有一个BUG,因为ReadyList为空时,并不代表系统中已经没有了需要处理的进程,系统将有可能错误地推出而不被检测出来。 Process1 Pro

18、cess2 图2.2 山东科技大学信息学院 eagle_ Nachos的线程通过Thread类来实现,Thread类的属性定义如下: enum ThreadStatus JUST_CREATED RUNNING READY BLOCKED 定义线程状态 int stackTop 栈顶指针 void machineStateMachineStateSize 虚拟机寄存器组,用于内核线程,保存运行时的寄存器值 ThreadStatus status 线程状态 int userRegistersNumTotalRegs 用户寄存器组,用于用户线程 AddrSpace space 线程地址空间 对线程

19、的主要操作方法如下: void Thread:ForkVoidFunctionPtr func void arg Interrupt interrupt kernel-gtinterrupt Scheduler scheduler kernel-gtscheduler IntStatus oldLevel StackAllocatefunc arg oldLevel interrupt-gtSetLevelIntOff scheduler-gtReadyToRunthis void interrupt-gtSetLeveloldLevel 主要功能:在初始化之后将线程设置为可运行的并等待处理机

20、。 实现方法: 1. 设置新线程共享Nachos的代码段和数据段 2.为新线程分配私有的栈空间 3.关中断 初启态 就绪态 运行态 阻塞态 处理机调度运行 被迫放弃处理机 初始化结束 等待某事件发生 等待的事件发生 运行结束 图2.3 山东科技大学信息学院 eagle_ 4.新线程插入等待队列 5.开中断 Void Thread:Yield Thread nextThread IntStatus oldLevel kernel-gtinterrupt-gtSetLevelIntOff ASSERTthis kernel-gtcurrentThread DEBUGdbgThread quotYi

21、elding thread: quot ltlt name nextThread kernel-gtscheduler-gtFindNextToRun if nextThread NULL kernel-gtscheduler-gtReadyToRunthis kernel-gtscheduler-gtRunnextThread FALSE void kernel-gtinterrupt-gtSetLeveloldLevel 主要功能:强制主调线程放弃处理机并切换到下一个进程。 实现方法: 关中断当前进程正在运行是中断队列为空取出队首进程否将当前进程放入等待队列运行取出的进程开中断否报错退出结

22、束 Void Thread:Sleep bool finishing Thread nextThread 山东科技大学信息学院 eagle_ ASSERTthis kernel-gtcurrentThread ASSERTkernel-gtinterrupt-gtgetLevel IntOff DEBUGdbgThread quotSleeping thread: quot ltlt name status BLOCKED while nextThread kernel-gtscheduler-gtFindNextToRun NULL kernel-gtinterrupt-gtIdle / n

23、o one to run wait for an interrupt / returns when its time for us to run kernel-gtscheduler-gtRunnextThread finishing 主要功能:线程由于某种原因进入阻塞状态等待一个事件的发生(信号量的V操作、开锁或者条件变量的设置)。当这些条件得到满足,该线程恢复就绪状态。 实现方法: 设置进程状态为BLOCKED等待队列为空取出队首进程并运行否运行取出的进程系统进入IDLE状态是结束 3.2 Nachos借助于宿主机的context switch 实现这一部分的功能,由于需要直接访问宿主机的

24、寄存器,这部分代码采用汇编语言实现。 在Nachos的threads文件夹下有一个名为switch.s的汇编文件, Nachos可以运行如DECMIPS、ALPHA、SPARC、PARISC、x86、PowerPC的在多种机器上,不同机器的寄存器数目和作用不一定相同,所以针对不同的机器switch.s中进行了不同的处理。如果需要将Nachos移植到其它机器上,就需要修改这部分的内容。 但是不论是哪一种机器,Nachos都为其定义了两个函数,ThreadRoot和SWITCH,ThreadRoot在线程第一次被切换入处理机时由SWITCH函数调用,声明如下: ThreadRootInitialP

25、C InitialArg WhenDonePC StartupPC InitialPC指向线程的入口函数地址,InitialArg指向入口函数的唯一参数,山东科技大学信息学院 eagle_ WhenDonePC指向线程结束时需要调用的函数地址在这里为Thread:Finish, StartupPC指向线程的初始化函数地址,在这里为中断允许操作。在Thread类的StackAllocate函数中的如下代码初始化了这几个指针的值。 machineStatePCState voidThreadRoot machineStateStartupPCState voidThreadBegin machin

26、eStateInitialPCState voidfunc machineStateInitialArgState voidarg machineStateWhenDonePCState voidThreadFinish StackAllocate同时设置PC指针,把ThreadRoot的入口地址赋给SWITCH函数的返回地址,以保证第一次切换该线程时ThreadRoot函数会被调用,X86部分的赋值代码如下 ifdef x86 stackTop stack StackSize - 4 / -4 to be on the safe side -stackTop int ThreadRoot s

27、tack STACK_FENCEPOST endif ThreadRoot函数依次执行StartupPC 、InitialPC和 WhenDonePC,实现线程的运行。函数的X86部分有如下代码实现这部分功能: ThreadRoot: pushl ebp movl espebp pushl InitialArg call StartupPC call InitialPC call WhenDonePC / NOT REACHED / movl ebpesp popl ebp ret SWITCH函数的声明如下: SWITCHoldThread newThread 它在Scheduler类(实现

28、CPU调度,分析见 4.CPU调度)的Run函数中被调用,使运行的线程由oldThread转为newThread。切换流程如下: 山东科技大学信息学院 eagle_ 保存oldThread的运行状态设置返回地址装入newThread的运行状态设置返回地址在newThread的栈空间上运行返回 4. CPU Nachos中CPU调度在Schedular类中实现,同实际操作系统不同的是,调度的直接对象是线程,而不是以进程为单位。其最重要的一个数据结构是一个等待队列,定义如下: ListltThread gt ReadyList 在这里它被当作一个FIFO的队列使用,每次调度时将当前线程放入队尾并vong对首取出将要运行的线程。因此,Nachos仅仅实现了先进先出的简单调度,由方法FindNextToR

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1