/// <summary> /// Конструктор заточен под 32 бита и 4096 размер страниц /// </summary> /// <param name="bitDepth">разрядность</param> /// <param name="hardware">железо в машине</param> /// <param name="pageSize">размер страницы</param> public OS(int bitDepth, Hardware hardware, int pageSize) { PageMaxAge = 70; this.PageSize = pageSize; BitDepth = bitDepth; this.hardware = hardware; int freePageCount = 0; for (int i = 0; i < hardware.RamSlotsNumber; i++) { freePageCount += (hardware.RAMs[i].ByteCells.Length * 4) / pageSize; // число блоков по 32 бита * 4 = число байт. Поделим на размер страницы в байтах и получим число страниц } this.FreePages = new List <int>(); for (int i = 0; i < freePageCount; i++) { FreePages.Add(i); } processes = new List <Process>(); // // Создаю директорию в которой будут храниться текстовики для каждого процесса (один процесс = один файл) // Directory.CreateDirectory(Directory.GetCurrentDirectory() + "\\Processies"); CurrentDirectoryName = Directory.GetCurrentDirectory() + "\\Processies"; }
/// <summary> /// "Убивает" процесс с указанным индексом в списке процессов /// </summary> /// <param name="processIndex"></param> public void KillProcess(int pid) { int processIndex = 0; for (int i = 0; i < processes.Count; i++) { if (processes[i].PID == pid) { processIndex = i; break; } } for (int i = 0; i < processes[processIndex].PageTable.Size; i++) { // // очистил страницы // uint adress = ConvertToRealPhysicalAdress(processes[processIndex].PageTable.PageTableEntries[i].Adress); RAM ram = AppropriatePhysicalRamBlock(adress); ClearPage(ref ram.ByteCells, ram.PhysicalAdress, adress); // // добавить в список свободных страниц // if (processes[processIndex].PageTable.PageTableEntries[i].Present) { FreePages.Add(processes[processIndex].PageTable.PageTableEntries[i].Adress); } } // страницы, занимаемые таблицей тоже надо очистить uint realAdress = 0; for (int i = 0; i < hardware.RAMs.Length; i++) { bool isCorrect; realAdress = processes[processIndex].PageTable.GetRealPhysicalAdress(ref hardware.RAMs[i], out isCorrect); if (isCorrect) { break; } } // // Тут по хорошему надо бы проверку на значение isCorrect, но не буду делать (посмотрим, что получится) // int pageCount = processes[processIndex].PageTable.Size * (bitDepth / 8) / PageSize; for (int i = 0; i < pageCount; i++) { int pageNumber = ConvertRealAdressToPageNumber(realAdress); FreePages.Add(pageNumber); } processes[processIndex].PageTable.Clear(); FreePages.Sort(); File.Delete(CurrentDirectoryName + "\\" + processes[processIndex].FileName); processes.RemoveAt(processIndex); }