- •Системное программное обеспечение Учебное пособие
- •Введение
- •1.Основные понятия
- •1.1.Функции и ресурсы ос
- •1.2.Структура программного обеспечения
- •1.3.Режимы функционирования компьютера
- •1.4.Классификация ос
- •1.5.Состав ос
- •2.Управление памятью
- •2.1. Основная память
- •2.2.Регистровая память
- •2.3.Кэш память
- •2.4.Организация основной памяти
- •2.4.1.Режимы работы процессоров Intel
- •2.4.2.Преобразование логического адреса в физический в реальном режиме
- •2.4.3.Адресация памяти в защищенном режиме
- •2.5.Управление памятью
- •2.5.1.Модели памяти
- •2.5.2.Динамическое распределение памяти
- •2.5.3.Динамическое распределение памяти в windows nt
- •2.5.4.Функции ос по управлению основной памятью
- •2.6.Виртуальная память
- •2.6.1.Преобразование виртуального адреса в реальный
- •2.6.2.Страничная организация
- •2.6.3.Сегментная организация
- •2.6.4.Странично-сегментная организация
- •2.6.5.Сплошная модель памяти flat
- •2.6.6.Функции для доступа к виртуальной памяти
- •2.6.6.1Освобождение виртуальной памяти
- •2.6.6.2Фиксирование страниц основной памяти
- •2.6.7.Стратегии управления виртуальной памятью
- •2.6.7.1Определение оптимального размера страниц
- •2.6.7.2Поведение программ при подкачке страниц
- •3.Процессы и задачи. Мультипроцессорные системы
- •3.1.Управление процессами
- •3.1.1.Блок управления процессом (pcb)
- •3.1.2.Управление асинхронными параллельными процессами
- •3.2.Мультизадачность
- •3.2.1.Виды мультизадачности:
- •3.2.2.Процессы и задачи
- •3.2.3.Распределение времени между задачами
- •3.2.4.Процессовая мультизадачность
- •3.2.5.Потоковая мультизадачность
- •3.2.6. Синхронизация задач
- •3.2.6.1Ожидание завершения задачи или процесса
- •3.2.6.2Синхронизация с помощью событий
- •3.2.7.Взаимоисключение
- •3.2.7.1Критические секции в программном интерфейсе windows
- •3.2.7.2Блокирующие функции
- •3.2.8.Семафоры
- •3.3.Тупики
- •3.3.1.Условия возникновения тупика
- •3.3.2.Предотвращение тупиков
- •3.3.3. Обход тупиков
- •3.3.4.Обнаружение тупиков
- •3.3.5.Восстановление после тупика
- •3.4.Средства обеспечения мультизадачности в защищенном режиме работы процессора Intel
- •3.4.1.Переключение задач
- •3.5.Обработка прерываний
- •3.5.1.Обработка прерываний в защищенном режиме
- •3.5.2.Обработка аппаратных прерываний
- •3.6.Управление потоками заданий. Планирование заданий и загрузка процессоров
- •3.6.1.Цели планирования
- •3.6.2.Критерии планирования
- •3.6.3.Дисциплины планирования
- •3.6.4.Многоуровневые очереди с обратными связями
- •3.7.Мультипроцессорные архитектуры. Планирование загрузки ресурсов
- •3.7.1.Параллелизм
- •3.7.2.Цели мультипроцессорных систем
- •3.7.3.Автоматическое распараллеливание
- •3.7.3.1Расщепление цикла
- •3.7.3.2Редукция высоты дерева
- •3.7.4.Мультипроцессорные операционные системы
- •3.7.5.Организация мультипроцессорных операционных систем
- •3.7.6.Производительность мультипроцессорных систем
- •3.7.7.Экономическая эффективность мультипроцессорных систем
- •3.7.8.Восстановление после ошибок
- •3.7.9.Перспективы мультипроцессорных систем
- •4.Управление внешней памятью и файловые системы
- •4.1.Структура дискового тома. Таблица разделов
- •4.2.Управление данными
- •4.2.1.Организация данных
- •4.2.2.Методы доступа
- •4.3. Файловые системы
- •4.3.1.Файловая система fat
- •4.3.2.Файловая система fat32
- •4.3.3.Функции windows api для работы с директориями
- •4.3.4.Файловая система windows 95
- •4.3.5.Файловая система нpfs (os/2)
- •4.3.5.1 Структура тома
- •4.3.5.2Файлы и Fnodes
- •4.3.5.3Каталоги
- •4.3.5.4Расширенные атрибуты
- •4.3.5.5Инсталлируемые файловые системы
- •4.3.5.6Проблемы эффективности
- •4.3.5.7Отказоустойчивость
- •4.3.6.Файловая система ntfs (Windows nt)
- •4.3.6.1Главная файловая таблица
- •4.3.6.2Атрибуты файла ntfs
- •4.3.6.3Длинные и короткие имена файлов
- •4.3.6.4Потоки данных
- •4.3.6.5Согласованность с posix
- •4.4.Асинхронные операции с файлами
- •4.5.Файлы, отображаемые на память
- •4.5.1.Создание отображения файла
- •4.5.2.Выполнение отображения на память
- •5.Средства ввода информации
- •5.1.Аппаратные и программные средства ввода информации с клавиатуры
- •5.1.1.Анализ и преобразование скэн-кода
- •5.1.2.Буфер клавиатуры
- •5.1.3.Схема работы буфера
- •5.1.4.Ввод информации с клавиатуры в Windows
- •5.1.4.1Поддержка горячих клавиш (нot-key)
- •5.1.4.2Языки и локализация
- •5.2.Управление манипулятором "мышь"
- •5.2.1.Аппаратные средства манипулятора
- •5.2.2.Программная поддержка "мыши" (на примере ms dos)
- •5.2.3.Основные функции интерфейса программы с манипулятором "мышь" (int 33н)
- •5.2.4.Чтение позиции курсора и состояния кнопок "мыши"
- •5.2.5.Управление мышью в приложениях Windows
- •5.2.5.1Обработка двойного щелчка (Double-Click Messages)
- •5.2.5.2Сообщения неклиентской области
- •5.2.5.3Активизация окна
- •6.Сетевые операционные системы
- •Литература
- •Оглавление
- •Учебное издание
- •394026 Воронеж, Московский просп., 14
2.5.2.Динамическое распределение памяти
Для сегментированных моделей предусмотрено динамическое выделение памяти из ближнего (near) или дальнего (far) пулов. Функции для динамического распределения или перераспределения памяти определены в стандарте ANSI и включены практически во все библиотеки систем программирования на С. Прототипы функций для распределения памяти описаны в заголовочном файле <alloc.Н> (еще и в <malloc.Н>, <memory.Н> и т.п.).
Чтобы выделить блок памяти, используют функцию:
void *malloc(int size);
Параметром этой функции является запрашиваемое количество байт основной памяти. Эта функция возвращает адрес на начало выделенной динамической области.
Например:
int *p = (int*) malloc (1024);
- запpашивается область в 1К для хранения целых данных. float *p = (float*) malloc (1024);
- запpашивается область в 1К для хранения данных вещественного типа.
void *calloc(int items, int size_item);
- позволяет выделить заданное количество объектов указанного типа.
Передаются количество объектов и протяженность одного объекта.
При выделении памяти все пространство обнуляется.
Например:
int *p = (int*) calloc(256, sizeof(int));
- выделение памяти под 256 объектов длиной sizeof(int).
void *realloc (void *addr, int size); - перераспределение памяти. Первый параметр содержит адрес существующей области, второй параметр - новый размер этой области. Если изменение размера может быть выполнено, функция возвращает указатель на новую область.
Все эти функции в случае аварийного завершения возвращают нулевой указатель, т.е. NULL.
Для освобождения памяти используется функция
void free (void *adr);
которой передается адрес освобождаемой области.
Набор функций с префиксом far позволяют работать с дальним пулом. Например, farmalloc.
2.5.3.Динамическое распределение памяти в windows nt
При программировании под MS Windows 3.х можно создать динамически распределенные области в локальном и глобальном пулах. Локальный пул выделяется каждому процессу, действующему в системе, а глобальный пул является общим для всех процессов. Выделение памяти из локального пула - LocalAlloc, выделение памяти из глобального пула - GlobalAlloc. Данные функции возвращают идентификатор выделенной области, т.е. некоторый номер, под которым эта область зарегистрирована в ОС. Чтобы получить зарегистрированную область в пользование, выполняют функцию GlobalLock, которая возвращает указатель. Снимается фиксация с помощью функции GlobalUnLock. GlobalFree - освободить ранее зарезервированную память.
В ОС WINDOWS 95 и WINDOWS NT нет разделения на локальные и глобальные пулы, поскольку адресные пространства всех приложений разделены. Каждое приложение работает в своем виртуальном адресном пространстве. Приложению по умолчанию выделяется один стандартный пул равный 1М и при необходимости приложение может создавать произвольное количество динамических пулов.
Ранее рассмотренные функции типа malloc, GlobalAlloc и т.п. позволяют выделять память из стандартного пула.
В программном интерфейсе Win32 API имеется несколько функций для работы с пулами. Всем функциям, используемым для распределения памяти, передается идентификатор пула, который имеет тип HANDLE. Для получения идентификатора стандартного пула существует функция: GetProcessНeap (void); которая возвращает данный идентификатор.
Для создания динамического пула применяется функция: HANDLE НeapСreate (DWORD flOptions,
DWORD dwInitialSize,
DWORD dwMaximumSize);
Тип DWORD соответствует unsigned long.
Первый параметр - флаги. Допустимы следующие сочетания: HEAP_GENERATE_EXEPTIONS - генерировать исключение при аварийном завершении; HEAP_NO_SERIALIZE - не выполнять блокировку одновременного обращения к пулу нескольких задач одного процесса. Сочетание этих флагов может быть обеспечено операцией логического сложения (дизъюнкцией).
Второй параметр - начальная длина пула;
Третий параметр - максимальная протяженность пула (если неизвестна, то = 0).
Функция разрушения динамического пула:
BOOL НeapDestroy (НANDLE ННeap);
Ей передается идентификатор пула, а возвращается логическое значение.
Получение блока памяти в пуле:
LPVOID НeapAlloc (НANDLE ННeap,
DWORD dwFlags,
DWORD dwBytes);
1 параметр - идентификатор пула;
2 параметр - рассмотренные ранее флаги и HEAP_ZERO_MEMORY, который позволяет обнулить выделенное пространство;
3 параметр - протяженность блока памяти.
Функция возвращает указатель на выделенную область памяти (LPVOID - дальний указатель на тип void: void far*).
Изменение протяженности ранее выделенного пространства:
LPVOID НeapRealloc (НANDLE ННeap,
DWORD dwFlags,
LPVOID lpMem,
DWORD dwBytes);
2 параметр - флаги. Используются все предыдущие + HEAP_REALLOC_IN_PLACE_ONLY (не изменять начальный адрес области);
3 параметр - адрес исходного блока;
4 параметр - новая протяженность.
Если нет ошибок, возвращается указатель на область нового размера.
Чтобы определить размер пула используется следующая функция:
DWORD НeapSize (НANDLE ННeap,
DWORD dwFlags,
LPVOID lpMem);
значения параметров флагов могут быть "0" или HEAP_NO_SERIALIZE.
Освобождение выделенного блока:
BOOL НeapFree(НANDLE ННeap,
DWORD dwFlags,
LPVOID lpMem);
значение флагов те же.