#!/usr/bin/python

# proc: [start, runtime, prio, used time]
processes = {
  1:[0,20,100,0],  2:[5,10,50,0], 
  3:[6,30,100,0],  4:[7, 2,10,0] }
runtime = 40                # wie lange laufen lassen?

# Initialisierung
proccount = len (processes)
activity_log = []
seconds = 0

def find_min_priority():
  # Prozess mit der niedrigsten Prioritaet suchen
  minval = 9999
  for p in processes:
    # Test auf drei Bedingungen: Wert kleiner als Minimum,
    # Prozess schon erzeugt und noch nicht beendet
    [start,maxtime,prio,used] = processes[p]
    if prio < minval and start <= seconds and used < maxtime:
      minval = prio
      minproc = p
  return minproc
# end find_min_priority()

def recalculate():
  # Prioritaeten neu berechnen
  processes[active][3] += 1   # Used-Time-Wert erhoehen
  return
# end recalculate()

def print_status():
  print "%4d |" % seconds,
  for p in processes:
    if p==active: st="*"
    else: st=" "
    [start,maxtime,prio,used] = processes[p]
    if (start <= seconds) and (used < maxtime):
      print "%2d/%2d %3d %s|" % (used, maxtime, prio, st),
    else: print "           |",
  return
# end print_status()


# begin main()
print "Zeit |",
for p in processes: print "Prozess %2d |" % p,
print

for i in range(0,runtime):
  active = find_min_priority()
  print_status()
  print "-> Scheduler aktiviert P.", active
  activity_log.append(active)
  # aktiven Prozess ausfuehren
  seconds += 1  # Zeit hochzaehlen
  recalculate()
  
print


# Statistik ausgeben

print

for p in processes:
  [start,maxtime,prio,used] = processes[p]
  st = ""  # leerer String
  print "Prozess %1d:" % p,
  for i in range(0,runtime):
    if   start>i:              st += " "
    elif activity_log[i] == p: st += "x"
    else:                      st += "-"
  print st

# end main()
