
- •Часть 1
- •В.Г.Олифер, н.А.Олифер. Сетевые операционные системы. Учебное пособие.-сПб.:бхв-Петербург, 2006.-536с.
- •В.А.Шеховцов. Операційні системи. Підручник .-к.:Виканавча група внv. 2005. 576с.
- •Столлингс в. Операционные системы. М.: Вильямс, 2001. -672с. Оглавление
- •Раздел 1 введение
- •1.1. Понятие операционной системы, ее назначение и функции
- •1.1.1. Понятие операционной системы
- •1.1.2. Назначение операционной системы
- •1.1.3. Операционная система как расширеная машина
- •1.1.4. Операционная система как распределитель ресурсов
- •1.2. История развития операционных систем
- •1.3. Классификация современных операционных систем
- •1.4. Функциональные компоненты операционных систем
- •1.4.1. Управление процессами и потоками
- •1.4.2. Управление памятью
- •1.4.3. Управление вводом-выводом
- •1.4.4. Управление файлами и файловые системы
- •1.4.5. Сетевая поддержка
- •1.4.6. Безопасность данных
- •1.4.7. Интерфейс пользователя
- •Раздел 2
- •2.1. Базовые понятия архитектуры операционных систем
- •2.2. Реализация архитектуры операционных систем
- •2.2.1. Монолитные системы
- •2.2.2. Многоуровневые системы
- •2.2.3. Системы с микроядром
- •2.2.4. Концепция виртуальных машин
- •2.3. Операционная система и ее окружение
- •2.3.1. Взаимодействие ос и аппаратного обеспечения
- •2.3.2. Взаимодействие ос и выполняемого программой
- •2.4. Особенности архитектур
- •Раздел 3
- •3.1. Базовые понятия процессов и потоков
- •3.1.1. Процессы и потоки в современных ос
- •3.1.2. Модели процессов и потоков
- •3.1.3. Составные элементы процессов и потоков
- •3.2. Многопотоковость и ее реализация
- •3.2.1. Понятие параллелизма
- •3.2.2. Виды параллелизма
- •3.2.3. Преимущества и недостатки многопотоковости
- •3.2.4. Способы реализации модели потоков
- •3.2.5 Состояния процессов и потоков
- •3.3 Описание процессов и потоков
- •3.3.1. Управляющие блоки процессов и потоков
- •3.3.2. Образы процесса и потока
- •3.4. Переключение контекста и обработка прерываний
- •3.4.1. Организация переключения контекста
- •3.4.2. Обработка прерываний
- •3.5 Создание и завершение процессов и потоков
- •3.5.1 Создание процессов
- •3.5.2. Иерархия процессов
- •3.5.3. Управление адресным пространством во время создания процессов
- •3.5.4. Особенности завершения процессов
- •3.5.5. Синхронное и асинхронное выполнение процессов
- •3.5.6. Создание и завершение потоков
- •3.6 Управление потоками в Linux
- •3.6.1. Базовая поддержка многотопотоковости
- •3.6.2. Особенности новой реализации многопоточности в ядре Linux
- •3.6.3. Потоки ядра Linux
- •3.7 Управление процессами в Windows хр
- •3.7.1. Составные элементы процесса
- •3.7.2. Структуры данных процесса
- •3.7.3. Создание процессов
- •3.7.4. Завершение процессов
- •3.7.5. Процессы и ресурсы. Таблица объектов процесса
- •3.8 Управление потоками в Windows хр
- •3.8.1. Составные элементы потока
- •3.8.2. Структуры данных потока
- •3.8.3. Создание потоков
- •Раздел 4
- •4.1. Виды межпроцесорного взаимодействия
- •4.1.1. Методы распределения памяти
- •4.1.2. Методы передачи сообщений
- •4.1.3. Технология отображаемой памяти
- •4.1.4. Особенности межпроцесорного взаимодействия
- •4.2. Базовые механизмы межпроцессового взаимодействия
- •4.2.1. Межпроцессовое взаимодействие на базе общей памяти
- •4.2.2. Основы передачи сообщений
- •4.2.3. Технологии передачи сообщений
- •Глава 5
- •5.1 Функции ос по управлению памятью
- •5.2 Типы адресов
- •5.3 Алгоритмы распределения памяти
- •5.3.1 Распределение памяти фиксированными разделами
- •5.3.2 Распределение памяти динамическими разделами
- •5.3.3 Перемещаемые разделы
- •5.4 Свопинг и виртуальная память
- •5.4.1 Страничное распределение
- •5.4.2 Сегментное распределение
- •5.4.3 Сегментно-страничное распределение
- •5.5 Разделяемые сегменты памяти
- •5.6 Кэширование данных
- •5.6.1 Иерархия запоминающих устройств
- •5.6.3 Принцип действия кэш-памяти
- •5.6.4 Проблема согласования данных
- •5.6.5 Способы отображения основной памяти на кэш
- •5.6.6 Схемы выполнения запросов в системах с кэш-памятью
- •Раздел 6 Логическая и физическая организация файловой системы
- •6.1 Логическая организация файловой системы
- •6.1.1 Цели и задачи файловой системы
- •5.1.2 Типы файлов
- •5.1.3 Иерархическая структура файловой системы
- •5.1.4 Имена файлов
- •5.1.5 Монтирование
- •5.1.6 Атрибуты файлов
- •5.1.7 Логическая организация файла
- •5.2 Физическая организация файловой системы
- •5.2.1 Диски, разделы, секторы, кластеры
- •5.2.2 Физическая организация и адресация файла
- •5.2.3 Физическая организация fat
- •5.2.4 Физическая организация ntfs
3.6 Управление потоками в Linux
3.6.1. Базовая поддержка многотопотоковости
До недавнего времени единым средством поддержки многотопотоковости в ядре Linux был системный вызов clone(), который дает возможность создать новый процесс на базе имеющегося. Этот вызов во многом похожий на вызов fork(), но имеет несколько особенностей.
-
Для нового процесса нужно задать специальный набор флажков, которые определяют, как будут распределяться ресурсы между предком и потомком. К ресурсам, которые можно разделять, принадлежат адресное пространство, информация об открытых файлах, обработчике сигналов. Укажем, что в традиционной реализации clone() отсутствующее общее использование идентификатора процесса (pid), идентификатора предка и некоторых других важных атрибутов.
-
Для нового процесса нужно задать новый стек (поскольку вследствие вызова clone() два процессы могут совместно использовать общую память, для их недопустимое использование общего стека).
Поддержка clone() означает реализацию многотопотоковости по схеме 1:1. При этом первичными в системе будут процессы, а не потоки (в Linux последовательности инструкций процессора, с которыми работает ядро, называют процессами, а не потоками ядра).
Традиционная реализация многотопотоковости в Linux определяет, что потоки пользователя отображаются на процессы в ядре. Поэтому в этом разделе нецелесообразно рассматривать отдельно структуры данных потока в Linux - он отображается такой же самой структурой task_struct, как и процесс.
Библиотека поддержки потоков LinuxThreads
Непосредственно использовать системный вызов clone() для создания багатопо-токових применений сложно. Кроме того, такое использование ведет к потере способности к перенесению приложений (вызов clone() реализованный только в Linux и не является частью POSIX). Для того чтобы прикладной программист мог использовать в своих программах потоки POSIX, необходимая реализация этого стандарта в библиотеке поддержки потоков.
Основной библиотекой поддержки потоков в Linux длительное время была библиотека LinuxThreads. В ней поддерживаются те возможности стандарта POSIX.ld, которые реализуются на основе вызова clone(). К сожалению, через ограниченность этого вызова библиотеке присущий объективные недостатки, которые мы рассмотрим подробно.
Недостатки традиционной поддержки многопотоковости в Linux
Основы поддержки многотопотоковости в ядре Linux не испытали принципиальных изменений от появления системного вызова clone(). За это время Linux из экспериментальной системы превратился на систему промышленного уровня, в которой выполняют корпоративные применения в круглосуточном режиме с большой нагрузкой.
Такое использование системы выдвинуло к реализации многотопотоковости требования высокой надежности и масштабируемости. Стало очевидно, что реализация, основанная на системном вызове clone(), этим требованиям не отвечает. Назовем некоторые причины этого несоответствия.
-
Поскольку потоки, созданные с помощью clone(), фактически были процессами, которые совместно используют ресурсы, создание каждого потока увеличивало количество процессов в системе.
-
Каждый поток в системе, будучи по сути процессом, имел собственный идентификатор процесса (ріd), что не отвечало стандарта POSIX. Кроме того, если поток создавал другой поток, между ними возникала связь «предок-потомок», тогда как все потоки должны быть равноправными.
Каждое многотопотоковое применение пользователя обязательно создавало дополнительный поток (поток-менеджер), который отвечал за создание и уничтожение потоков и перенаправлял им сигналы. Наличие такого потока снижало надежность и масштабируемость системы (например, в случае аварийного завершения потока-менеджера приложения оставалось в неопределенном виде).
Все эти факторы делали многотопотоковость в Linux быстрее интересным полем для экспериментов, чем реальным средством повышения производительности и масштабируемости приложений. Решить все проблемы путем устранения недостатков clone() и LinuxThreads оказалось невозможным, нужно была полная переработка средств реализации многотопотоковости в ядре и создание новой библиотеки поддержки потоков.