NachOS线程ID的实现、最大线程数的实现和优先级的添加_nachos线程调度调度时,线程的产生和调度须同时进行,并且要构建它们的线程家族树。-程序员宅基地

技术标签: c++  ubuntu  linux  后端  

NachOS线程ID的实现、最大线程数的实现和优先级的添加

1.实验目的

(1)通过阅读相关源码,掌握NachOS运行原理和编译方法;

(2)完善NachOS下线程描述的内容。

2.实验内容

(1)为NachOS线程添加线程ID,并设置系统最大线程数;

(2)为NachOS线程调度添加优先级,为实现基于优先级的调度做准备。

3.实验方法(实验步骤)

(1)理解NachOS线程的运行与调度原理,找到需要修改的代码(注:以下所有修改代码的部分,均是由vim修改完成);

(2)对thread.h进行修改:在头文件处定义线程最大数MAX_SIZE、状态数组Tstatus[]、当前线程数量值threadNUM;在私有区域定义变量tid线程号和priority优先级;在共有区域定义方法getid();

(3)对thread.cc进行修改:在原构造函数Thread::Thread(char* threadName)内进行修改,判断是否达到最大线程数,并记录每个线程的状态信息(名字、tid号、优先级值),最后输出;在测试函数Thread::SelfTest()内进行修改,创建线程一定数量的线程数组,使其调用原构造函数创建线程,同时输出每个线程的状态信息;

(4)对NachOS进行重新编译运行,观察运行结果。

4.实验过程

(1)在thread.h中增添线程的成员变量和成员方法,在头文件处:定义最大线程数MAX_SIZE为128(即规定最大线程数为128)、大小为MAX_SIZE的线程状态数组Tstatus[],同时初始化为0(状态为1时该线程号已被使用,状态为0时该线程号未被使用)、 当前线程数量值threadNUM初始化为0;在私有区域定义变量线程号tid、线程优先级priority(tid、priority均为每个线程独有的);在公共区域定义方法getName()返回每个线程的线程号,这里没有定义返回priority的方法,因为priority是在构造函数中进行赋值的,如下图所示:

在这里插入图片描述
在这里插入图片描述

(2)对thread.cc中的原构造函数进行修改:使用if判断语句判断下一次的线程数值(threadNUM)是否超过规定的最大值128(MAX_SIZE),如果超过则输出“最大线程数为128”,同时调用ASSERT()函数打断程序执行;如果未超过最大线程数则执行for循环语句:从i=0开始判断,直到判断出未被使用的线程号(Tstatus[i]==0),然后将i+1赋给该线程的tid,即this->tid=i+1(因为是从0开始循环判断的,所以tid需要加1),同时使用rand()函数产生了一个0到10的随机数赋给该线程的优先级priority,即this->priority=rand()%(11),之后将该线程的状态置为1,即Tstatus[i]=1,(该线程号已被使用了,所以将其状态置为1);在函数最后设置输出语句cout,调用getName()、getid()函数输出该线程的名字和tid号,同时输出该线程的优先级值this->priority(因为输出优先级值是直接输出的,就没有在thread.h中创建get方法),如下图所示:

在这里插入图片描述

(3)对thread.cc中的测试函数进行修改:在测试函数中定义一个大小为124的线程数组,然后for循环中每个元素都调用原构造函数创建线程,因为在程序运行中会产生另外四个线程,第一个是main线程,第二个是postal worker线程,第三和第四个是ping线程,所以在测试函数中创建124个线程加上原本的4个线程正好到达线程最大数128,如下图所示:

在这里插入图片描述

(4)对NachOS进行重新编译运行,观察运行结果,结果如下图所示:

在这里插入图片描述
在这里插入图片描述

注1:实验环境:Ubuntu14.04

注2:该实验只实现了:为NachOS线程添加线程ID,并设置系统最大线程数,同时添加线程的优先级,有关于线程的基于优先级的调度会在下一篇文章内实现。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_51846636/article/details/121323146

智能推荐

【愚公系列】2023年07月 Python自动化办公之win32com操作excel-程序员宅基地

文章浏览阅读6k次。python中能操作Excel的库主要有以下9种:本文主要针对win32com读取 写入 修改 操作Excel进行详细介绍win32com是Python的一个模块,它提供了访问Windows平台上的COM组件和Microsoft Office应用程序的能力。通过该模块,Python程序可以与Windows平台上的其他应用程序交互,例如实现自动化任务、自动化报告生成等功能。_win32com

sql审核工具 oracle,Oracle SQL Developer工具-程序员宅基地

文章浏览阅读326次。Oracle SQL Developer工具下载解压了Oracle SQL Developer工具,运行时,启动不了,报错信息如下:---------------------------Unable to create an instance of the Java Virtual MachineLocated at path:\jdk\jre\bin\client\jvm.dll--------..._开源oracle sql审核工具

百度实习面经2022-4-24(第一次面试,暂时只面了一场,感觉人无了)_百度实习面试-程序员宅基地

文章浏览阅读3.5k次。百度实习面经2022-4-26(第一次面试,只面了一场,感觉人无了)_百度实习面试

ipv6隧道穿越ipv4互联实验-程序员宅基地

文章浏览阅读142次。实验名称:ipv6隧道穿越ipv4互联实验实验目的:配置隧道让ipv6能穿越ipv4实现互联实验拓扑图: 实验详细配置步骤:R1Router>enRouter#conf tRouter(config)#line con 0Router(config-line)#logg syncRouter(config-line)#exitRouter(co...

Eclipse - Create a new Source File / Header File_eclipse新建源文件-程序员宅基地

文章浏览阅读576次。Eclipse - Create a new Source File / Header File_eclipse新建源文件

【C语言学习】数组名的实质-程序员宅基地

文章浏览阅读1.5k次,点赞14次,收藏15次。一般情况下,数组名的本质是数组首元素的地址,只有两种情况下,即遇到sizeof和&是数组名的代表的是整个数组。_数组名

随便推点

神经网络(优化算法)_nnet-程序员宅基地

文章浏览阅读1.2w次。神经网络(优化算法)人工神经网络(ANN),简称神经网络,是一种模仿生物神经网络的结构和功能的数学模型或计算模型。神经网络由大量的人工神经元联结进行计算。大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统。现代神经网络是一种非线性统计性数据建模工具,常用来对输入和输出间复杂的关系进行建模,或用来探索数据的模式。人工神经网络从以下四个方面去模拟人的智能行为:_nnet

<video>标签及属性说明_video标签-程序员宅基地

文章浏览阅读5.5w次,点赞56次,收藏300次。实例HTML <video> 标签一段简单的 HTML5 视频:<video src="video.mp4" controls="controls">您的浏览器不支持 video 标签。</video>属性性 值 描述 autoplay autoplay 如果出现该属性,则视频在就绪后马上播放。 controls controls 如果出现该属性,则向用户显示控件,比如播放按钮。 height_video标签

LRU算法四种实现方式介绍_lru 实现-程序员宅基地

文章浏览阅读2.3k次。LRU全称是LeastRecently Used,即最近最久未使用的意思。LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的数据淘汰。实现LRU1. 用一个数组来存储数据,给每一个数据项标记一个访问时间戳,每次插入新数据项的时候,先把数组中存在的数据项的时间戳自增,并将新数据项的时间戳置为0并插入到数组中。每次访问数组中的数据项的时候,将被访问的数据项的时间戳置为0。当数组空间已..._lru 实现

anaconda在cmd运行时报错OSError: [WinError 123] 文件名、目录名或卷标语法不正确解决办法_oserror: [winerror 123] 文件名、目录名或卷标语法不正确。: '"c:\\pr-程序员宅基地

文章浏览阅读3.4k次,点赞12次,收藏8次。在网上看到其他帖子说删除环境变量什么的,试了试并没有成功,后来发现环境变量里面有些变量写到一行里面了,只需要把这些环境变量变成一行一行的。比如我之前的环境变量是这样的。把它变成下面这样就好了。_oserror: [winerror 123] 文件名、目录名或卷标语法不正确。: '"c:\\program file

unity 2021.3.6f1 报错 dependencies manifest(Microsoft.NetCore.App.deps.json)was not found_unitydependencies-程序员宅基地

文章浏览阅读2.9k次。dependencies manifest (Microsoft.NETCore.App.deps.json) was not found. runtime.win-x64.Microsoft.NETCore.App', version: '5.0.3-servicing.21072.12'_unitydependencies

vector的reserve的作用_vector.reserve-程序员宅基地

文章浏览阅读2.2k次。reserve的作用是更改vector的容量(capacity),使vector至少可以容纳n个元素。如果n大于vector当前的容量,reserve会对vector进行扩容。其他情况下都不会重新分配vector的存储空间_vector.reserve