コード例 #1
0
 public void PlaceIntoMemory(ExchangeFileProcess data)
 {
     _takenProcesses.Add(data);
 }
コード例 #2
0
ファイル: Memory.cs プロジェクト: Arebisc/Vow-win-ski
        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);
                    }
                }
            }
        }