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

本文介绍了如何在NachOS操作系统中添加线程ID,设置了系统最大线程数128,并实现了线程优先级的概念。通过修改thread.h和thread.cc,详细展示了线程状态数组、tid号和优先级的管理。实验过程包括头文件扩展、构造函数和测试函数的修改,以及编译与运行验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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,并设置系统最大线程数,同时添加线程的优先级,有关于线程的基于优先级的调度会在下一篇文章内实现。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值