- •Введение
- •1. Основные понятия системного программного обеспечения
- •1.1. Понятия прикладного и системного программного обеспечения
- •1.2. Состав системного программного обеспечения
- •2. Состав и архитектура операционных систем
- •2.1. Состав операционных систем
- •2.2. Архитектура ос
- •3. Процессы и потоки
- •3.1. Концепция процессов и потоков
- •3.2. Многозадачность. Формы программной работы
- •3.3. Подсистема управления процессами и потоками
- •3.4. Роль процессов, потоков и волокон в многозадачности
- •3.5. Создание процессов
- •3.6. Потоки и их модели
- •3.7. Планирование и синхронизация процессов и потоков
- •3.7.1. Виды планирования
- •3.7.2. Алгоритмы планирования потоков
- •3.7.3. Алгоритмы приоритетного планирования
- •3.7.4. Взаимоисключения
- •3.7.5. Семафоры
- •3.7.6. Тупики
- •4. Управление памятью
- •4.1. Функции ос по управлению памятью
- •4.2. Классификация методов распределения памяти
- •4.3. Распределение памяти без использования внешней памяти
- •4.4. Методы структуризации виртуальной памяти
- •4.4.1. Страничная организация виртуальной памяти
- •4.4.2. Сегментная организация виртуальной памяти
- •4.4.3. Странично-сегментная организация памяти
- •5. Файловые системы
- •5.1. Цели и задачи файловой системы
- •5.2. Организация файлов и доступ к ним
- •5.3. Логическая организация файла
- •5.4. Каталоговые системы
- •5.5. Основные возможности файловой системы ntfs
- •5.6. Структура тома с файловой системой ntfs
- •5.7. Возможности ntfs по ограничению доступа к файлам и каталогам
- •6. Управление вводом-выводом
- •6.1. Физическая организация устройств ввода-вывода
- •6.2. Организация программного обеспечения ввода-вывода
- •6.3. Обработка прерываний
- •6.4. Драйверы устройств
- •6.5. Независимый от устройств слой ос
- •6.6. Пользовательский слой программного обеспечения
- •7. Построение операционных систем
- •7.1. Принципы построения операционных систем
- •7.1.1. Принцип модульности
- •7.1.2. Принцип функциональной избирательности
- •7.1.3. Принцип генерируемости ос
- •7.1.4. Принцип функциональной избыточности
- •7.1.5. Принцип виртуализации
- •7.1.6. Принцип независимости программ от внешних устройств
- •7.1.7. Принцип совместимости
- •7.1.8. Принцип открытой и наращиваемой ос
- •7.1.9. Принцип мобильности
- •7.1.10. Принцип обеспечения безопасности вычислений
- •7.2. Построение интерфейсов операционных систем
- •7.3. Интерфейс прикладного программирования
- •7.3.1. Реализация функций api на уровне ос
- •7.3.2. Реализация функций api на уровне системы программирования
- •7.3.3. Реализация функций api с помощью внешних библиотек
- •7.4. Классификация системных вызовов
- •7.5. Интерфейс пользователя
- •7.6. Пользовательский интерфейс приложений
- •7.7. Архитектура, управляемая событиями
- •8. Семейство операционных систем unix
- •8.1. Основные понятия системы unix
- •8.1.1. Виртуальная машина
- •8.1.2. Пользователь
- •8.1.3. Интерфейс пользователя
- •8.1.4. Привилегированный пользователь
- •8.1.5. Команды
- •8.1.6. Процессы
- •8.1.7. Выполнение процессов
- •8.1.8. Структура файловой системы
- •8.2. Операционная система Linux
- •9.1.2. Определение компилятора. Отличие компилятора от транслятора
- •9.1.3. Определение интерпретатора. Разница между интерпретаторами и трансляторами
- •9.1.4. Этапы трансляции. Общая схема работы транслятора
- •9.1.5. Понятие прохода. Многопроходные и однопроходные компиляторы
- •9.2. Таблицы идентификаторов. Организация таблиц идентификаторов
- •9.2.1. Назначение таблиц идентификаторов
- •9.2.2. Принципы организации таблиц идентификаторов
- •9.2.3. Простейшие методы построения таблиц идентификаторов
- •9.2.4. Построение таблиц идентификаторов по методу бинарного дерева
- •9.2.8. Комбинированные способы построения таблиц идентификаторов
- •9.3. Лексические анализаторы
- •9.3.1. Назначение лексического анализатора
- •9.3.2. Принципы построения лексических анализаторов
- •9.3.3. Определение границ лексем
- •9.3.4. Выполнение действий, связанных с лексемами
- •9.4. Формальные языки и грамматики
- •9.4.1. Первичные понятия
- •9.4.2. Примеры, иллюстрирующие первичные понятия
- •9.4.3. Типы формальных языков и грамматик
- •9.4.3.1. Грамматики типа 0
- •9.4.3.2. Грамматики типа 1
- •9.4.3.3. Грамматики типа 2
- •9.4.3.4. Грамматики типа 3
- •9.4.3.5. Вывод в кс-грамматиках и правила построения дерева вывода
- •9.4.3.6. Синтаксический разбор
- •9.4.3.7. Левый и правый выводы
- •9.4.3.8. Неоднозначные и эквивалентные грамматики
- •9.4.4. Способы задания схем грамматик
- •9.4.4.1. Форма Наура-Бэкуса
- •9.4.4.2. Итерационная форма
- •9.4.4.3. Синтаксические диаграммы
- •9.4.5. Построение грамматик и грамматики, описывающие основные конструкции языков программирования
- •9.4.5.1. Рекомендации по построению грамматик
- •9.4.5.2. Описание списков
- •9.4.5.3. Пример построения грамматик
- •9.4.5.4. Грамматики, описывающие целые числа без знака и идентификаторы
- •9.4.5.5. Грамматики для арифметических выражений
- •9.4.5.6. Грамматика для описаний
- •9.4.5.7. Грамматика, задающая последовательность операторов присваивания
- •9.4.5.8. Грамматики, описывающие условные операторы и операторы цикла
- •9.4.5.9. Бесскобочные выражения
- •9.4.5.10. Префиксная польская запись
- •9.4.5.11. Вычисление префиксных польских записей
- •9.4.5.12. Постфиксная польская запись
- •9.4.5.13. Вычисление постфиксных записей
- •9.5. Конечные автоматы и регулярные грамматики
- •9.6. Макроязыки и макрогенерация
- •9.6.1. Определения макрокоманд и макрогенерации
- •9.6.2. Примеры макрокоманд
- •9.6.3. Макроязыки и препроцессоры
- •Заключение
- •Библиографический список
- •Оглавление
- •394026 Воронеж, Московский просп., 14
9.4.5.10. Префиксная польская запись
Определение. Префиксную польскую запись (ПрПЗ) определим так.
1) Если инфиксное выражение Е представляет собой один операнд а, то ПрПЗ выражение Е – это просто а.
2) Если инфиксное выражение Е1*Е2, где * – знак операции,а Е1 и Е2 инфиксные выражения для операндов, то ПрПЗ этого выражения – это *Е1'E2',где E1', E2' - ПрПЗ выражений Е1 и Е2.
3) Если (Е) есть инфиксное выражение, то ПрПЗ этого выражения есть ПрПЗ Е.
Это определение определяет порядок построения ПрПЗ заданного инфиксного выражения.
Например для выражений (a + b) * (c - d) построение ПрПЗ можно выполнить так. Обозначим операнды первой выполняемой операции:
E1 = (a + b) и E2 = (c - d).
Согласно определению префиксная запись выражения Е1*Е2 – это *E1'E2', где Е1',Е2' – префиксные записи выражений Е1 и Е2. Выполняя построение постфиксных записей для этих выражений,
E1' = +ab, E2' = -cd,
окончательно получаем результат в виде:
*+ab-cd
9.4.5.11. Вычисление префиксных польских записей
Вычисление ПрПЗ можно представить следующим образом.
1. Просматриваем выражение слева направо, пока не найдем знак операции, за которым следуют два операнда.
2. Выполняем операцию и результат записываем на место выбранной тройки.
3. Повторяем пункт (1), пока не получим вместо выражения один результат.
Вычисление построчного префиксного выражения можно представить в следующем виде.
*+ab-cd
*R1-cd
*R1R2
R3
Приведенные правила вычисления префиксных записей достаточно просты, однако, вычисление таких выражений на практике реализуется обычно с использованием магазина.
9.4.5.12. Постфиксная польская запись
Определение. Постфиксную польскую запись (ПоПЗ) определим так.
1. Если инфиксное выражение Е представляет собой один операнд а, то ПоПЗ выражения Е – это а.
2. Если инфиксное выражение Е1*Е2, где * – знак операции, E1, E2 – инфиксные выражения для операндов, то ПоПЗ этого выражения это – Е1'E2'*, где Е1',E2' – постфиксные выражения Е1,Е2.
3. Если (Е) есть инфиксное выражение, то постфиксная запись этого выражения есть постфиксная запись Е.
Аналогично предыдущему примеру построим ПоПЗ выражения
(a + b) * (c - d).
Обозначая операнды внешней операции
E1 = (a + b) и E2 = (c - d),
найдем постфиксные записи операндов, которые имеют вид:
E1' = ab+ и E2' = cd-.
Подставляя полученные постфиксные записи в выражение
E1'E2'*,
окончательно получаем :
ab+cd-* .
9.4.5.13. Вычисление постфиксных записей
Вычисление постфиксной записи выражения можно представить следующим образом.
1. Просматриваем выражение слева направо пока не найдем два стоящих рядом операнда, за которыми следует знак операции.
2. Выполняем операцию и записываем результат вместо выбранных операндов и операций.
3. Повторяем пункт (1) пока не получим вместо выражения единственный результат.
Вычисление построенного постфиксного выражения можно представить в следующем виде.
1. ab+cd-*
2. R1cd-*
3. R1R2*
4. R3
На практике вычисление постфиксных выражений реализуется с применением магазина. В этом случае вычисления выполняются по следующим правилам.
1. Прочитать очередной символ входной цепочки.
2. Если входной символ - операнд, то выполнить его запись в магазин.
3. Если входной символ - оператор, то прочитать два операнда из магазина, выполнить операцию и результат занести в магазин как операнд.
4. Повторять п.1, пока во входной цепочке не будут прочитаны все символы.
Последовательность вычислений продемонстрируем на примере входной цепочки
ab+cd-*
и изобразим ее в виде следующей схемы:
Вход Магазин Операция
ab+cd-* 1. b+cd-* a
2. +cd-* ab
3. cd-* R1 a+b=R1
4. d-* R1c
5. -* R1cd
6. * R1R2 c-d = R2
7. $ R3 R1*R2 = R3