中山大学软件工程 操作系统原理 蔡国扬 CPU调度策略 - Labweek_16

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执行后终止。

下面讨论本实验中涉及的几种调度方式。

  1. FCFS, First Come, First Served Scheduling

顾名思义,先到先服务调度根据任务抵达的时间顺序进行CPU的调度,我们考虑在这一调度策略的实现中采取队列的数据结构进行。

  1. SJF, Shortest-Job-First Scheduling

该种调度方式会优先执行等待队列中执行时间最小的进程,我们在这一调度策略中采用优先队列的数据结构。

  1. 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;
}

二、实验结果

  1. FCFS Scheduling

在这里插入图片描述

  1. SJF Scheduling

在这里插入图片描述

  1. Priority Scheduling

在这里插入图片描述

分析实验结果,认为FCFS、SJF和Priority调度均已实现,并能正常进行调度。

三、实验心得

CPU调度是操作系统的一个重要职能,在本实验中我进一步加深了对于CPU几种调度策略的理解,并能通过代码简单实现,这对于更好地理解操作系统的本质及其资源调配是至关重要的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值