/** * FIFO-Algorithmus: Auswahl = Listenkopf (1. Element) Anschließend Listenkopf löschen, neue Seite * (newPte) an Liste anhängen */ private PageTableEntry fifoAlgorithm(PageTableEntry newPte) { PageTableEntry pte; // Auswahl pte = (PageTableEntry) pteRAMlist.getFirst(); os.testOut("Prozess " + pid + ": FIFO-Algorithmus hat pte ausgewählt: " + pte.virtPageNum); pteRAMlist.removeFirst(); pteRAMlist.add(newPte); return pte; }
/** RANDOM-Algorithmus: Zufällige Auswahl */ private PageTableEntry randomAlgorithm(PageTableEntry newPte) { /* TODO:RANDOM Algorithmus */ PageTableEntry pte; // Auswahl final int randomIndex = new Random().nextInt(pteRAMlist.size()); pte = (PageTableEntry) pteRAMlist.get(randomIndex); os.testOut("Prozess " + pid + ": Random-Algorithmus hat pte ausgewählt: " + pte.virtPageNum); pteRAMlist.remove(randomIndex); pteRAMlist.add(newPte); return pte; }
/** * CLOCK-Algorithmus (Second-Chance): Nächstes Listenelement, ausgehend vom aktuellen Index, mit * Referenced-Bit = 0 (false) auswählen Sonst R-Bit auf 0 setzen und nächstes Element in der * pteRAMlist untersuchen. Anschließend die ausgewählte Seite durch die neue Seite (newPte) am * selben Listenplatz ersetzen */ private PageTableEntry clockAlgorithm(PageTableEntry newPte) { PageTableEntry pte; // Aktuell untersuchter Seitentabelleneintrag // Immer ab altem "Uhrzeigerstand" weitersuchen pte = (PageTableEntry) pteRAMlist.get(pteRAMlistIndex); // Suche den nächsten Eintrag mit referenced == false (R-Bit = 0) while (pte.referenced == true) { // Seite wurde referenziert, also nicht auswählen, sondern R-Bit // zurücksetzen os.testOut( "Prozess " + pid + ": CLOCK-Algorithmus! --- pte.vpn: " + pte.virtPageNum + " ref: " + pte.referenced); pte.referenced = false; incrementPteRAMlistIndex(); pte = (PageTableEntry) pteRAMlist.get(pteRAMlistIndex); } // Seite ausgewählt! (--> pteRAMlistIndex) // Alte Seite gegen neue in pteRAMlist austauschen pteRAMlist.remove(pteRAMlistIndex); pteRAMlist.add(pteRAMlistIndex, newPte); // Index auf Nachfolger setzen incrementPteRAMlistIndex(); os.testOut( "Prozess " + pid + ": CLOCK-Algorithmus hat pte ausgewählt: " + pte.virtPageNum + " Neuer pteRAMlistIndex ist " + pteRAMlistIndex); return pte; }
/** Pte in pteRAMlist eintragen, wenn sich die Zahl der RAM-Seiten des Prozesses erhöht hat. */ public void pteRAMlistInsert(PageTableEntry pte) { os.testOut( "pteRAMlistInsert in Prozess " + pid + ": pte mit vpn " + pte.virtPageNum + " angefügt!"); pteRAMlist.add(pte); }