LINE Solver (C++)
Templated C++ port of the LINE queueing solver
Loading...
Searching...
No Matches
ldes_station.h File Reference

The scheduling disciplines of the native LDES engine. More...

#include <algorithm>
#include <cmath>
#include <cstddef>
#include <cstdint>
#include <limits>
#include <set>
#include <vector>
#include "line/lang/lang_types.h"
Include dependency graph for ldes_station.h:

Go to the source code of this file.

Classes

struct  line::ldes::engine::Job
 A job held by a station. More...
struct  line::ldes::engine::WaitCmp
 The waiting-room order of a buffered discipline. More...
struct  line::ldes::engine::PsJob
 A job being served by a sharing discipline, with the work it still owes. More...

Namespaces

namespace  line
namespace  line::ldes
namespace  line::ldes::engine

Functions

bool line::ldes::engine::is_preemptive (lang::SchedStrategy s)
 True for the disciplines that interrupt a job already in service.
bool line::ldes::engine::is_preemptive_resume (lang::SchedStrategy s)
 PREEMPTIVE RESUME, as against preemptive restart.
bool line::ldes::engine::is_size_based (lang::SchedStrategy s)
 True for the orders whose key is the job's size, residual or attained work.
bool line::ldes::engine::is_ps_family (lang::SchedStrategy s)
 True for the disciplines that share the server instead of ordering a queue.
std::vector< double > line::ldes::engine::ps_shares (lang::SchedStrategy sched, const std::vector< PsJob > &jobs, double c, const std::vector< double > &weight, std::size_t nclasses)
 The per-job shares of a sharing discipline, in units of one server.
double line::ldes::engine::fsp_virtual_finish (const std::vector< double > &residuals, double target_work, double c, double now)
 FSP's virtual finish time: when target would finish if the station ran processor sharing from now on.
std::size_t line::ldes::engine::preemption_victim (lang::SchedStrategy sched, const std::vector< Job > &in_service, const Job &arriving, double c, double now)
 Which job in service arriving displaces, or in_service.size() for none.

Detailed Description

The scheduling disciplines of the native LDES engine.

TWO FAMILIES, and they are structurally different simulators sharing one station:

  • THE BUFFERED disciplines (FCFS, LCFS, SIRO, the priority variants, SJF, LJF, SEPT, LEPT) hold waiting jobs in an ORDER and hand the head to a free server. The discipline IS the order, so it lives entirely in WaitCmp below; everything downstream is the same code.
  • THE SHARING disciplines (PS, DPS, GPS, their priority variants and LPS) have no order at all. Every job in service advances at its own share of the server, so the station has no head and no service-start event: the residual work of EVERY job must be integrated forward and EVERY departure rescheduled whenever the population changes. PsStation does that.

THE SERVICE TIME IS SAMPLED AT ARRIVAL, not at service start. This is the reference's choice (customer.serviceTime = generateServiceTime(...) in the arrival handlers) and it is forced: SJF, LJF and the size-based orders compare service times of jobs that have not started, so the sample must exist before the job is ordered. It is invisible under FCFS, where arrival and service order coincide, and visible under LCFS with a MAP service process, whose phase then advances in ARRIVAL order.

PRIORITY ORDERS ASCENDING: a lower value is more urgent, 0 highest. That is LINE's convention throughout (SaveHandlers inverts it when exporting to JMT, which orders the other way), and every comparator here follows it.

Definition in file ldes_station.h.