Управление памятью в ОС UNIX и Windows по курсу Операционные системы
Работа добавлена на сайт samzan.net:
Санкт-Петербургский государственный политехнический университет
Факультет технической кибернетики
Кафедра информационной безопасности компьютерных систем
ОТЧЕТ
по лабораторной работе №4
«Управление памятью в ОС UNIX и Windows»
по курсу «Операционные системы»
Студент:
Никитин А. С.
гр. 2088/1
Преподаватель:
Степанова Т. В.
Санкт-Петербург 2011
1. Формулировка задания
Цель работы изучение аспектов организации работы с внутренней и внешней памятью в ОС семейств Unix и Windows.
2. Использованные теоретические сведения
3. Результаты работы
3.1. Выполнение индивидуального задания
Напишите набор программ, удовлетворяющих теоретическому понятию оверлея. Каждый оверлей должен осуществлять какие-либо вычисления, выводя результаты в терминал, далее он передает управление другому оверлею из комплекса. Всего в комплексе должно быть не менее 4 оверлеев. Все оверлеи почти одинаковы, за исключением последнего, который не загружает новый оверлей, а просто завершает работу. #include <stdio.h>
intmain(intargc, char **argv) { inti; puts("Overlay #1"); for (i = 0; i < 10; i++) printf("%d ", i); //Оверлеи по очереди //выводят числа от 0 до 39 puts("\b"); execve("overlay2", NULL, NULL); //Запуск следующего оверлея return 0; }
Напишите программу, которая будет измерять среднее время доступа к внутренней и внешней памяти (чтение данных из оперативной памяти и с внешней памяти, в качестве которой выступает CD-ROM диск). Сравните и обоснуйте полученные результаты. #include <stdio.h> #include <time.h> #include "windows.h"
#defineN 134217728 //Будет производиться чтение 128 Мб из файла
intmain(intargc, char **argv) { HANDLEfile; char *src, *dest; longinttm; intrd; file = CreateFileA("E:\\Sleep.flac", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); //Открытие файла if (file == INVALID_HANDLE_VALUE) return 0; puts("Fileopened"); //Далее идёт выделение памяти под два буфера, в один из которых будет //прочитан файл, а во второй будет скопировано содержимое первого src = (char *) GlobalAlloc(GPTR, N*sizeof(char)); if (src == NULL) { CloseHandle(file); return 0; } dest = (char *) GlobalAlloc(GPTR, N*sizeof(char)); if (dest == NULL) { CloseHandle(file); GlobalFree(src); return 0; } puts("Memoryallocated"); tm = clock(); //Чтение файла ReadFile(file, (LPVOID) src, N*sizeof(char), (PDWORD) &rd, NULL); tm = clock() - tm; printf("Fileread - %ldms\n", tm); CloseHandle(file); //Закрытие файла tm = clock(); //Копирование памяти CopyMemory((PVOID) dest, (PVOID) src, (SIZE_T) N*sizeof(char)); tm = clock() - tm; printf("Memorycopied - %ldms\n", tm); GlobalFree(src); //Освобождение памяти GlobalFree(dest); return 0; }
Чтение с CD
Чтение из памяти
Первый запуск
34485 мс
93 мс
Второй запуск
140 мс
94 мс
После первого запуска программы, данные с CD-диска кешируются, и если сразу запустить программу второй раз, то чтение пройдёт гораздо быстрее.
3.2. Ответынаконтрольные вопросы
Где хранится адрес таблицы сегментов? Адрес таблицы сегментов хранится в дескрипторе процесса.
Предположим, что в адресном пространстве процесса располагаются таблицы используемых процессом сегментов и страниц. Каким образом ядро может выгрузить это пространство из памяти? Сначала выгружаются все страницы и сегменты, кроме тех, в которых хранятся таблицы. После этого можно выгрузить таблицы, но в дескрипторе процесса необходим дополнительный параметр, указывающий на факт выгрузки таблиц. После этого, при необходимости доступа к какой-либо странице, ядро сможет сначала загрузить таблицу, а потом необходимую страницу.
Что следует предпринять программе обработки отказов в том случае, если в системе исчерпаны страницы памяти? Необходимо выбрать одну из страниц, и выгрузить её. Как правило это страницы, к которым было меньше всего обращений за какой-то промежуток времени, или к которым дольше всего не было обращений.
4. Выводы
Механизмы, использующиеся для работы с памятью в ОС UNIX и Windows, повышают эффективность работы процессов, а также предоставляют некоторую свободу для программиста в реализации наиболее эффективной, по его мнению, работы с памятью его программы.