public void PlaceIntoMemory(ExchangeFileProcess data) { _takenProcesses.Add(data); }
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); } } } }