在NachOS-4.1中(1)在NachOS线程描述中增加调度优先级的数据成员,并完善就绪队列管理的成员方法; (2)实现基于优先级的FCFS调度; (3)调度时,线程的产生和调度须同时进行,并且要构建它们的线程家族树。在那个文件修改,怎么修改,如何输出,代码怎么写
时间: 2024-05-03 18:18:47 浏览: 380
NachOS-4.1a.tar.gz
在NachOS-4.1中,需要修改以下文件来实现基于优先级的FCFS调度:
1. 在`threads/thread.h`头文件中,增加一个成员变量`priority`,表示线程的调度优先级。同时,在该头文件中完善就绪队列管理的成员方法,包括添加/删除线程到就绪队列中,以及根据线程优先级选择下一个要运行的线程等。
```c++
class Thread {
private:
//...
int priority; // 线程的调度优先级
public:
//...
void setPriority(int p) { priority = p; } // 设置线程优先级
int getPriority() { return priority; } // 获取线程优先级
};
class Scheduler {
private:
//...
List<Thread *> *readyList; // 就绪队列
public:
//...
void Schedule(); // 选择下一个要运行的线程
void ReadyToRun(Thread *thread); // 添加一个线程到就绪队列
void DequeueThread(Thread *thread); // 从就绪队列中删除一个线程
};
```
2. 在`threads/scheduler.cc`文件中,实现基于优先级的FCFS调度。首先,需要修改`Scheduler::Schedule()`方法,使其根据线程优先级选择下一个要运行的线程。其次,需要修改`Scheduler::ReadyToRun()`方法,使其按照线程优先级顺序将线程插入到就绪队列中。
```c++
void
Scheduler::Schedule()
{
Thread *nextThread;
if ((nextThread = GetNextThreadToRun()) == NULL) {
return;
}
currentThread->CheckOverflow(); // 检查当前线程是否越界
currentThread = nextThread; // 切换到下一个要运行的线程
currentThread->setStatus(RUNNING); // 更新线程状态
//...
}
void
Scheduler::ReadyToRun(Thread *thread)
{
thread->setStatus(READY);
// 按照优先级插入到就绪队列中
ListIterator<Thread *> iter(readyList);
for (; !iter.IsDone() && iter.Item()->getPriority() >= thread->getPriority(); iter.Next()) {}
iter.InsertBefore(thread);
}
```
3. 在`threads/system.cc`文件中,需要修改`ThreadTest()`函数,以便在调度时,线程的产生和调度同时进行,并且需要构建它们的线程家族树。在创建子线程时,需要设置其优先级,并将其添加到父线程的子线程列表中。
```c++
void
ThreadTest()
{
DEBUG('t', "Entering ThreadTest");
Thread *t1 = new Thread("forked thread 1");
t1->setPriority(1); // 设置线程优先级
t1->Fork(SimpleThread, (void *)t1);
Thread *t2 = new Thread("forked thread 2");
t2->setPriority(2); // 设置线程优先级
t2->Fork(SimpleThread, (void *)t2);
// 构建线程家族树
currentThread->addChildThread(t1);
currentThread->addChildThread(t2);
SimpleThread(0);
}
```
以上是我对如何在NachOS-4.1中实现基于优先级的FCFS调度的一些思路和代码示例,仅供参考。需要注意的是,代码的具体实现可能会因为具体需求有所不同,需要根据实际情况进行适当调整。
阅读全文