Ejemplo n.º 1
0
 def fifo(self):
     '''
     @return: a FIFO kernel
     '''
     self.imanager = InterruptorManager()
     self.cpu = CPU(self.ram, self.imanager, self.condition, self.mmu)
     self.queue = OwnQueue(self.condition)
     self.scheduler = Scheduler(self.cpu, self.queue, -1, self.condition)
     return self.__build(self.queue, self.scheduler)
Ejemplo n.º 2
0
 def withPriority(self):
     '''
     @return: a Priority kernel
     '''
     self.imanager = InterruptorManager()
     self.cpu = CPU(self.ram, self.imanager, self.condition, self.mmu)
     self.func = lambda pcb1, pcb2: pcb1.getPriority() >= pcb2.getPriority()
     self.queue = OwnHeap(self.condition, self.func)
     self.scheduler = Scheduler(self.cpu, self.queue, -1, self.condition)
     return self.__build(self.queue, self.scheduler)
Ejemplo n.º 3
0
 def roundRobin(self, quantum):
     '''
     @return: given a <quantum>, returns a Round Robbin configured kernel, with quantum <quantum>
     '''
     self.imanager = InterruptorManager()
     self.cpu = CPU(self.ram, self.imanager, self.condition, self.mmu)
     self.queue = OwnQueue(self.condition)
     self.scheduler = Scheduler(self.cpu, self.queue, quantum,
                                self.condition)
     return self.__build(self.queue, self.scheduler)
Ejemplo n.º 4
0
 def roundRobin_withPriority(self, quantum):
     '''
     @return: given a <quantum> it returns a Priority-RR kernel with quantum <quantum>
     '''
     self.imanager = InterruptorManager()
     self.cpu = CPU(self.ram, self.imanager, self.condition, self.mmu)
     self.func = lambda pcb1, pcb2: pcb1.getPriority() >= pcb2.getPriority()
     self.queue = OwnHeap(self.condition, self.func)
     self.scheduler = Scheduler(self.cpu, self.queue, quantum,
                                self.condition)
     return self.__build(self.queue, self.scheduler)
Ejemplo n.º 5
0
    def setUp(self):
        self.scheduler = Mock()
        self.cpu = Mock()
        self.disco = Mock()
        self.condition = Mock()
        self.pcbTable = Mock()

        self.iodelivery = Mock()
        self.ram = Mock()
        self.aPCB = Mock()
        when(self.pcbTable).getPCB(0).thenReturn(self.aPCB)
        self.cod = 4
        self.data = [self.aPCB, self.cod]

        self.imanager = InterruptorManager(self.ram, self.scheduler,
                                           self.disco, self.iodelivery,
                                           self.condition, self.pcbTable)
Ejemplo n.º 6
0
class IntegrationTest(unittest.TestCase):


    def setUp(self):
        # miscellaneous
        self.semaphore = Condition()
        self.disk = HardDisk()
        self.comparator = lambda pcb1, pcb2: pcb1.getPriority() > pcb2.getPriority()  # the greater, the better
        self.readyQueue = OwnHeap(self.semaphore, self.comparator)
        
        # hardware
        self.memory = RAM(1000)
        self.mmu = MMU(1,self.memory)
        self.ioDelivery = IODelivery()
        self.progLoader = ProgramLoader(self.memory, self.disk, self.readyQueue,self.mmu)
        self.imanager = InterruptorManager()      
        self.cpu = CPU(self.memory, self.imanager, self.semaphore,self.mmu)
        self.scheduler = Scheduler(self.cpu, self.readyQueue , 5, self.semaphore)

        
        # devices
        self.spooler = Device('printer', self.imanager)
        self.screen = Device('screen', self.imanager)
        
        self.ioDelivery.newDevice(self.spooler)
        self.ioDelivery.newDevice(self.screen)

        # im 
        self.imanager.setScheduler(self.scheduler)
        self.imanager.setDisk(self.disk)
        self.imanager.setMmu(self.mmu)
        self.imanager.setIODelivery(self.ioDelivery)

        # loading programs
        self.ioInstruction = InstIO('directory', 0)
        self.cpuInstruction = InstCPU('1+1')
        self.prog1 = Program('ls')
        self.prog2 = Program('pwd')
        
        self.prog1.addInstruction(self.cpuInstruction)
        self.prog2.addInstruction(self.ioInstruction)
        
        self.disk.setProgram(self.prog1)
        self.disk.setProgram(self.prog2)
        

    def test_when_programLoader_loadProcessWithNoPriority_then_it_starts_the_expected_sequence(self):
        self.progLoader.loadProcess("ls")
        self.progLoader.loadProcess("pwd", 3)
        self.table = self.progLoader.getPcbTable()
        self.table.getPS()
        self.assertEqual(2, self.table.countActiveProcess())
        self.assertEquals(2 , self.readyQueue.length())
        self.assertEqual(self.cpuInstruction, self.memory.getDir(0))
Ejemplo n.º 7
0
    def setUp(self):
        # miscellaneous
        self.semaphore = Condition()
        self.disk = HardDisk()
        self.comparator = lambda pcb1, pcb2: pcb1.getPriority() > pcb2.getPriority()  # the greater, the better
        self.readyQueue = OwnHeap(self.semaphore, self.comparator)
        
        # hardware
        self.memory = RAM(1000)
        self.mmu = MMU(1,self.memory)
        self.ioDelivery = IODelivery()
        self.progLoader = ProgramLoader(self.memory, self.disk, self.readyQueue,self.mmu)
        self.imanager = InterruptorManager()      
        self.cpu = CPU(self.memory, self.imanager, self.semaphore,self.mmu)
        self.scheduler = Scheduler(self.cpu, self.readyQueue , 5, self.semaphore)

        
        # devices
        self.spooler = Device('printer', self.imanager)
        self.screen = Device('screen', self.imanager)
        
        self.ioDelivery.newDevice(self.spooler)
        self.ioDelivery.newDevice(self.screen)

        # im 
        self.imanager.setScheduler(self.scheduler)
        self.imanager.setDisk(self.disk)
        self.imanager.setMmu(self.mmu)
        self.imanager.setIODelivery(self.ioDelivery)

        # loading programs
        self.ioInstruction = InstIO('directory', 0)
        self.cpuInstruction = InstCPU('1+1')
        self.prog1 = Program('ls')
        self.prog2 = Program('pwd')
        
        self.prog1.addInstruction(self.cpuInstruction)
        self.prog2.addInstruction(self.ioInstruction)
        
        self.disk.setProgram(self.prog1)
        self.disk.setProgram(self.prog2)
Ejemplo n.º 8
0
class IntegrationTest(unittest.TestCase):
    def setUp(self):
        # miscellaneous
        self.semaphore = Condition()
        self.disk = HardDisk()
        self.comparator = lambda pcb1, pcb2: pcb1.getPriority() > pcb2.getPriority()  # the greater, the better
        self.readyQueue = OwnHeap(self.semaphore, self.comparator)

        # hardware
        self.memory = RAM(1000)
        self.mmu = MMU(1, self.memory)
        self.ioDelivery = IODelivery()
        self.progLoader = ProgramLoader(self.memory, self.disk, self.readyQueue, self.mmu)
        self.imanager = InterruptorManager()
        self.cpu = CPU(self.memory, self.imanager, self.semaphore, self.mmu)
        self.scheduler = Scheduler(self.cpu, self.readyQueue, 5, self.semaphore)

        # devices
        self.spooler = Device("printer", self.imanager)
        self.screen = Device("screen", self.imanager)

        self.ioDelivery.newDevice(self.spooler)
        self.ioDelivery.newDevice(self.screen)

        # im
        self.imanager.setScheduler(self.scheduler)
        self.imanager.setDisk(self.disk)
        self.imanager.setMmu(self.mmu)
        self.imanager.setIODelivery(self.ioDelivery)

        # loading programs
        self.ioInstruction = InstIO("directory", 0)
        self.cpuInstruction = InstCPU("1+1")
        self.prog1 = Program("ls")
        self.prog2 = Program("pwd")

        self.prog1.addInstruction(self.cpuInstruction)
        self.prog2.addInstruction(self.ioInstruction)

        self.disk.setProgram(self.prog1)
        self.disk.setProgram(self.prog2)

    def test_when_programLoader_loadProcessWithNoPriority_then_it_starts_the_expected_sequence(self):
        self.progLoader.loadProcess("ls")
        self.progLoader.loadProcess("pwd", 3)
        self.table = self.progLoader.getPcbTable()
        self.table.getPS()
        self.assertEqual(2, self.table.countActiveProcess())
        self.assertEquals(2, self.readyQueue.length())
        self.assertEqual(self.cpuInstruction, self.memory.getDir(0))
Ejemplo n.º 9
0
 def setUp(self):
     self.scheduler = Mock()
     self.cpu = Mock()
     self.disco = Mock()
     self.condition = Mock()
     self.pcbTable = Mock()
     
     self.iodelivery = Mock()
     self.ram = Mock()
     self.aPCB = Mock()
     when(self.pcbTable).getPCB(0).thenReturn(self.aPCB)
     self.cod = 4
     self.data = [self.aPCB, self.cod]
     
     self.imanager = InterruptorManager(self.ram, self.scheduler, self.disco, self.iodelivery, self.condition, self.pcbTable)
Ejemplo n.º 10
0
    def setUp(self):
        # miscellaneous
        self.semaphore = Condition()
        self.disk = HardDisk()
        self.comparator = lambda pcb1, pcb2: pcb1.getPriority() > pcb2.getPriority()  # the greater, the better
        self.readyQueue = OwnHeap(self.semaphore, self.comparator)

        # hardware
        self.memory = RAM(1000)
        self.mmu = MMU(1, self.memory)
        self.ioDelivery = IODelivery()
        self.progLoader = ProgramLoader(self.memory, self.disk, self.readyQueue, self.mmu)
        self.imanager = InterruptorManager()
        self.cpu = CPU(self.memory, self.imanager, self.semaphore, self.mmu)
        self.scheduler = Scheduler(self.cpu, self.readyQueue, 5, self.semaphore)

        # devices
        self.spooler = Device("printer", self.imanager)
        self.screen = Device("screen", self.imanager)

        self.ioDelivery.newDevice(self.spooler)
        self.ioDelivery.newDevice(self.screen)

        # im
        self.imanager.setScheduler(self.scheduler)
        self.imanager.setDisk(self.disk)
        self.imanager.setMmu(self.mmu)
        self.imanager.setIODelivery(self.ioDelivery)

        # loading programs
        self.ioInstruction = InstIO("directory", 0)
        self.cpuInstruction = InstCPU("1+1")
        self.prog1 = Program("ls")
        self.prog2 = Program("pwd")

        self.prog1.addInstruction(self.cpuInstruction)
        self.prog2.addInstruction(self.ioInstruction)

        self.disk.setProgram(self.prog1)
        self.disk.setProgram(self.prog2)
Ejemplo n.º 11
0
class InterruptorManagerTest(unittest.TestCase):
    def setUp(self):
        self.scheduler = Mock()
        self.cpu = Mock()
        self.disco = Mock()
        self.condition = Mock()
        self.pcbTable = Mock()

        self.iodelivery = Mock()
        self.ram = Mock()
        self.aPCB = Mock()
        when(self.pcbTable).getPCB(0).thenReturn(self.aPCB)
        self.cod = 4
        self.data = [self.aPCB, self.cod]

        self.imanager = InterruptorManager(self.ram, self.scheduler,
                                           self.disco, self.iodelivery,
                                           self.condition, self.pcbTable)

    def test_when_signal_ioQueue_then_IM_puts_the_pcb_in_the_ioQueue(self):
        self.imanager.ioQueue(self.data, self.cod)

        verify(self.iodelivery).putInQueue(self.data, self.cod)
        verify(self.scheduler).setPcbToCPU()

    def test_when_kill_signal_then_cleans_the_memory(self):
        when(self.cpu).enable().thenReturn(None)
        when(self.scheduler).getCpu().thenReturn(self.cpu)
        self.imanager.kill(0)
        verify(self.pcbTable).delete(self.aPCB)
        verify(self.ram).clean(self.aPCB)

    def test_when_timeout_signal_then_the_pcb_is_added_to_the_readyQueue_again(
            self):
        self.imanager.timeOut(self.aPCB)

        verify(self.scheduler).expropiate()
        verify(self.scheduler).setPcbToCPU()
        verify(self.scheduler).put(self.aPCB)
Ejemplo n.º 12
0
class InterruptorManagerTest(unittest.TestCase):


    def setUp(self):
        self.scheduler = Mock()
        self.cpu = Mock()
        self.disco = Mock()
        self.condition = Mock()
        self.pcbTable = Mock()
        
        self.iodelivery = Mock()
        self.ram = Mock()
        self.aPCB = Mock()
        when(self.pcbTable).getPCB(0).thenReturn(self.aPCB)
        self.cod = 4
        self.data = [self.aPCB, self.cod]
        
        self.imanager = InterruptorManager(self.ram, self.scheduler, self.disco, self.iodelivery, self.condition, self.pcbTable)
    
    def test_when_signal_ioQueue_then_IM_puts_the_pcb_in_the_ioQueue (self):
        self.imanager.ioQueue(self.data, self.cod)

        verify(self.iodelivery).putInQueue(self.data, self.cod)
        verify(self.scheduler).setPcbToCPU()
    
    def test_when_kill_signal_then_cleans_the_memory(self):
        when(self.cpu).enable().thenReturn(None)
        when(self.scheduler).getCpu().thenReturn(self.cpu)
        self.imanager.kill(0)
        verify(self.pcbTable).delete(self.aPCB)
        verify(self.ram).clean(self.aPCB)
         
    def test_when_timeout_signal_then_the_pcb_is_added_to_the_readyQueue_again(self):
        self.imanager.timeOut(self.aPCB)
        
        verify(self.scheduler).expropiate()
        verify(self.scheduler).setPcbToCPU()
        verify(self.scheduler).put(self.aPCB)
Ejemplo n.º 13
0
class OperativeSystemFactory:
    '''
    @summary: useful for some components's abstraction. Returns different kernels, for multiple purposes
    '''
    def __init__(self, disk, ram, frameSize, mainConsole):
        '''
        @param HardDiskDrive: an HDD with some programs loaded.
        @param MemoryRam
        @param frameSize
        '''
        self.disk = disk
        self.ram = ram
        self.condition = Condition()
        self.mmu = MMU(frameSize, ram)
        self.console = mainConsole

    #####################
    # TIPOS DE SCHEDULERS#
    #####################
    def roundRobin(self, quantum):
        '''
        @return: given a <quantum>, returns a Round Robbin configured kernel, with quantum <quantum>
        '''
        self.imanager = InterruptorManager()
        self.cpu = CPU(self.ram, self.imanager, self.condition, self.mmu)
        self.queue = OwnQueue(self.condition)
        self.scheduler = Scheduler(self.cpu, self.queue, quantum,
                                   self.condition)
        return self.__build(self.queue, self.scheduler)

    def fifo(self):
        '''
        @return: a FIFO kernel
        '''
        self.imanager = InterruptorManager()
        self.cpu = CPU(self.ram, self.imanager, self.condition, self.mmu)
        self.queue = OwnQueue(self.condition)
        self.scheduler = Scheduler(self.cpu, self.queue, -1, self.condition)
        return self.__build(self.queue, self.scheduler)

    def withPriority(self):
        '''
        @return: a Priority kernel
        '''
        self.imanager = InterruptorManager()
        self.cpu = CPU(self.ram, self.imanager, self.condition, self.mmu)
        self.func = lambda pcb1, pcb2: pcb1.getPriority() >= pcb2.getPriority()
        self.queue = OwnHeap(self.condition, self.func)
        self.scheduler = Scheduler(self.cpu, self.queue, -1, self.condition)
        return self.__build(self.queue, self.scheduler)

    def roundRobin_withPriority(self, quantum):
        '''
        @return: given a <quantum> it returns a Priority-RR kernel with quantum <quantum>
        '''
        self.imanager = InterruptorManager()
        self.cpu = CPU(self.ram, self.imanager, self.condition, self.mmu)
        self.func = lambda pcb1, pcb2: pcb1.getPriority() >= pcb2.getPriority()
        self.queue = OwnHeap(self.condition, self.func)
        self.scheduler = Scheduler(self.cpu, self.queue, quantum,
                                   self.condition)
        return self.__build(self.queue, self.scheduler)

    def __build(self, queue, scheduler):

        # miscellaneous
        self.ioDelivery = IODelivery()
        #hardware
        self.progLoader = ProgramLoader(self.ram, self.disk, queue, self.mmu)
        # InterruptorManager
        self.imanager.setScheduler(scheduler)
        self.imanager.setDisk(self.disk)
        self.imanager.setMmu(self.mmu)
        self.imanager.setIODelivery(self.ioDelivery)
        self.imanager.setSemaphore(self.condition)
        self.imanager.setPcbTable(self.progLoader.getPcbTable())
        self.imanager.setProgramLoader(self.progLoader)

        self.loggerCpu = CpuFileLogger("../log/cpu_log", self.console)
        self.cpu.setLogger(self.loggerCpu)

        self.clock = Clock(self.cpu)

        return Kernel(self.clock, self.progLoader, self.imanager,
                      self.ioDelivery)