СИСТЕМНОЕ И ПРИКЛАДНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ Лекция 2. ОС: Эволюция. Общее устройство. Управление задачами. API. Взаимодействие процессов. Эволюция операционных систем Эволюция ОС 1. Библиотеки ввода-вывода 2. «Мониторы» (1950е) • • автоматизация исполнения заданий обработка программных ошибок 3. Мультипрограммные ОС для мейнфреймов (1960е) • • многопользовательский режим мультипрограммирование - • пакетная обработка разделение времени привелегированный и прикладной режимы работы 3 Эволюция ОС Сетевые ОС (1970е) 4. • распределённое хранение и обработка данных ОС мини-компьютеров 5. • UNIX - конец 70х – начало 80х: TCP/IP, университетские сети разнообразие версий UNIX породило стандарт POSIX Персональные компьютеры (1980е) 6. • возврат к однопользовательским однозадачным системам Современность 7. • развитие сетей (Internet с середины 90х) - • серверные ОС с повышенными требованиями к безопасности встраиваемые и мобильные решения - виток эволюции мобильных ОС ОС реального времени 4 Классификации ОС По назначению • общего назначения • специальные • для встроенных систем • для организации баз данных • для решения задач реального времени По организации работы с ВС • однопользовательские • многопользовательские По архитектуре ядра • монолитные • микроядерные 5 Классификации ОС По режиму обработки • с однопрограммным режимом • с мультипрограммным режимом • Системы пакетной обработки - Главный критерий – пропускная способность, минимизация простоев - Переключение процессора инициирует задача • Системы разделения времени - Главное – интерактивность работы - Приложениям выделяются кванты процессорного времени • Системы реального времени - Главное – соблюдение заданного времени отклика - Управление технологическими процессами и объектами 6 Общее устройство ОС Основные функции ОС • Управление привилегиями доступа • Пользовательский интерфейс • Управление исполнением приложений • исполнение задач • планирование и диспетчеризация - в т.ч., контроль времени ответа для ОС реального времени • коммуникации между задачами • сервисные функции (API) • защищённый режим работы приложений • Управление вводом-выводом • Упавление памятью • Сервисные функции 8 Архитектура ОС Ядро • Функции, решающие внутрисистемные задачи • Переключение контекста, загрузка/выгрузка страниц, обработка прерываний • API – системные вызовы Структура ядра: • Монолитная – ядро является цельной программой • Микроядерная – состоит из набора самостоятельных программ и координирующего их работу микроядра 9 Архитектура ОС Остальные модули ОС (вне ядра) • Утилиты • решают отдельные сервисные задачи (дефрагментация, диагностика) • Системные обрабатывающие программы • редакторы, компиляторы, компоновщики • Пакет пользовательских программ • файловый менеджер, эмулятор терминала • Библиотеки процедур • Математические функции, функции ввода-вывода, и т.п 10 Архитектура ОС Многослойная структура ОС Ядро может содержать • Средства аппаратной поддержки ОС • Средства поддержки привилегированного режима, средства переключения контекстов, защиты областей памяти • Машинно-зависимые компоненты • Уровень абстракции от аппаратуры • Базовые механизмы ядра • Менеджеры ресурсов • Интерфейс системных вызовов 11 Архитектура ОС Принципы построения ядра Монолитное ядро • Единственный способ добавить новые компоненты – пересборка ядра • Основные функции ОС выполняются в привилегированном режиме • Ядро имеет доступ к памяти приложений • Взаимодействие программы с ядром – посредством системных вызовов • Каждый процесс должен иметь свой собственный стек режима пользователя и стек режима ядра 12 Архитектура ОС Принципы построения ядра 13 Архитектура ОС Принципы построения ядра Микроядерная архитектура • Все компоненты, кроме микроядра, самостоятельные процессы • Взаимодействие компонентов – через обмен сообщениями • Микроядро обеспечивает • взаимодействие между процессорами • первичную обработку прерываний • базовое управление памятью 14 Архитектура ОС Принципы построения ядра 15 Архитектура ОС Принципы построения ядра • Менеджеры ресурсов – серверы ОС • обслуживают запросы от других процессов 16 Архитектура ОС Принципы построения ядра В привилегированном режиме микроядерной ОС работает только само микроядро 17 Архитектура ОС Сравнение подходов Монолитное ядро + Высокая скорость + Простота проектирования (нет жётской модульности) - Сложность модификации, требует пересборки ядра - Низкая надёжность за счёт работы всех модулей в едином адресном пространстве, чревато крахом Микроядро - Накладные расходы снижают производительность - Сложно минимизировать взаимодействие между слоями + Модульность облегчает модификации + Проще процесс отладки + Выше надёжность 18 Управление задачами Управление задачами Основные функции ОС: • создание и удаление задач • планирование и диспетчеризация задач • синхронизация задач, обеспечение их средствами коммуникации 20 Управление задачами Операции ОС • создание (порождение)/уничтожение процесса • приостановка/возобновление процесса • блокирование/пробуждение процесса • запуск процесса • изменение приоритета процесса 21 Создание и удаление процессов и потоков Создание процесса: • создать дескриптор • загрузить код и данные процесса в ОП • создать главный поток выполнения • дескриптор потока Завершение процесса: • закрыть все файлы • освободить память • код, данные, системные структуры • скорректировать очереди и списки ресурсов 22 Планирование и диспетчеризация задач Планирование: • определение момента переключения • выбор потока для выполнения из очереди Стратегии планирования • заканчивать вычисления в том же порядке, в каком они начаты • приоритет коротким процессам • равенство пользователей (включая время ожидания) 23 Планирование и диспетчеризация задач • Статическое планирование • системы реального времени • весь набор одновременных задач определён заранее • Динамическое планирование • во время работы, анализ текущей ситуации • потоки и процессы появляются выполняются недетерминированно по времени 24 Планирование и диспетчеризация задач Диспетчеризация – переключение в соответствии с планом • сохранение контекста текущего потока, который требуется сменить • загрузка контекста нового потока, выбранного в результате планирования • запуск нового потока на выполнение Контекст потока • общая часть – ссылки на файлы, ресурсы • индивидуальная – содержимое регистров, режим процессора, флаги 25 Алгоритмы планирования • Невытесняющие • активный поток сам передаёт управление системе • разработчики программ решают задачу планирования, разбивая приложение на части • Вытесняющие • ОС принимает решение и переключает задачи • механизмы квантования или приоритетов 26 Алгоритмы планирования Невытесняющие алгоритмы Достоинства • исключено внезапное прерывание задачи • нет условий гонки – монопольная работа • более быстрое переключение задач Недостатки • сложнее разрабатывать программы • зацикливание потока блокирует систему 27 Алгоритмы планирования Вытесняющие алгоритмы Основанные на квантовании • каждый поток получает квант времени • кванты разных задач могут различаться (в среднем, десятки мс) Основанные на приоритетах • задача снимается с выполнения при появлении новой задачи более высокого приоритета 28 Стратегии планирования • обслуживание в порядке поступления • невытесняющая • приоритет коротким процессам • невытесняющая бесприоритетная • круговая схема (round robin) • вытесняющая с квантованием • планирование согласно приоритетам • вытесняющая реального времени • смешанный тип • сочетаются квантование и приоритеты 29 Интерфейс прикладного программирования ОС Application Programming Interface Назначение: • Доступ прикладным программам к системным ресурсам и функциям ОС Виды API: • Интерфейс Runtime-библиотек (RTL) • API прикладных/системных программ в составе ОС • прочие 31 Варианты реализации API • На уровне модулей ОС • • • • за выполнение функций API отвечает ОС объектный код – часть ОС SDK отвечает только за вызов функций ОС высокая эффективность, низкая переносимость • На уровне SDK • RTL предлагает унифицированный интерфейс - абстрагирует от конкретных вызовов API ОС • SDK обеспечивает связывание с RTL - на конкретной платформе может быть своя реализация • снижается эффективность, растёт переносимость - требуется перекомпиляция • Внешние библиотеки • случаи, выходящие за рамки компетенции runtime-библиотек 32 Пример API vs. RTL • malloc() – функция CRT для выделения памяти • в Windows API её общее содержимое: void * malloc (size_t size) { // проверки return HeapAlloc(_crtheap, 0, size ? size : 1); } где HeapAlloc – системная функция Windows. • в glibc реализация malloc куда сложнее (для POSIXсистем использует системные вызовы brk/sbrk) 33 Стандарт POSIX • Portable Operating System Interface for Unix • «Переносимый интерфейс операционных систем Unix» • стандарт API UNIX-систем (и не только) • Отдельные документы покрывают ту или иную часть системных функций: • POSIX.1, Корневые службы (включает стандарт ANSI C) - процессы, ввод-вывод, память, сигналы, пайпы, таймеры, и т.п. • POSIX.1b, Расширения реального времени - планирование, RT-сигналы, I/O, память, таймеры, и проч. • POSIX.1c, Расширения потоков - создание потоков, планирование, синхронизация • POSIX.2, Командная оболочка и утилиты 34 Пример: POSIX vs. WinAPI #include #include #include #include #include <sys/types.h> <sys/stat.h> <wait.h> <fcntl.h> <stdio.h> int processFile( char *fileName) { int handle, numRead, total = 0; char buf; // файл открывается на чтение handle = open( fileName, O_RDONLY); DWORD processFile(LPVOID lpFileName ) { HANDLE handle; // описатель файла DWORD numRead, total = 0; char buf; // файл открывается на чтение: handle = CreateFile( (LPCTSTR)lpFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); // цикл чтения до конца файла do { // чтение одного символа из файла ReadFile( handle, (LPVOID) &buf, 1, &numRead, NULL); if (buf == 0x20) total++; } while ( numRead > 0); // цикл чтения до конца файла do { // чтение одного символа из файла numRead = read( handle, &buf, 1): if (buf == 0x20) total++; } while (numRead > 0); // закрытие файла close( handle); fprintf( stderr, "(ThreadID: %Lu), File %s. spaces = %d\n", GetCurrentThreadId(), lpFileName, Total); return total; // закрытие файла CloseHandle( handle); } return 0; } 35 Пример: POSIX vs. WinAPI // определён ранее: int processFile(char * fileName); // определён ранее: DWORD processFile(LPVOID lpFileName); int main(int argc, char *argv[]) { int i, pid, status; for (i = 1; i < argc; i++) { // запускаем дочерний процесс pid = fork(); if (pid == 0) { // если выполняется дочерний процесс printf("(PID: %6). File %s. spaces %d\n“, getpid(), argv[i], processFile( argv[i])); // выход из процесса exit(); } // если выполняется родительский процесс else { printf( "processFile started (pid=%d)\n", pid); } } // ожидание завершения процессов if (pid != 0) while (wait(&status)>0); return 0; } int main(int argc, char *argv[]) { int i; DWORD pid; HANDLE hThrd[255]; // дескрипторы потоков for (i = 0; i < (argc-1); i++) { // запуск потока hThrd[i] = CreateThread( NULL, 0x4000, (LPTHREAD_START_ROUTINE) \ processFile, (LPVOID) argv[i+l], 0, &pid); fprintf( stdout, "processFile started (HND=Xd)\n", hThrd[i]); } // ожидание окончания работы всех потоков WaitForMultipleObjects( argc-1, hThrd, true, INFINITE); return 0; } 36 Организация взаимодействия процессов Взаимодействие процессов • Независимые процессы • не воздействуют друг на друга • Взаимодействующие процессы • конкурирующие - доступ к общим переменным • сотрудничающие - результаты работы одного передаются другому 38 Взаимодействие процессов Ресурсы • разделяемые • используются совместно • доступ разных процессов разделяется по времени • критические • не допускают общего использования Синхронизация потоков • приостановка потока до наступления события • активизация потока при его наступлении 39 Взаимодействие процессов Проблемы отсутствия синхронизации • Возникновение гонок • конечный результат неопределён и зависит от случайного порядка работы потоков • Взаимные блокировки (тупики, дедлоки) • несколько процессов ждут событий, порождаемых одним из ожидающих процессов 40 Средства синхронизации Критическая секция • определяется для критических данных • предотвращает несогласованные изменения (гонку) Примеры • два потока работают с одним счётчиком • транзакции при работе с БД 41 Средства синхронизации Семафоры • Переменная специального типа, доступная параллельным процессам для операций «закрытия» и «открытия» • При отказе доступа к ресурсу используется механизм ожидания • при активации процесс выполняет повторную попытку обращения к семафору • либо считает попытку успешной и переходит дальше 42 Средства синхронизации Обмен сообщениями • Отправление и получение сообщений могут быть блокирующими и неблокирующими • Типичные комбинации: • рандеву (блокирующие отправка и получение) • неблокирующее отправление, блокирующее получение – самое частое • неблокирующие операции 43 Средства синхронизации Обмен сообщениями Получение сообщений • блокирующее – более естественная форма • • при сбое или потере сообщения процесс блокируется навсегда неблокирующее • чтобы избежать потери сообщения, нужно выполнять доп. проверки Адресация сообщений • прямая (указание отправителя или получателя) • косвенная (отправка через совместные структуры – «почтовые ящики») 44 Средства синхронизации Почтовые ящики Основные достоинства • процессу не нужно знать о других процессах, пока он не получит сообщения от них • два процесса могут обмениваться более чем одним сообщением за один раз • ОС может гарантировать невмешательство в общение двух процессов • очереди буферов позволяют процессу-отправителю продолжать работу, не обращая внимание на получателя Недостатки • ещё один ресурс, которым нужно управлять • статический характер этого ресурса 45 Средства синхронизации Конвейеры • Конвейер – программный канал связи (поток данных между процессами) • устроен по принципу кольцевого буфера • FIFO-обработка 46 Средства синхронизации Очереди сообщений • Для очередей возможны разные стратегии обработки: • • • • FIFO LIFO (last in – first out) приоритетная выборка произвольный доступ • В отличие от канала, сообщение не удаляется из очереди при чтении • В очередь помещается только указатель и размер сообщения 47