public PageRecord processPageRequestAndReturnNewPageRecordAccordingToHistory(int i, PageRecord pageRecord)
        {
            if (pageRecord != null)
            {
                // csak a elgelső iterációban lehet üres, amikor még a History is üres
                if (pageRecord.Pages.Count == 0)
                {
                    // ha tényleg nincs benne semmi, vissza kell adni legalább az igény és annak behozatalából összeállított rekordot
                    PageRecord clone = MyCloner.DeepClone<PageRecord>(pageRecord.CreateNewPageByPageNumberAndShiftTheOtherPages(i));
                    clone.setTimestampOnPage(i, simulatorModel.StepCounter);
                    return clone;
                }

                // ha már tartalmazza a kívánt lapot, akkor nem kell kivinni senkit
                if (pageRecord.containsPage(i))
                {
                    PageRecord clone = MyCloner.DeepClone<PageRecord>(pageRecord);
                    clone.setReferenceAndPageFault(i, false);
                    clone.setTimestampOnPage(i, simulatorModel.StepCounter);
                    return clone;
                }

                // ha nem tartalmazza a kívánt lapot az új lapot be kell vinni

                // ha van elég hely a tárban, a lapot beszúrjuk az első helyre
                if (pageRecord.hasMoreSpaceForNewPage())
                {
                    pageRecord.Pages.Insert(0, new Page(i));
                    pageRecord.setReferenceAndPageFault(i, true);
                    pageRecord.setTimestampOnPage(i, simulatorModel.StepCounter);
                    return pageRecord;
                }

                // ha nincs elég hely a tárban, áldozatot kell kiválasztani
                Page actualPage = null;
                foreach (Page page in pageRecord.Pages)
                {
                    if (actualPage == null)
                    {
                        actualPage = page;
                        continue;
                    }
                    if (actualPage.LastUsedTimestamp > page.LastUsedTimestamp)
                    {
                        actualPage = page;
                    }
                }

                // az áldozat helyére
                if (actualPage != null)
                {
                    pageRecord.ReplaceExistingPageWithNewPage(actualPage, i);
                    pageRecord.setTimestampOnPage(i, simulatorModel.StepCounter);
                    return pageRecord;
                }
                
            }
            return null;
        }
Esempio n. 2
0
 public void setMetrics(PageRecord pageRecord)
 {
     if (pageRecord.PageFault == true)
     {
         CountOfPageFaults++;
     }
     else
     {
         CountOfMemoryAccesses++;
     }
 }
        public PageRecord processPageRequestAndReturnNewPageRecordAccordingToHistory(int i, PageRecord pageRecord)
        {
            if (pageRecord != null)
            {
                // csak a legelső iterációban lehet üres, amikor még a History is üres
                if (pageRecord.Pages.Count == 0)
                {
                    // ha tényleg nincs benne semmi, vissza kell adni legalább az igény és annak behozatalából összeállított rekordot
                    PageRecord clone = MyCloner.DeepClone<PageRecord>(pageRecord.CreateNewPageByPageNumberAndShiftTheOtherPages(i));
                    clone.setTimestampOnPage(i, simulatorModel.StepCounter);
                    return clone;
                }

                // ha már legalább egy lap van a tárban
                // megnézni, hogy a lap a tárban van-e
                bool wasPageInMemory = false;
                foreach (Page page in pageRecord.Pages)
                {
                    if (page.PageNumber == i)
                    {
                        // a keresett lapot nem kell behozni 
                        wasPageInMemory = true;
                        break;
                    }
                }

                // ha a lap nem volt a tárban
                if (!wasPageInMemory)
                {
                    // a keresett lapot be kell hozni, a tárból az utolsót kivinni, laphibát generálni
                    PageRecord clone = MyCloner.DeepClone<PageRecord>(pageRecord.CreateNewPageByPageNumberAndShiftTheOtherPages(i));
                    clone.setTimestampOnPage(i, simulatorModel.StepCounter);
                    return clone;
                }
                else
                {
                    // különben meg nem volt laphiba
                    PageRecord clone = MyCloner.DeepClone<PageRecord>(pageRecord);
                    clone.setReferenceAndPageFault(i, false);
                    clone.setTimestampOnPage(i, simulatorModel.StepCounter);
                    return clone;
                }
            }
            return null;
        }
        public bool NextStep()
        {
            StepCounter++;

            if (PageActionSequence.Count > 0)
            {
                PageActionBase action = PageActionSequence.ElementAt(0);

                PageRecord oldPageRecord = GetLastPageRecord();

                if (action.GetType() == typeof(PageAccess))
                {
                    // csak akkor fordulhat elő, ha még a History üres, tehát az első lapnak üre rekordot kell generálni
                    if (oldPageRecord == null)
                    {
                        oldPageRecord = new PageRecord(countOfPagesForProcess);
                    }
                    // az utolsó lap lap és az igény függvényében az algoritmus új "bejegyzést" generál (nem lapszámot ad vissza!!!)
                    PageRecord newPageRecord = pageReplacer.processPageRequestAndReturnNewPageRecordAccordingToHistory(((PageAccess)action).Page, MyCloner.DeepClone<PageRecord>(oldPageRecord));

                    if (newPageRecord != null)
                    {
                        metrics.setMetrics(newPageRecord);
                        // új bejegyzés bekerül a History-ba
                        pageTable.PageRecords.Insert(0, MyCloner.DeepClone<PageRecord>(newPageRecord));
                        PageActionSequence.RemoveAt(0);
                        return true;
                    }
                    else { return false; }
                }

                if (action.GetType() == typeof(PageSetMbit) || action.GetType() == typeof(PageSetRbit)
                    || action.GetType() == typeof(PageRemoveMbit) || action.GetType() == typeof(PageRemoveRbit))
                {
                    if (oldPageRecord == null)
                    {
                        return false;
                    }
                    PageRecord newPageRecord = MyCloner.DeepClone<PageRecord>(oldPageRecord);

                    if (newPageRecord.containsPage(((PageActionBase)action).Page))
                    {
                        if (action.GetType() == typeof(PageSetMbit))
                        {
                            newPageRecord.setMbit(((PageActionBase)action).Page, true);
                        }
                        if (action.GetType() == typeof(PageSetRbit))
                        {
                            newPageRecord.setRbit(((PageActionBase)action).Page, true);
                        }
                        if (action.GetType() == typeof(PageRemoveMbit))
                        {
                            newPageRecord.setMbit(((PageActionBase)action).Page, false);
                        }
                        if (action.GetType() == typeof(PageRemoveRbit))
                        {
                            newPageRecord.setRbit(((PageActionBase)action).Page, false);
                        }
                        newPageRecord.Referenced = action.Page;
                        newPageRecord.PageFault = false;
                        pageTable.PageRecords.Insert(0, MyCloner.DeepClone<PageRecord>(newPageRecord));
                        PageActionSequence.RemoveAt(0);
                    }
                    else
                    {
                        newPageRecord.Referenced = action.Page;
                        newPageRecord.PageFault = true;
                        pageTable.PageRecords.Insert(0, MyCloner.DeepClone<PageRecord>(newPageRecord));
                        PageActionSequence.RemoveAt(0);
                    }
                }


                if (action.GetType() == typeof(PeriodRemoveAllRbit))
                {
                    PageRecord newPageRecord = MyCloner.DeepClone<PageRecord>(oldPageRecord);

                    if (!pageReplacer.usesPeriodsToRemoveRbits())
                    {
                        foreach (Page page in newPageRecord.Pages)
                        {
                            page.Rbit = false;
                        }
                        newPageRecord.Referenced = null;
                        newPageRecord.PageFault = false;
                    }
                    else 
                    {
                        newPageRecord = ((IPageReplacerEvent)pageReplacer).reactOnPeriodicalRbitRemovalEvent(MyCloner.DeepClone<PageRecord>(newPageRecord));
                    }
                    pageTable.PageRecords.Insert(0, MyCloner.DeepClone<PageRecord>(newPageRecord));
                    PageActionSequence.RemoveAt(0);
                }

                return false;
            }
            return false;
        }
        public PageRecord processPageRequestAndReturnNewPageRecordAccordingToHistory(int i, PageRecord pageRecord)
        {
            if (pageRecord != null)
            {
                // csak a elgelső iterációban lehet üres, amikor még a History is üres
                if (pageRecord.Pages.Count == 0)
                {
                    // ha tényleg nincs benne semmi, vissza kell adni legalább az igényt és annak behozatalából összeállított rekordot
                    PageRecord clone = MyCloner.DeepClone<PageRecord>(pageRecord.CreateNewPageByPageNumberAndShiftTheOtherPages(i));
                    clone.setTimestampOnPage(i, simulatorModel.StepCounter);
                    return clone;
                }

                // ha már legalább egy lap van a tárban
                // megnézni, hogy a lap a tárban van-e
                bool wasPageInMemory = false;
                foreach (Page page in pageRecord.Pages)
                {
                    if (page.PageNumber == i)
                    {
                        // a keresett lapot nem kell behozni 
                        wasPageInMemory = true;
                        break;
                    }
                }

                // ha a lap nem volt a tárban
                if (!wasPageInMemory)
                {
                    if (pageRecord.hasMoreSpaceForNewPage())
                    {
                        pageRecord.Pages.Insert(0, new Page(i));
                        pageRecord.setTimestampOnPage(i, simulatorModel.StepCounter);
                        pageRecord.setReferenceAndPageFault(i, true);
                        return pageRecord;
                    }

                    ObservableCollection<Page> pagesToAddToList = new ObservableCollection<Page>();
                    Page victim = null;

                    // áldozat kiválasztása ha van, egyben a 
                    foreach (Page page in pageRecord.Pages.Reverse())
                    {
                        if (page.Rbit == true)
                        {
                            page.Rbit = false;
                            pagesToAddToList.Add(page);
                        }
                        else
                        {
                            victim = page;
                            break;
                        }
                    }

                    // csak akkor lehet ha minden lap a laptáblán R-bites volt és victim nem került kiválasztásra
                    if (pagesToAddToList.Count == pageRecord.Pages.Count && victim == null)
                    {
                        pageRecord.Pages.Remove(pageRecord.Pages.Last());
                        pageRecord.Pages.Insert(0, new Page(i));
                        pageRecord.setReferenceAndPageFault(i, true);
                        pageRecord.setTimestampOnPage(i, simulatorModel.StepCounter);
                        return MyCloner.DeepClone<PageRecord>(pageRecord); 
                    }

                    // ha a laptáblán kevesebb lap került kiválasztásra mint amennyi benne volt akkor volt benne áldozat is
                    // ezért minden lapot előre beszúrni
                    if (pagesToAddToList != null)  
                    {
                        foreach (Page page in pagesToAddToList)
                        {
                            pageRecord.Pages.Remove(page);
                            pageRecord.Pages.Insert(0, page);
                        }
                    }
                    // majd az áldozatot eltakarítani, helyébe a kért lapot behozni
                    if (pageRecord.containsPage(victim.PageNumber))
                    {
                        pageRecord.Pages.Remove(victim);
                        pageRecord.Pages.Insert(0, new Page(i));
                    }

                    pageRecord.setTimestampOnPage(i, simulatorModel.StepCounter);
                    pageRecord.setReferenceAndPageFault(i, true);
                    return MyCloner.DeepClone<PageRecord>( pageRecord);

                }
                else
                {
                    // különben meg nem volt laphiba
                    PageRecord clone = MyCloner.DeepClone<PageRecord>(pageRecord);
                    clone.setReferenceAndPageFault(i, false);
                    clone.setTimestampOnPage(i, simulatorModel.StepCounter);
                    return clone;
                }
            }
            return null;
        }
 public PageRecord reactOnPeriodicalRbitRemovalEvent(PageRecord oldPageRecord)
 {
     foreach (Page page in oldPageRecord.Pages)
     {
         if (page.Rbit == false)
         {
             page.LfuCounter += 0;
             continue;
         }
         if (page.Rbit == true)
         {
             page.LfuCounter++;
             page.Rbit = false;
         }
     }
     return MyCloner.DeepClone<PageRecord>(oldPageRecord);            
 }
        public PageRecord processPageRequestAndReturnNewPageRecordAccordingToHistory(int i, PageRecord pageRecord)
        {
            if (pageRecord != null)
            {
                // csak a legelső iterációban lehet üres, amikor még a History is üres
                if (pageRecord.Pages.Count == 0)
                {
                    PageRecord clone = MyCloner.DeepClone<PageRecord>(pageRecord.CreateNewPageByPageNumberAndShiftTheOtherPages(i));
                    clone.setTimestampOnPage(i, simulatorModel.StepCounter);
                    return clone;
                }

                // ha már tartalmazza a kívánt lapot, akkor nem kell kivinni senkit
                if (pageRecord.containsPage(i))
                {
                    PageRecord clone = MyCloner.DeepClone<PageRecord>(pageRecord);
                    clone.setReferenceAndPageFault(i, false);
                    clone.setTimestampOnPage(i, simulatorModel.StepCounter);
                    return clone;
                }


                // minden lapra a laptáblában meg kell nézni, mikor lesz a következő akció, amiben szerepel
                int notNeedMaxTime = 0;
                Page pageTmp = null;

                foreach (Page page in pageRecord.Pages)
                {
                    bool pageWasInRequestList = false;

                    foreach (PageActionBase action in simulatorModel.PageActionSequence)
                    {
                        // ha a lap benne van a listában, ideiglenesen eltesszük
                        if (action.Page == page.PageNumber)
                        {
                            pageWasInRequestList = true;

                            int notNeedTimeTmp = simulatorModel.PageActionSequence.IndexOf(action);

                            if (notNeedTimeTmp > notNeedMaxTime)
                            {
                                notNeedMaxTime = notNeedTimeTmp;
                                pageTmp = page;
                            }
                            break;
                        }
                    }

                    // ha a lap nem volt a várakozási listában, ki lehet vinni, többé nincs rá szükség
                    if (pageWasInRequestList == false) 
                    {
                        pageTmp = page;
                        break;
                    }
                }

                // Mostanra már biztosan talált egy kivihető lapot
                if (pageTmp != null)
                {
                    int index = pageRecord.Pages.IndexOf(pageTmp);
                    PageRecord clone = MyCloner.DeepClone<PageRecord>(pageRecord);
                    clone.ReplaceExistingPageWithNewPage(pageTmp, i);
                    clone.setTimestampOnPage(i, simulatorModel.StepCounter);
                    return clone;
                }
                // elvileg ide nem juthat az algoritmus
                throw new NotImplementedException();
                


            }
            return null;
        }