操作系统课程设计报告_nachos_experiments_report(编辑修改稿)内容摘要:

re two string kernelmachineReadRegister(4) kernelmachineReadRegister(5) kernelmachineReadRegister(6) \n)。 int addressFour。 addressFour = kernelmachineReadRegister(4)。 int addressFive。 addressFive = kernelmachineReadRegister(5)。 char str1buffer[60]。 char str2buffer[60]。 int d,e。 d= 0。 e=0。 do{ kernelmachineReadMem(addressFour++,1,(int*)amp。 str1buffer[d++])。 }while(d60)。 addressFour。 do{ kernelmachineReadMem(addressFive++,1,(int*)amp。 str2buffer[e++])。 }while(e60)。 addressFive。 int n3。 n=SysStrncmp(str1buffer,str2buffer,kernelmachineReadRegister(6))。 kernelmachineWriteRegister(2,n3)。 /* Modify return point */ {/* set previous programm counter (debugging only)*/ kernelmachineWriteRegister(PrevPCReg, kernelmachineReadRegister(PCReg))。 /* set programm counter to next instruction (all Instructions are 4 byte wide)*/ kernelmachineWriteRegister(PCReg, kernelmachineReadRegister(PCReg) + 4)。 /* set next programm counter for brach execution */ kernelmachineWriteRegister(NextPCReg, kernelmachineReadRegister(PCReg)+4)。 }return。 ASSERTNOTREACHED()。 break。 4. Write( My shell ver \n, 21, output)。 if(Strncmp(buffer,exit,4)==0) { Halt()。 }5. .globl Strncmp .ent StrncmpStrncmp: addiu $2,$0,SC_Strncmp syscall j $31 .end Strncmp .globl Exit .ent Exit实验结果:执行命令 ./nachos –x ../test/参考文献:3.《 操作系统原理课程设计实验手册》4.《操作系统设计()》5.Baidu、Google 实验项目二项目名称:Nachos Thread实验目的:n 最多能够同时存在128个用户线程 n 改变为遵循“优先级调度”的抢占式调度 参与人员及分工: 韩 茂:代码编写,查资料 周博鑫:平台搭建,测试 赖 锋:代码编写,查资料 吕少飞:整合代码,编写报告实验背景知识: 线程基础知识:线程基本概念:是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。 一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。 由于线程之间的相互制约,致使线程在运行中呈现出间断性。 线程状态:就绪、阻塞和运行三种基本状态。 ,称为多线程. 线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,发挥利用,根据具体情况而定. 线程的运行中需要使用计算机的内存资源和CPU线程的周期 新建 就绪 运行 阻塞 死亡线程调度与优先级 有线程进入了就绪状态,需要有线程调度程序来决定何时执行,根据优先级来调度.线程组 每个线程都是一个线程组的一个成员,线程组把多个线程集成一个对象,也可以放在缺省的线程组中,不能被移出这个组.进程和线程的关系在引入线程机制后,进程不再是单一的动态实体,而是由两部分组成:􀁺 各线程活动的环境,包括:统一的地址控件、全局变量、打开文件和计时器等。 􀁺 若干个线程,它们是进程中的活动部分,也是处理机的调度单位,而进程不再是处理机的最小调度单位。 一个进程中的所有线程在同一地址空间中活动,共享该地址空间中的全局变量,共享打开文件和计时器等。 它们总是相互协作,各自承担一个作业中的某个部分。 与传统的进程相似,线程具有状态的变化。 通常,这些状态是:运行、阻塞、就绪或终止。 与进程和线程有关的主要信息表Nachos 广泛采用线程的概念,是多线程操作系统。 线程是Nachos 处理机调度的单位,在Nachos 中线程分成两类,一类是系统线程。 所谓系统线程是只运行核心代码的线程,它运行在核心态下,并且占用宿主机的资源,系统线程共享Nachos 操作系统本身的正文段和数据段;一个系统线程完成一件独立的任务,比如在Nachos 网络部分,有一个独立的线程一直监测有无发给自己的数据报。 Nachos 的另一类线程同Nachos 中的用户进程有关。 Nachos 中用户进程由两部分组成,核心代码部分和用户程序部分。 用户进程的进程控制块是线程控制块基础上的扩充。 每当系统接收到生成用户进程的请求时,首先生成一个系统线程,进程控制块中有保存线程运行现场的空间,保证线程切换时现场不会丢失。 该线程的作用是给用户程序分配虚拟机内存空间,并把用户程序的代码段和数据段装入用户地址空间,然后调用解释器解释执行用户程序;由于Nachos 模拟的是一个单机环境,多个用户进程会竞争使用Nachos 唯一的处理机资源,所以在Nachos 用户进程的进程控制块中增加有虚拟机运行现场空间以及进程的地址空间指针等内容,保证用户进程在虚拟机上的正常运行。 在下图中可以看出,系统线程竞争使用宿主机的CPU 资源,而用户进程的用户程序部分竞争使用的是虚拟机的CPU 和寄存器。 所以用户进程在被切换下处理机时,需要保存其系统线程部分的现场,同时还需要保存虚拟机部分的现场。 实验环境:Redhat Linux 实验内容:本项目在实践的过程中需要注意以下要点:Nachos中线程管理特点Nachos中线程管理特点1 线程个数没有限制 一般的操作系统,进程的数目是有限的,但是Nachos 中线程数目是无限的(没有限制)(当然,用户进程的数目应该也是有限的。 当虚拟机内存以及虚拟内存都耗尽时,就不能产生新的用户线程)。 因为线程的控制结构和系统线程的运行是占用宿主机的。 能够开多少线程完全由宿主机条件限制,理论上是无限的。 Nachos中线程管理特点2 线程调度简单 启动了时钟中断的情况下,当时钟中断到来时。 如果就绪线程队列中有就绪线程,就必须进行线程切换。 没有启动时钟中断的情况下,Nachos 使用非抢占式调度。 概念:非抢占式调度:进程在运行过程中不会切换到其它进程运行,除非其主动放弃处理机或者运行结束 抢占式调度:为了确保没有一个进程单独运行的时间太长,几乎所有的计算机系统都内置了时钟,周期性地进行时钟中断,在每一次时钟中断时,由进程调度程序负责判断是否有就绪进程比正在运行的进程更加适合占用CPU。 缺点:由于进程的运行有不可预见性,有可能一个进程会占用处理机达几个小时,甚至一个编写错误的进程会一直占用处理机不放,以致其他进程会被饿死。 Nachos中线程管理特点3 线程数据结构简单 Nachos中线程数据结构定义简单,没用户ID,线程ID,无法根据线程ID实现通信,同步互斥,也没有全局性的线程管理机制。 升级后,Nachos线程管理特点 1. Nachos中有了对线程数量的限制,最多同时存在128个用户线程。 2. Nachos中线程将以“优先级调度”的抢占式调度方式调度,即是,在中断发生时,查看就绪队列中等待的线程是否存在优先级较当前线程高的线程,有的话,就使其抢占CPU,不存在的话就并不切换进程 3. 通过真假一个“公共信箱”,总大小为4K,每封信大小为128byte,实现了两个进程的通信 实现方案由于限制了最多线程数,所以在Thread::Thread(构造函数)上加了信号量的判断处理:当threadnumEmpty()有效时,即还有空间可以创建新线程时才继续进行线程的构造,不然进入睡眠;当构造操作结束时,将threadnumFull()信号量激活,即内存中的线程数目加一。 当进行线程析构操作时,先判断threadnumFull(其实默认的认为此时该变量应该有效),结束之后对threadnumEmpty信号量进行更新,即可创建空间数目加一。 threadnumFull和threadnumEmpty变量的初始化是在系统初始化时进行的,此时threadnumFull的初始值为0;threadnumEmpty的初始值为MAX_THREAD_COUNT的值()。 threadnumMutex信号量()是用于记录系统的整个线程计数变量threadCount()的控制方面,即每当进行新线程的创建时,在Thread::thread构造函数中用该信号量进行限制,而且threadCount每次加一之后直接成为当前创建中的线程的线程ID。 优先级调度”的抢占式调度方式调度采用了时间片轮转法,并采用了动态优先权调用。 权限值的设置方式为该值最小的线程的优先级最高(因为List机制上可以实现取出参数值最小的单元)。 当线程创建时初始权限值设置成100(CreatePriority宏,),进入睡眠之后唤醒时的权限值为60(BlockedPriority宏,)。 线程切换的最小时间间隔设置于MinSwitchPace宏(),使得防止频繁的线程切换。 每当时钟中断发生时,将当前的优先级值进行调整,公式为 priority = priority +(当前时间lastSwitchTick)/PriorityRate (注:PriorityRate宏值设为20)。 再进行就绪队列中线程的权限值都增加AdaptPace(设为5)。 取出下一个线程的成员函数FindNextToRun中的思路为: 当该操作是发生于上一个线程结束后的话,简单的取出就绪队列中的第一个元素;不然,进行与当前进程进行优先级比较,当取出来的线程优先级高时才进行切换。 ,进程互相访问系统中开辟长度为4k的空间用作邮箱,每个邮箱的状态由Mail类来负责,读写操作以及其之后其处理由TransportMail和Accept函数来负责。 Thread中设置了两个成员函数SendMail和ReceiveMail,以及一个所收到的消息队列mailList成员变量。 当线程调用SendMail来进行送消息时,先判断有没有空箱,以及有没有先到地写者,之后再利用Transport来进行具体操作。 Transport的流程为先得到空箱位置,在那儿保存该信息之后,通过就绪队列中的搜索,给收信者的消息队列里添加该邮箱号码,此时要使没有找到收信者线程,则认为该消息为垃圾信息,将它删掉;若成功,则将与该邮箱对应的Mail对箱上设置为满的。 当线程调用来接受消息时,将取出自己消息队列中的第一个邮箱号码,然后用AcceptMail函数读入消息,再进行对应邮箱数据的修改。 (一) 要求一相关函数1) 函数Initialize()——功能描述:初始化nachos虚拟机 入口参数:无 返回值:无 函数流程: 主流程与原来的函数一样。 添加了初始化变量threadnumMutex, threadnumEmpty, threadnumFull, threadCount的步骤。 2) 构造函数Thread::Thread(char *threadName) 功能描述:Thread类的构造函数 入口参数: char * ――线程名 返回值:无 函数。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。