示例#1
0
def main():
    # Checa os parâmetros
    if (len(sys.argv) != 4):
        print("Usage: python " + sys.argv[0] + " <inicio> <fim> <arquivo>")
        sys.exit()
    else:
        (_ROOT, _DEPTH, _BREADTH) = range(3)
        cpu = Processor(1, 1)
        memory = Memory(10 * 1024 * 1024, 1024 * 1024)  # 10MB memory
        # Seguir ordem Printer -> Reader -> Disk para declaração no vetor devices
        devices = [
            DeviceManagement(DeviceType.Printer, 2 * 1000 * 1000 * 1000, 2),
            DeviceManagement(DeviceType.Reader, 100 * 1000 * 1000, 2),
            DeviceManagement(DeviceType.Disk, 8002 * 1000, 1)
        ]
        disk = Disk(8002 * 1000, 2 * 1000, 500 * 1024 * 1024)
        start = int(sys.argv[1])
        end = int(sys.argv[2])
        event_queue = EventQueue()
        event_queue.put(Event(EventType.BeginSimulation, start))
        event_queue.put(Event(EventType.EndSimulation, end))
        current_time = 0
        while not event_queue.empty():
            current_event = event_queue.get()
            current_job = current_event.job
            if current_event.current_time > current_time:
                current_time = current_event.current_time
            if current_event.typename == EventType.BeginSimulation:
                jobs = readJobs(disk, cpu)
                for i in jobs:
                    event_queue.put(
                        Event(EventType.BeginJob, i.scheduled_time, i))
                current_time = start

            # Início do Job
            elif current_event.typename == EventType.BeginJob:
                event_queue.put(
                    Event(EventType.RequestMemory, current_time, current_job))

            # Final do Job
            elif current_event.typename == EventType.EndJob:
                pass

            elif current_event.typename == EventType.RequestMemory:
                memory.request(current_job,
                               current_job.segment_tree.__getitem__(_ROOT),
                               event_queue, current_time)

            elif current_event.typename == EventType.ReleaseMemory:
                print "\nMEMORY CONTENT BEFORE RELEASE"
                memory.printMemory()
                print ""
                memory.release(current_job, event_queue, current_time)
                event_queue.put(
                    Event(EventType.EndJob, current_time, current_job))

            elif current_event.typename == EventType.RequestCPU:
                current_job.active_segment = current_job.next_segment
                cpu.request(current_event.job, event_queue, current_time)

            elif current_event.typename == EventType.BeginTimeSlice:
                cpu.beginTimeslice(event_queue, current_time)
                # Schedule next interruption
                if current_job.nextAction(
                )[0] == JobAction.Nothing or current_job.nextAction()[1] <= 0:
                    # Advance
                    current_job.advanceAction(cpu.TIMESLICE)
                # Little Fix
                if current_job.missingTime() < current_job.nextAction()[1]:
                    event_queue.put(
                        Event(
                            EventType.ReleaseCPU,
                            current_time + current_job.missingTime(),
                            current_job,
                            current_job.missingTime() -
                            current_job.nextAction()[1]))
                elif current_job.nextAction(
                )[0] != JobAction.Nothing and current_job.nextAction(
                )[1] <= cpu.TIMESLICE:
                    if current_job.nextAction(
                    )[0] == JobAction.SegmentReference:
                        event_queue.put(
                            Event(EventType.SegmentReference,
                                  current_time + current_job.nextAction()[1],
                                  current_job))
                    if current_job.nextAction()[0] == JobAction.IO:
                        if current_job.ios[
                                current_job.
                                current_io].typename == DeviceType.Disk:
                            event_queue.put(
                                Event(
                                    EventType.RequestFile,
                                    current_time + current_job.nextAction()[1],
                                    current_job))
                        else:
                            event_queue.put(
                                Event(
                                    EventType.RequestIO,
                                    current_time + current_job.nextAction()[1],
                                    current_job))
                elif current_job.missingTime() < cpu.TIMESLICE:
                    event_queue.put(
                        Event(EventType.ReleaseCPU,
                              current_time + current_job.missingTime(),
                              current_job, current_job.missingTime()))
            elif current_event.typename == EventType.UseCPU:
                pass

            elif current_event.typename == EventType.SegmentLoaded:
                event_queue.put(
                    Event(EventType.RequestCPU, current_time, current_job))

            elif current_event.typename == EventType.ReleaseCPU:
                event_queue = cpu.release(current_job, event_queue,
                                          current_time)
                if current_job.missingTime() == 0:
                    event_queue.put(
                        Event(EventType.ReleaseMemory, current_time,
                              current_job))

            elif current_event.typename == EventType.RequestIO:
                if cpu.running_job == current_job:
                    event_queue.put(
                        Event(EventType.ReleaseCPU, current_time, current_job))
                devices[current_job.ios[
                    current_job.current_io].device_number].request(
                        current_job, event_queue, current_time)

            elif current_event.typename == EventType.UseIO:
                event_queue.put(
                    Event(
                        EventType.ReleaseIO,
                        current_time + devices[current_job.ios[
                            current_job.current_io].device_number].time,
                        current_job))

            elif current_event.typename == EventType.ReleaseIO:
                devices[current_job.ios[
                    current_job.current_io].device_number].release(
                        current_job, event_queue, current_time)
                current_job.advanceIO()
                event_queue.put(
                    Event(EventType.RequestCPU, current_time, current_job))

            elif current_event.typename == EventType.SegmentReference:
                if current_job.next_segment.memory is None:
                    event_queue.put(
                        Event(EventType.SegmentFault, current_time,
                              current_job))
                else:
                    slice_run = current_job.nextAction()[1]
                    current_job.active_segment = current_job.next_segment
                    if current_job.missingTime() <= cpu.TIMESLICE:
                        event_queue.put(
                            Event(
                                EventType.ReleaseCPU, current_time +
                                current_job.missingTime() - slice_run,
                                current_job,
                                current_job.missingTime() - slice_run))

            # Novo segmento sorteado nao está na memoria
            elif current_event.typename == EventType.SegmentFault:
                if cpu.running_job == current_job:
                    event_queue.put(
                        Event(EventType.ReleaseCPU, current_time, current_job))

                # request memory
                if not memory.FULL:
                    memory.request(current_job, current_job.next_segment,
                                   event_queue, current_time)
                else:
                    memory_full_time_evaluation = 10
                    if current_job.missingTime() > current_job.nextAction()[1]:
                        event_queue.put(
                            Event(EventType.RequestCPU,
                                  current_time + memory_full_time_evaluation,
                                  current_job))

            elif current_event.typename == EventType.EndTimeSlice:
                cpu.endTimeslice(event_queue, current_time)

            elif current_event.typename == EventType.RequestFile:
                if cpu.running_job == current_job:
                    event_queue.put(
                        Event(EventType.ReleaseCPU, current_time, current_job))
                disk.diskRequest(
                    current_job,
                    current_job.ios[current_job.current_io].file.name,
                    current_job.ios[current_job.current_io].operation,
                    current_job.ios[current_job.current_io].number_tracks,
                    event_queue, current_time)

            elif current_event.typename == EventType.UseFile:
                event_queue.put(
                    Event(
                        EventType.ReleaseFile,
                        current_time + disk.useTime(current_job.ios[
                            current_job.current_io].number_tracks),
                        current_job,
                        disk.useTime(current_job.ios[
                            current_job.current_io].number_tracks)))

            elif current_event.typename == EventType.ReleaseFile:
                disk.diskRelease(current_job, event_queue, current_time)
                current_job.advanceIO()
                event_queue.put(
                    Event(EventType.RequestCPU, current_time, current_job))

            elif current_event.typename == EventType.EndSimulation:
                # Zera eventos na fila para finalizar a simulacao
                while not event_queue.empty():
                    event_queue.get()
                    event_queue.task_done()
                current_time = end

            if current_job is not None:
                print "".join(str(
                    current_event.current_time).ljust(15)) + "".join(
                        current_event.typename.ljust(20)) + "".join(
                            current_job.name.ljust(10)) + "".join(
                                current_event.action.ljust(50)) + " " + str(
                                    current_job.executed_time) + "ns/" + str(
                                        current_job.execution_time) + "ns"
            else:
                print "".join(str(
                    current_event.current_time).ljust(15)) + "".join(
                        current_event.typename.ljust(20)) + "".join(
                            " -".ljust(10)) + "".join(
                                current_event.action.ljust(48)) + "       -"
            if current_event.typename == EventType.ReleaseMemory:
                print "\nMEMORY CONTENT AFTER RELEASE"
                memory.printMemory()
                print ""