Esempio n. 1
0
        /// <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";
        }
Esempio n. 2
0
        /// <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);
        }