300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > NachOS线程ID的实现 最大线程数的实现和优先级的添加

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

时间:2024-04-09 12:40:36

相关推荐

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

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

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

注1:实验环境:Ubuntu14.04

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。