Beispiel #1
0
        public void DisplayPageContent(int id, int number)
        {
            try
            {
                ProcessPages pages = ProcessPages.FirstOrDefault(x => x.Id == id);

                // ReSharper disable once PossibleNullReferenceException
                if (pages.IsPageInMemory(number))
                {
                    Console.WriteLine("Zawarość ramki nr " + number + ": ");
                    Console.WriteLine();
                    _physicalMemory.GetFrame(pages.ReadFrameNumber(number)).ShowAllocationUnit();
                }
                else
                {
                    Console.WriteLine("Danej strony nie ma w pamięci.");
                }
            }
            catch (Exception)
            {
                Console.WriteLine("Nie ma danego procesu w pamieci.");
            }
        }
Beispiel #2
0
        public void DisplayPageList(int id)
        {
            try
            {
                ProcessPages pages = ProcessPages.SingleOrDefault(x => x.Id == id);

                // ReSharper disable once PossibleNullReferenceException
                for (int i = 0; i < pages.PagesCount; i++)
                {
                    if (pages.IsPageInMemory(i))
                    {
                        Console.WriteLine("Strona " + i + " znajduje się w ramce nr " + pages.ReadFrameNumber(i));
                    }
                    else
                    {
                        Console.WriteLine("Strona " + i + " nie ma przypisanej ramki.");
                    }
                }
            }
            catch (NullReferenceException)
            {
                Console.WriteLine("Tego procesu nie ma w pamięci");
            }
        }
Beispiel #3
0
        public void AllocateMemory(PCB processData, string program)
        {
            //obliczenie ilosci stron
            int pages = (int)Math.Ceiling((double)program.Length / FramesSize);

            //przypisnie Stron procesu i delegatow do Listy stron i do PCB
            ProcessPages temp = new ProcessPages(processData.PID, pages);

            temp.GetChar       = GetByte;
            temp.ChangeByteDel = ChangeByte;
            ProcessPages.Add(temp);
            processData.MemoryBlocks = temp;
            processData.MaxMemory    = program.Length - 1;

            //uzupelnienie stron
            var frames = new List <AllocationUnit>();

            for (int i = 0; i < pages; i++)
            {
                frames.Add(new AllocationUnit(FramesSize));
                frames[i].WriteAllocationUnit(program.Select(x => x)
                                              .Skip(FramesSize * i)
                                              .Take((program.Length - FramesSize * i < FramesSize) ? program.Length - FramesSize * i : FramesSize)
                                              .ToArray());
            }

            //Dodanie danych do pliku wymiany
            ExchangeFileProcess newProcess = new ExchangeFileProcess()
            {
                TakenProcessPages = temp,
                TakenFrames       = frames
            };

            _exchangeFile.PlaceIntoMemory(newProcess);

            //sprawdzenie czy mozna dodac pierwsza strone do pamieci
            if (_freeFramesList.FreeFramesCount >= 1)
            {
                //przypisanie indexu ramki do ktorej zostanie wprowadzona strona
                int index = _freeFramesList.RemoveFromList();
                //dodanie numeru ramki do kolejki
                _fifoQueue.AddFrame(new FrameData()
                {
                    FrameNumber = index,
                    Id          = processData.PID
                });
                //wprowadzenie 0 strony do pamieci fizycznej
                _physicalMemory.SetFrame(index, frames[0].ReadAllocationUnit());
                //wprowadzenie do tablicy stron ze strona 0 znajduje sie w danym miejscu
                foreach (ProcessPages process in ProcessPages)
                {
                    if (process.Id == processData.PID)
                    {
                        process.AddFrame(0, index);
                    }
                }
            }
            else
            {
                //zdjecie z kolejki ramki w ktorej znajduje sie najstarsza strona
                var indexprocessdata = _fifoQueue.RemoveFrame();
                //wpisanie do tablicy stron ze dana strona zostala zdjeta
                RemoveFrame(indexprocessdata.Id, indexprocessdata.FrameNumber);
                //dodanie do listy wolnych ramek
                _freeFramesList.AddToList(indexprocessdata.FrameNumber);
                //zabranie ze listy wolnych ramek pierwszej wolnej ramki
                int index = _freeFramesList.RemoveFromList();
                //dodanie strony do kolejki
                _fifoQueue.AddFrame(new FrameData()
                {
                    FrameNumber = index,
                    Id          = processData.PID
                });
                //wprowadzenie do pamieci fizycznej danej strony
                _physicalMemory.SetFrame(index, frames[0].ReadAllocationUnit());
                //wpisanie do tablicy stron ze dana strona znajduje sie w pamieci
                foreach (var processPage in ProcessPages)
                {
                    if (processPage.Id == processData.PID)
                    {
                        processPage.AddFrame(0, index);
                    }
                }
            }
        }