input :  :jobs running in VMs;
      :jobs running in VMs;
      : jobs waiting in the queue.
(1) begin
(2)  / *Step 1: Schedule runnable jobs according to FCFS  */
(3)  sort according to job arrival time;
(4)  for      do
(5)      process number of ; idle fg VM number;
(6)     if     then
(7)    break;
(8)     else
(9)      If Deploy (j, 'K')   then
(10)       remove from or , insert it into ;
(11)  if     is empty  then
(12)    return;
(13)  / *Step 2: Make reservation for the first job in , then backfill */
(14)  let = 0 (shadow time), = 0 (extra fg VM number);
(15)   first job in ; process number of ;
(16)   current idle fg VM number;
(17)  Sort in ascending order of their termination time;
(18)   for each job j in the sorted   do
(19)      processe number in ; ;
(20)     if     then
(21)       = the termination time of ; = ; break;
(22)  / * Backfill runnable jobs */
(23)   for each job in   do
(24)      processe number of ; idle fg VM number;
(25)     if    then
(26)      continue;
(27)      the runtime of ; current time;
(28)     if ( ) or   then
(29)       if Deploy (j, 'K') then
(30)     remove from or , insert it into ;
(31)      if     then
(32)      = ;
(33)  / *Step 3: Try to deploy jobs to the background tier */
(34)  sort in ascending order of their runtime;
(35)  for each job in the sorted   do
(36)      processe number of ; idle bg VM number;
(37)     if     then
(38)     Dispatch('BG', );
Algorithm 1: FCFS with KEASY backfilling and consolidation.