예제 #1
0
        public Page.STATUS FIFO(char data)
        {
            Page    newPage;
            PageRef refTemp = new PageRef();

            refTemp.refCount = 0;

            if (this.frame_window.Any <Page>(x => x.data == data))
            {
                newPage.pid    = Page.CREATE_ID++;
                newPage.data   = data;
                newPage.status = Page.STATUS.HIT;
                this.hit++;
                int i;

                for (i = 0; i < this.frame_window.Count; i++)
                {
                    if (this.frame_window.ElementAt(i).data == data)
                    {
                        break;
                    }
                }
                newPage.loc = i + 1;
            }
            else
            {
                newPage.pid  = Page.CREATE_ID++;
                newPage.data = data;

                if (frame_window.Count >= p_frame_size)
                {
                    newPage.status = Page.STATUS.MIGRATION;
                    this.frame_window.RemoveFirst();
                    cursor = p_frame_size;
                    this.migration++;
                    this.fault++;
                }
                else
                {
                    newPage.status = Page.STATUS.PAGEFAULT;
                    cursor++;
                    this.fault++;
                }

                newPage.loc = cursor;
                frame_window.AddLast(newPage);
            }
            pageHistory.Add(newPage);
            psudoTempII.Add(refTemp);

            return(newPage.status);
        }
예제 #2
0
        public Page.STATUS Lru(char data)
        {
            Page     newPage;
            PageTime timeTemp = new PageTime();
            PageRef  refTemp  = new PageRef();

            if (this.frame_window.Any <Page>(x => x.data == data))
            {
                newPage.pid    = Page.CREATE_ID++;
                newPage.data   = data;
                newPage.status = Page.STATUS.HIT;
                this.hit++;
                int i;

                for (i = 0; i < this.frame_window.Count; i++)
                {
                    if (this.frame_window.ElementAt(i).data == data)
                    {
                        notUsedTime.ElementAt(i).notUsedTime = 0;
                        refTemp.refCount = -2;
                        break;
                    }
                }

                for (int n = 0; n < frame_window.Count; n++)
                {
                    notUsedTime.ElementAt(n).notUsedTime++;
                }

                newPage.loc = i + 1;
            }
            else
            {
                newPage.pid  = Page.CREATE_ID++;
                newPage.data = data;

                if (frame_window.Count >= p_frame_size)
                {
                    newPage.status   = Page.STATUS.MIGRATION;
                    refTemp.refCount = 0;

                    int i = searchLongestTime(notUsedTime);
                    if (i < 1)
                    {
                        frame_window.RemoveFirst();
                        notUsedTime.RemoveFirst();
                        cursor = p_frame_size;
                        this.migration++;
                        this.fault++;
                    }
                    else
                    {
                        newPage.status   = Page.STATUS.MIGRATIONII;
                        refTemp.refCount = i;

                        RemoveAt(frame_window, i);
                        RemoveAt(notUsedTime, i);
                        cursor = p_frame_size;
                        this.migration++;
                        this.fault++;
                    }
                }
                else
                {
                    newPage.status   = Page.STATUS.PAGEFAULT;
                    refTemp.refCount = -1;
                    cursor++;
                    this.fault++;
                }

                newPage.loc          = cursor;
                timeTemp.notUsedTime = 0;

                frame_window.AddLast(newPage);
                notUsedTime.AddLast(timeTemp);

                for (int i = 0; i < notUsedTime.Count; i++)
                {
                    notUsedTime.ElementAt(i).notUsedTime++;
                }
            }
            pageHistory.Add(newPage);
            psudoTempII.Add(refTemp);
            return(newPage.status);
        }
예제 #3
0
        public Page.STATUS Opt(char[] dataArr, int n)
        {
            Page    newPage;
            PageRef refTemp = new PageRef();

            if (this.frame_window.Any <Page>(x => x.data == dataArr[n]))
            {
                newPage.pid      = Page.CREATE_ID++;
                newPage.data     = dataArr[n];
                newPage.status   = Page.STATUS.HIT;
                refTemp.refCount = -2;
                this.hit++;
                int i;


                for (i = 0; i < this.frame_window.Count; i++)
                {
                    if (this.frame_window.ElementAt(i).data == dataArr[n])
                    {
                        break;
                    }
                }
                newPage.loc = i + 1;
            }
            else
            {
                newPage.pid  = Page.CREATE_ID++;
                newPage.data = dataArr[n];

                if (frame_window.Count >= p_frame_size)
                {
                    if (IsEquals(frame_window, dataArr))
                    {
                        newPage.status = Page.STATUS.MIGRATIONII;

                        // 현재 큐에 존재하는 데이터이면서 쿼리 스트링에서 가장 먼 데이터를 찾음
                        // 그리고 큐에서 해당 인덱스를 삭제함
                        int k = Predict(this.frame_window, dataArr);
                        RemoveAt(this.frame_window, k);
                        refTemp.refCount = k;

                        cursor = p_frame_size;
                        this.migration++;
                        this.fault++;
                    }
                    else
                    {
                        newPage.status   = Page.STATUS.MIGRATION;
                        refTemp.refCount = 0;
                        this.frame_window.RemoveFirst();
                        cursor = p_frame_size;
                        this.migration++;
                        this.fault++;
                    }
                }
                else
                {
                    newPage.status   = Page.STATUS.PAGEFAULT;
                    refTemp.refCount = -1;
                    cursor++;
                    this.fault++;
                }

                newPage.loc = cursor;
                frame_window.AddLast(newPage);
            }
            pageHistory.Add(newPage);
            psudoTempII.Add(refTemp);

            return(newPage.status);
        }