![NachOS线程ID的实现 最大线程数的实现和优先级的添加](https://300zi.50zi.cn/uploadfile/img/15/315/2b37ac48b9ddb4ad620f217a00552ecd.jpg)
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,并设置系统最大线程数,同时添加线程的优先级,有关于线程的基于优先级的调度会在下一篇文章内实现。