Labwork16 - CPU Schedule
编译环境
Ubuntu 20.04 LTS - x86_64
gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)
实验内容: CPU 调度
- 讨论课件 Lecture19-20 中 CPU 调度算法的例子,尝试基于 POSIX API 设计一个简单调度器(不考虑资源竞争问题):
- 创建一些 Pthread 线程任务,建立一个管理链队列,结点内容起码包括到达时间、WCT、优先级、调度状态(运行、就绪、阻塞)等调度参数;
- 每个任务有一个调度信号量,任务启动后在其调度信号量上执行 wait;
- 调度器按照调度策略对处于运行态的任务(如果有的话)的调度信号量执行 wait,并选取适当任务的调度信号量执行 signal;
- 实现简单调度策略:FCFS、SJB、Priority。分别计算任务平均等待时间。
实验过程
一、实验准备
原理理论
CPU调度一般具象为CPU-I/O执行周期,在一个进程被CPU调度时,他会开始于CPU执行,紧接着一个I/O执行,再紧接着CPU执行,如此反复,直到进程执行完成。一个进程会在最后一个CPU执行后终止。
下面讨论本实验中涉及的几种调度方式。
- FCFS, First Come, First Served Scheduling
顾名思义,先到先服务调度根据任务抵达的时间顺序进行CPU的调度,我们考虑在这一调度策略的实现中采取队列的数据结构进行。
- SJF, Shortest-Job-First Scheduling
该种调度方式会优先执行等待队列中执行时间最小的进程,我们在这一调度策略中采用优先队列的数据结构。
- Priority Scheduling
该种调度方式同SJF调度本质是相同的,在SJF中我们令耗时短的进程首先执行,而在本调度策略中,我们令优先级高的进程首先执行,同样的,我们采取优先队列的数据结构。
实现方式
我们预设了每个进程的到达时间、执行耗时和优先级,如下所示。
考虑先将每个进程具现为PCB,按时间顺序加入等待队列中,在FCFS调度中我们直接采用该队列进行,其余两个调度中我们采取将该队列中的进程出队到优先队列进行调度。
调度函数:
Job* getJob_SJF(Scheduler*); // 用于SJF调度
Job* getJob_PRI(Scheduler*); // 用于Priority调度
Job*
getJob_SJF(Scheduler* s)
{
Job* job;
if ( s->priHead != nullptr ) {
while ( !taskEmpty(s) and s->time >= s->queueHead->reachingTime ) {
enPriQueue_SJF(s, taskDequeue(s));
}
job = dePriQueue(s);
} else if ( !taskEmpty(s) and s->queueHead->reachingTime <= s->time ) {
while ( !taskEmpty(s) and s->time >= s->queueHead->reachingTime ) {
enPriQueue_SJF(s, taskDequeue(s));
}
job = dePriQueue(s);
} else {
while ( !taskEmpty(s) and s->time >= s->queueHead->reachingTime ) {
enPriQueue_SJF(s, taskDequeue(s));
}
job = nullptr;
}
return job;
}
Job*
getJob_PRI(Scheduler* s)
{
Job* job;
if ( s->priHead != nullptr ) {
while ( !taskEmpty(s) and s->time >= s->queueHead->reachingTime ) {
enPriQueue_PRI(s, taskDequeue(s));
}
job = dePriQueue(s);
} else if ( !taskEmpty(s) and s->queueHead->reachingTime <= s->time ) {
while ( !taskEmpty(s) and s->time >= s->queueHead->reachingTime ) {
enPriQueue_PRI(s, taskDequeue(s)); }
job = dePriQueue(s);
} else {
while ( !taskEmpty(s) and s->time >= s->queueHead->reachingTime ) {
enPriQueue_PRI(s, taskDequeue(s));
}
job = nullptr;
}
return job;
}
二、实验结果
- FCFS Scheduling
- SJF Scheduling
- Priority Scheduling
分析实验结果,认为FCFS、SJF和Priority调度均已实现,并能正常进行调度。
三、实验心得
CPU调度是操作系统的一个重要职能,在本实验中我进一步加深了对于CPU几种调度策略的理解,并能通过代码简单实现,这对于更好地理解操作系统的本质及其资源调配是至关重要的。