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

Заказать уникальную курсовую работу
Тип работы: Курсовая работа
Предмет: Linux, Unix
  • 15 15 страниц
  • 4 + 4 источника
  • Добавлена 27.04.2009
1 000 руб.
  • Содержание
  • Часть работы
  • Список литературы
  • Вопросы/Ответы

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


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

(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 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 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 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);
}
}
else {
printf("Процесс не работает с памятью\n");
}
}

void print_map(void){
unsigned int i;
printf("Карта:\n");
for(i=0;i printf("0x%04x -> 0x%04x | 0x%04x | %hhx\n", i, page_map[i].page_block, page_map[i].flags, page_map[i].counter);
}
}

void print_stats(void){
unsigned int i;
struct stats sum = {0,0,0,0,0};
printf("Статистика по страницам: \n");
printf("PGNUM | R| W| F| C| D|\n");
for(i=0;i printf("0x%04x|%4d|%4d|%4d|%4d|%4d|\n", i, page_stats[i].reads,
page_stats[i].writes, page_stats[i].faults, page_stats[i].caches, page_stats[i].deletes);
sum.reads += page_stats[i].reads;
sum.writes += page_stats[i].writes;
sum.faults += page_stats[i].faults;
sum.caches += page_stats[i].caches;
sum.deletes += page_stats[i].deletes;
}
printf("ИТОГО:\n");
printf(" |%4d|%4d|%4d|%4d|%4d|\n", sum.reads,
sum.writes, sum.faults, sum.caches, sum.deletes);
printf("\n");
}

int main(void) {
unsigned int i, j; // счётчики циклов
unsigned char byte;
srand((unsigned int)time(NULL));
unsigned char a = 128;
printf("Инициализация\n");
for(i=0;i byte = random() % 255;
// В любом случае сохраняем страницу в подкачку
for(j=0;j swap[addr(i, j)] = byte;
}
if(i for(j=0;j phy_mem[addr(i, j)] = byte;
}
page_map[i].page_block = i; // Номер блока совпадает
page_map[i].flags = 0; // Все флаги 0
}
else {
page_map[i].flags = 0 | PAGE_CACHED; // Флаг "страница на диске"
}
page_map[i].counter = 0;
}
print_map();
// Основной цикл модели
for(step=0;step printf("---------- Шаг %d ------------\n", step);
process_tick();
// Устаревание счётчиков
if(step % DECAY_FREQ == 0){
decay();
}
}
print_map();
print_stats();
}
Приложение 2. Пример работы программы
Инициализация
Карта:
0x0000 -> 0x0000 | 0x0000 | 0
0x0001 -> 0x0001 | 0x0000 | 0
0x0002 -> 0x0002 | 0x0000 | 0
0x0003 -> 0x0003 | 0x0000 | 0
0x0004 -> 0x0004 | 0x0000 | 0
0x0005 -> 0x0005 | 0x0000 | 0
0x0006 -> 0x0006 | 0x0000 | 0
0x0007 -> 0x0007 | 0x0000 | 0
0x0008 -> 0x0000 | 0x0004 | 0
0x0009 -> 0x0000 | 0x0004 | 0
0x000a -> 0x0000 | 0x0004 | 0
0x000b -> 0x0000 | 0x0004 | 0
0x000c -> 0x0000 | 0x0004 | 0
0x000d -> 0x0000 | 0x0004 | 0
0x000e -> 0x0000 | 0x0004 | 0
0x000f -> 0x0000 | 0x0004 | 0
---------- Шаг 0 ------------
Процесс записывает 0x67 в стек по адресу 0xfc3b (0x000f:0x0c3b)
Исключение при обращении к странице 0x000f
Удаление случайной страницы со счётчиком 0
8 кандидатов на удаление
Страница 0x0000 (счётчик 0) не изменялась и удаляется
Запись по физическому адресу 0x0c3b
Очистка
---------- Шаг 1 ------------
Процесс запрашивает случайный адрес 0x4490 (0x0004:0x0490)
Чтение по физическому адресу 0x4490
---------- Шаг 2 ------------
Процесс не работает с памятью
---------- Шаг 3 ------------
Процесс запрашивает в стеке адрес 0xf506 (0x000f:0x0506)
Чтение по физическому адресу 0x0506
---------- Шаг 4 ------------
Процесс не работает с памятью
---------- Шаг 5 ------------
Процесс запрашивает в стеке адрес 0xe357 (0x000e:0x0357)
Исключение при обращении к странице 0x000e
Удаление случайной страницы со счётчиком 0
7 кандидатов на удаление
Страница 0x0005 (счётчик 0) не изменялась и удаляется
Чтение по физическому адресу 0x5357
Очистка
---------- Шаг 6 ------------
Процесс записывает 0x24 в стек по адресу 0xfd2c (0x000f:0x0d2c)
Запись по физическому адресу 0x0d2c
---------- Шаг 7 ------------
Процесс запрашивает случайный адрес 0x942d (0x0009:0x042d)
Исключение при обращении к странице 0x0009
Удаление случайной страницы со счётчиком 0
5 кандидатов на удаление
Страница 0x0003 (счётчик 0) не изменялась и удаляется
Чтение по физическому адресу 0x342d
---------- Шаг 8 ------------
Процесс запрашивает случайный адрес 0xfff8 (0x000f:0x0ff8)
Чтение по физическому адресу 0x0ff8
---------- Шаг 9 ------------
Процесс записывает 0x38 в стек по адресу 0xebab (0x000e:0x0bab)
Запись по физическому адресу 0x5bab
---------- Шаг 10 ------------
Процесс запрашивает в стеке адрес 0xf0e4 (0x000f:0x00e4)
Чтение по физическому адресу 0x00e4
Очистка
<Шаги с 11 по 9998 здесь не приводятся>
---------- Шаг 9999 ------------
Процесс записывает 0x06 в стек по адресу 0xfaf5 (0x000f:0x0af5)
Запись по физическому адресу 0x0af5
Карта:
0x0000 -> 0x0005 | 0x0004 | 0
0x0001 -> 0x000d | 0x0004 | 0
0x0002 -> 0x0003 | 0x0004 | 0
0x0003 -> 0x000b | 0x0004 | 0
0x0004 -> 0x0007 | 0x0000 | 0
0x0005 -> 0x0004 | 0x0002 | c0
0x0006 -> 0x0002 | 0x0004 | 0
0x0007 -> 0x000b | 0x0004 | 0
0x0008 -> 0x0003 | 0x0000 | 0
0x0009 -> 0x0000 | 0x0002 | 0
0x000a -> 0x0003 | 0x0002 | 0
0x000b -> 0x0001 | 0x0004 | 0
0x000c -> 0x0001 | 0x0004 | 0
0x000d -> 0x000c | 0x0000 | 40
0x000e -> 0x0003 | 0x0003 | c0
0x000f -> 0x0000 | 0x0003 | 80
Статистика по страницам:
PGNUM | R| W| F| C| D|
0x0000| 139| 79| 79| 61| 19|
0x0001| 133| 62| 65| 42| 24|
0x0002| 100| 49| 61| 37| 25|
0x0003| 117| 66| 72| 48| 25|
0x0004| 145| 60| 75| 40| 35|
0x0005| 121| 68| 74| 47| 27|
0x0006| 124| 70| 76| 50| 27|
0x0007| 113| 53| 72| 42| 31|
0x0008| 135| 73| 85| 58| 26|
0x0009| 139| 66| 74| 44| 29|
0x000a| 145| 69| 75| 48| 26|
0x000b| 124| 68| 69| 42| 27|
0x000c| 135| 66| 72| 44| 28|
0x000d| 112| 48| 73| 43| 29|
0x000e|3620|1791| 2| 1| 0|
0x000f|3683|1889| 4| 3| 0|
ИТОГО:
|9085|4577|1028| 650| 378|











4

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

Вопрос-ответ:

Какие принципы управления памятью применяются в современных операционных системах?

В современных операционных системах применяются различные принципы управления памятью, такие как статические разделы, виртуальная память и управление виртуальной памятью с использованием различных алгоритмов.

Что такое статические разделы при управлении памятью?

Статические разделы – это части оперативной памяти, которые выделяются для хранения различных компонентов программы, таких как код, данные и стек. Эти разделы имеют фиксированный размер и расположение.

Что такое виртуальная память и как она работает?

Виртуальная память – это механизм, который позволяет программам использовать больше памяти, чем физически доступно. Он создает виртуальные адреса, которые затем отображаются на физическую память. Если вся нужная память не умещается в физической памяти, то система выгружает часть данных на диск.

Как работает алгоритм NFU при управлении виртуальной памятью?

Алгоритм NFU (Not Frequently Used) используется для определения, какие страницы памяти должны быть выгружены на диск. Он работает на основе счетчика обращений к каждой странице – чем меньше обращений, тем больше вероятность, что страница будет выгружена. При каждом обращении счетчик увеличивается, и периодически счетчики сбрасываются.

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

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

Какая модель управления памятью используется в современных операционных системах?

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

Что такое статические разделы в управлении памятью?

Статические разделы - это части памяти, которые выделяются под определенные компоненты операционной системы, такие как ядро, драйвера и системные службы. Эти разделы зарезервированы и не могут использоваться другими процессами.

Как работает виртуальная память?

Виртуальная память - это механизм, который позволяет операционной системе использовать физическую память и дисковое пространство в качестве расширенной памяти. Виртуальная память делится на фиксированные блоки - страницы. Когда процесс обращается к странице, которая отсутствует в физической памяти, операционная система загружает её из диска.