FP.py 1.14 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
#!/usr/bin/python
# coding=utf-8

from simso.core import Scheduler


class FP(Scheduler):
    """ Fixed Priority (use 'priority' field) """
    def init(self):
        self.ready_list = []

    def on_activate(self, job):
        self.ready_list.append(job)
        job.cpu.resched()

    def on_terminated(self, job):
        job.cpu.resched()

    def schedule(self, cpu):
        if self.ready_list:
            # Get a free processor or a processor running a low priority job.
            key = lambda x: (
                1 if x.running else 0,
                x.running.data['priority'] if x.running else 0,
                0 if x is cpu else 1
            )
            cpu_min = min(self.processors, key=key)

            # Get the job with the highest priority.
            job = max(self.ready_list, key=lambda x: x.data['priority'])

            if (cpu_min.running is None or
                    cpu_min.running.data['priority'] < job.data['priority']):
                self.ready_list.remove(job)
                if cpu_min.running:
                    self.ready_list.append(cpu_min.running)
                return (job, cpu_min)

        return None