Вход

Реализация модели страничного распределения памяти с выгрузкой страницы, к которой в последнее время было меньше всего обращений.

Рекомендуемая категория для самостоятельной подготовки:
Курсовая работа*
Код 317732
Дата создания 08 июля 2013
Страниц 15
Мы сможем обработать ваш заказ (!) 25 апреля в 12:00 [мск]
Файлы будут доступны для скачивания только после обработки заказа.
1 310руб.
КУПИТЬ

Содержание


1. Введение
2. Принципы управления памятью в современных ОС
2.1 Статические разделы
2.2 Виртуальная память
2.3 Управление виртуальной памятью. Алгоритм NFU.
3. Модель страничного распределения памяти с выгрузкой страниц, к которым в последнее время было меньше всего обращений.
3.1 Структура программы
3.2 Описание работы алгоритма моделирования управления памятью
3.3 Моделирование работы процесса
4. Заключение
5. Список литературы


Введение

Реализация модели страничного распределения памяти с выгрузкой страницы, к которой в последнее время было меньше всего обращений.

Фрагмент работы для ознакомления

unsigned int real_addr;
if(page_map[page_num].flags & PAGE_CACHED){
// Если страница находится на диске, сгенерировать page_fault
// и перезапустить команду
printf("Исключение при обращении к странице 0x%04x\n", page_num);
page_stats[page_num].faults++;
mmu_pagefault(page_num);
mmu_access(action, addr, value);
}
else {
real_addr = addr(page_map[page_num].page_block, offset(addr)); // получить реальный адрес
page_map[page_num].flags |= PAGE_READ; // Запомнить обращение к странице
page_stats[page_num].reads++;
if(action == PAGE_READ){ // Если указано действие "чтение", вернуть прочитанный байт
printf("Чтение по физическому адресу 0x%04x\n", real_addr);
returnphy_mem[real_addr]; // Вернуть значение, взятое из физической памяти
}
else if(action == PAGE_WRITE){ // Если указано действие "запись"
printf("Запись по физическому адресу 0x%04x\n", real_addr);
page_stats[page_num].writes++;
page_map[page_num].flags |= PAGE_WRITE; // Пометить страницу как "грязную"
phy_mem[real_addr] = value; // Записать указанный байт по нужному адресу
}
}
}
// Отработка прерывания
void mmu_pagefault(unsigned int page_num){
unsigned int i;
unsigned char min_counter = page_map[0].counter;
unsigned int swapped_page;
// Поиск наименьшего значения счётчика
for(i=0;i<VIRT_PAGES;i++){
if(!(page_map[i].flags & PAGE_CACHED)) {
if(page_map[i].counter <= min_counter){
min_counter = page_map[i].counter;
}
}
}
swapped_page = swap_random(min_counter);
for(i=0;i<PAGE_SIZE;i++){ // Скопировать страницу с диска в память
phy_mem[addr(swapped_page, i)] = swap[addr(page_num, i)];
}
page_map[page_num].flags &= ~PAGE_CACHED;
page_map[page_num].page_block = swapped_page;
page_map[page_num].counter = 0;
}
/*
* Вытеснение слуайной страницы в указанном классе
*/
int swap_random(unsigned int access_counter){
unsigned int candidats = 0;
unsigned int rnd; // Номер кандидата на удаление
unsigned int i, j, counter = 0; // Счетчики
unsigned int swapped_page = 0;
printf("Удаление случайной страницы со счётчиком %hhu\n", access_counter);
// Подсчёт количества кандидатов на удаление
for(i=0;i<VIRT_PAGES;i++){
if(!(page_map[i].flags & PAGE_CACHED)) {
if(page_map[i].counter == access_counter){
candidats++;
}
}
}
printf("%u кандидатов на удаление\n", candidats);
rnd = random() % candidats;
for(i=0;i<VIRT_PAGES;i++){
if(!(page_map[i].flags & PAGE_CACHED) && (page_map[i].counter == access_counter)){
if(counter == rnd){ // Найдена нужная страница
if(page_map[i].flags & PAGE_WRITE) { // Если страница "грязная"
printf("Страница 0x%04x (счётчик %d) изменилась и обновляется на диске\n", i, page_map[i].counter);
for(j=0;j<PAGE_SIZE;j++){ // Перезаписать её на диск
swap[addr(i, j)] = phy_mem[addr(page_map[i].page_block, i)];
}
page_stats[i].caches++;
}
else {
printf("Страница 0x%04x (счётчик %d) не изменялась и удаляется\n", i, page_map[i].counter);
page_stats[i].deletes++;
}
page_map[i].flags = 0 | PAGE_CACHED; // Обнуление флагов
page_map[i].counter = 0; // Обнуление счётчика
swapped_page = i;
break; // Остановить просмотр таблицы
}
counter++; // найдена страница в этом классе
}
}
return swapped_page;
}
// Периодически определять страницы с битом R и сдвигать счётчик
void decay(void){
int i; printf("Очистка\n");
for(i=0;i<VIRT_PAGES;i++){
if(!(page_map[i].flags & PAGE_CACHED)){ // Для незакешированных страниц
page_map[i].counter = ((page_map[i].counter & 0x80) >> 1) | ((page_map[i].flags & PAGE_READ) << 7);
page_map[i].flags &= ~PAGE_READ; // Очистить флаг обращения
}
}
}
// Моделирование работы процесса
void process_tick(void){
unsigned int action = random() % 100;
unsigned char value;
unsigned int rand_addr;
if(action <= 70){ // С 70% вероятностью процесс читает или записывает один байт в стек
// Случайный адрес из двух последних страниц
rand_addr = addr(VIRT_PAGES - 1 - (random() % 2), offset(random() % VIRT_MEM_SIZE));
if(random() % 2 == 0){
printf("Процесс запрашивает в стеке адрес 0x%04x (0x%04x:0x%04x)\n", rand_addr, page(rand_addr), offset(rand_addr));
value = mmu_access(PAGE_READ, rand_addr, 0);
}
else {
value = (unsigned char)(random() % 255);
printf("Процесс записывает 0x%02hhx в стек по адресу 0x%04x (0x%04x:0x%04x)\n", value, rand_addr, page(rand_addr), offset(rand_addr));
mmu_access(PAGE_WRITE, rand_addr, value);
}
}
else if(action > 70 && action <= 90){
// Случайный адрес
rand_addr = random() % VIRT_MEM_SIZE;
if(random() % 2 == 0){
printf("Процесс запрашивает случайный адрес 0x%04x (0x%04x:0x%04x)\n", rand_addr, page(rand_addr), offset(rand_addr));
value = mmu_access(PAGE_READ, rand_addr, 0);
}
else {
value = (char)(random() % 255);
printf("Процесс записывает 0x%02hhx по случайному адресу 0x%04x (0x%04x:0x%04x)\n", value, rand_addr, page(rand_addr), offset(rand_addr));
mmu_access(PAGE_WRITE, rand_addr, value);
}
}

Список литературы

1.Таненбаум Э. Современные операционные системы. 2-е изд – СПб.: Питер, 2002. – 1040с.: ил.
2.UNIX изнутри/ Ю.Вахалия. – СПб.: Питер,2003. – 844с.: ил.
3.Основы операционных систем. Курс лекций. Учебное пособие / В.Е. Карпов, К.А. Коньков / Под редакцией В.П. Иванникова. – М.: ИНТУИТ.РУ «Интернет-Университет Информационных Технологий», 2005. – 536с.
4.Соловьев Г.Н., Никитин В.Д., Операционные системы ЭВМ: Учеб пособие для студентов вузов, обучающихся по спец. «ЭВМ, сист, копмл. и сети» и «Автом. сист. обр. инф. и упр. » - М.: Высш шк., 1989. – 255с.: ил.
Очень похожие работы
Пожалуйста, внимательно изучайте содержание и фрагменты работы. Деньги за приобретённые готовые работы по причине несоответствия данной работы вашим требованиям или её уникальности не возвращаются.
* Категория работы носит оценочный характер в соответствии с качественными и количественными параметрами предоставляемого материала. Данный материал ни целиком, ни любая из его частей не является готовым научным трудом, выпускной квалификационной работой, научным докладом или иной работой, предусмотренной государственной системой научной аттестации или необходимой для прохождения промежуточной или итоговой аттестации. Данный материал представляет собой субъективный результат обработки, структурирования и форматирования собранной его автором информации и предназначен, прежде всего, для использования в качестве источника для самостоятельной подготовки работы указанной тематики.
bmt: 0.00765
© Рефератбанк, 2002 - 2024