Обзор многопоточности в unix

Цель работы: научиться проводить анализ преимуществ, недостатков, проблем многопоточностив UNIX

Оборудование:Персональный компьютер с ОС Linux

Индивидуальное задание.Провести анализ многопоточности, выявить особенности, достоинства и недостаткимногопоточности в UNIX.

Теоретические сведения

Многопоточность — свойство платформы (например, операционной системы, виртуальной машины и т. д.) или приложения, состоящее в том, что процесс, порождённый в операционной системе, может состоять из нескольких потоков, выполняющихся «параллельно», то есть без предписанного порядка во времени. При выполнении некоторых задач такое разделение может достичь более эффективного использования ресурсов вычислительной машины.

Процессы в традиционных Unix-системах

В Unix для исполнения программ создаются процессы

Процесс – это процесс исполнения образа процесса

Образ процесса – виртуальное адресное пространство, содержащее код и данные. Кроме этого, образ процесса включает в себя пользовательскую область (структуры данных ядра, связанные с процессом)

В не-Unix системах процессы также называют задачами (task)

Unix – многозадачная ОС

Программа исполняется в рамках процесса последовательно, как будто под управлением однозадачной ОС

Это упрощает программирование

Если задача требует распараллеливания, необходимо запускать несколько процессов.

Межпроцессное взаимодействие в традиционном Unix через:

Трубы

Сокеты TCP

Unix domain sockets

Разделяемые файлы и блокировка участков файлов

System V IPC (разделяемая память, семафоры, очереди сообщений)

Семафоры и разделяемая память Xenix

Разделяемые файлы

Что дает многопоточность (по сравнению с System V IPC)

Потоки дешевле процессов (нет своего адресного пространства)

Потоки дают все преимущества разделяемой памяти

Потоки проще использовать, чем разделяемую память System V IPC

переменные гарантированно находятся по одним и тем же адресам,

можно взаимодействовать через глобальные переменные и произвольные структуры данных

Зачем нужна многопоточность

Улучшение времени реакции интерактивных программ

Повышение производительности (улучшение времени реакции) серверных приложений

Использование многопроцессорных машин и многоядерных процессоров

Приложения мультимедиа и жесткого реального времени

Улучшение времени реакции

Фоновое скачивание страницы в браузере

Фоновый ввод-вывод (например, утилита просмотра файла может считывать файл по мере его просмотра)

Фоновая проверка орфографии

Фоновое переразбиение текста на страницы в WYSIWYG текстовых процессорах

Серверные приложения

обзор многопоточности в unix - student2.ru

Что мешает перейти к многопоточности

Несовместимость со старыми (однопоточными) компиляторами

Несовместимость со старыми библиотеками

Несовместимость или ограниченная поддержка многопоточных программ другими инструментальными средствами, в первую очередь отладчиками

Несовместимость многих принятых практик программирования с многопоточностью

Как эти проблемы решались

• Многие языки высокого уровня поддерживают многопоточность на уровне языка:

– Simula 67

– Ada

– Occam

– Parallel Fortran

– Директивы (#pragma) OpenMP

• Это требует переделки компиляторов

• POSIXThreadAPI требует лишь минимальной поддержки со стороны компилятора

– отказ от некоторых опасных оптимизаций,

– в С++ - стандартизованный ABI вызова деструкторов

• Не рекомендуется использовать OpenMP и POSIXthreads в одной и той же программе (на нижнем уровне это одни и те же потоки)

Проблемы многопоточности

Многопоточность – весьма сложная, еще не полностью изученная и, тем более, не полностью формализованная область, в которой имеется много интересных проблем. Рассмотрим некоторые из них.

Семантика системных вызовов fork() и exec().Как уже отмечалось, в классической ОС UNIX системный вызов forkсоздает новый "тяжеловесный" процесс со своим адресным пространством, что значительно "дороже", чем создание потока. Однако, с целью поддержания совместимости программ снизу вверх, приходится сохранять эту семантику, а многопоточность вводить с помощью новых системных вызовов.

Прекращение потоков. Важной проблемой является проблема прекращения потоков: например, если родительский потокпрекращается, то должен ли при этом прекращаться дочерний поток? Если прекращается стандартный процесс, создавший несколько потоков, то должны ли прекращаться все его потоки? Ответы на эти вопросы в разных ОС неоднозначны.

Ход работы:

1. Ознакомиться с теоретическими сведениями.

2. Провести анализ многопоточности, выявить особенности, достоинства и недостатки. Результаты оформить в таблице.

Содержание отчета

Отчет по практической работе должен содержать следующие пункты:

- название практической работы;

- цель работы;

- краткие теоретические сведения;

- индивидуальное задание для выполнения практической работы;

- краткое описание хода выполнения работы;

- результаты выполнения работы;

- выводы.

Контрольные вопросы:

1. Что такое многопоточность?

2. Какие достоинства имеет многопоточность?

3. Какие недостатки имеет многопоточность?

4. Что такое взаимоисключение?

5. Что такое семафоры?

6. Для чего предназначены критические секции и события?

Практическая работа №12

Обзор многопоточности вPOSIX

Цель работы: научиться проводить анализ преимуществ, недостатков, проблем многопоточностивPOSIX

Оборудование:Персональный компьютер с ОС Linux

Индивидуальное задание.Провести анализ многопоточности, выявить особенности, достоинства и недостатки многопоточности в POSIX.

Теоретические сведения

POSIX (англ. portable operating system interfaceforUnix — переносимый интерфейс операционных систем Unix) — набор стандартов, описывающих интерфейсы между операционной системой и прикладной программой (системный API), библиотеку языка C и набор приложений и их интерфейсов. Стандарт создан для обеспечения совместимости различных UNIX-подобных операционных систем и переносимости прикладных программ на уровне исходного кода, но может быть использован и для не-Unix систем. Серия стандартов POSIX была разработана комитетом 1003 IEEE. Международная организация по стандартизации (ISO) совместно c Международной электротехнической комиссией (IEC) приняли данный стандарт (POSIX) под названием ISO/IEC 9945.

Задачи:

  • содействовать облегчению переноса кода прикладных программ на иные платформы;
  • способствовать определению и унификации интерфейсов заранее при проектировании, а не в процессе их реализации;
  • сохранять по возможности и учитывать все главные, созданные ранее и используемые прикладные программы;
  • определять необходимый минимум интерфейсов прикладных программ, для ускорения создания, одобрения и утверждения документов;
  • развивать стандарты в направлении обеспечения коммуникационных сетей, распределенной обработки данных и защиты информации;
  • рекомендовать ограничение использования бинарного (объектного) кода для приложений в простых системах.

POSIX определяет набор интерфейсов (функций заголовочных файлов) для программирования потоков. Эти рекомендации носят название POSIXthreads или Pthreads.

В рамках процесса различные потоки имеют свои атрибуты. Часть этих атрибутов наследуются от процесса и они общие для всех потоков, а часть индивидуальны для каждого потока.Под thread-safe функциями понимаются такие, которые безопасно можно вызывать из разных потоков. Как правило это такие функции, которые не используют глобальные ресурсы для своей работы. Стандарт требует, чтобы все функции были таковыми. Исключение делается только для некоторых из них.

Преимущества и недостатки

Преимущества:

• Затраты на создание потоков меньше, чем на создание процессов (~ 2 ms for threads)

• многозадачность, т.е., один процесс может обслуживать несколько клиентов

• Переключение между потоками для ОС менее накладно, чем переключение между процессами

Недостатки:

• Многопоточное программирование требует более аккуратного подхода к разработке поскольку

– Отладка сложнее

– Создание нескольких потоков на однопроцессорной машине не обязательно приведет к увеличению производительности.

Естественно, что как любая модель, модель программирования потоков имеет свои преимущества и недостатки. Основное преимущество использования потоков состоит в том, что они более легковесны, нежели процессы. Операционной системе надо меньше времени на их создание и переключение контекста между потоками по сравнению с процессами.Недостатки, пожалуй, тоже очевидны. Так многопоточные приложения сложнее отлаживать, чем последовательные. Кроме того при некорректном использовании потоков параллельная программа может даже работать медленнее, чем последовательная.

Программная модель pthreads определяет:

• Создание потоков

• Управление исполнением потоков

• Управление разделяемыми ресурсами процесса.

POSIX

POSIX – (PortableOperatingSystemInterfaceforUnix – переносимый интерфейс операционных систем Unix) – набор стандартов, описывающих интерфейсы между операционной системой и прикладной программой.

Разработано комитетом 1003 IEEE, утверждено стандартом ISO/IEC 9945.

POSIX 1003.1 – Корневые службы

• Создание и контроль процессов

• Сигналы

• Исключения плавающей точки

• Нарушение сегментации

• Запрещенные директивы

• Ошибки шины

• Таймеры

• Операции над файлами (директориями)

• Каналы

• Библиотека C (включает стандарт ANSI C)

• Интерфейс и контроль ввода/вывода

POSIX 1003.1b – Расширения реального времени

• Планировка приоритетов

• Сигналы реального времени

• Таймеры и синхронизация

• Семафоры

• Передача сообщений

• Общая память

• Асинхронный и синхронный ввод/вывод

• Интерфейс блокировки памяти

POSIX 1003.1c – Расширения потоков

• Создание, контроль и очистка потоков

• Планировщик потоков

• Синхронизация потоков

• Обработка сигналов

Поддержка POSIX операционными системами

• Полная поддержка

o Android OS

o LynxOS

o QNX

o VxWorks

Неполная поддержка

o FreeBSD

o Linux

Стандарт родился как модель программирования потоков для Unix систем и основывался на стандарте IEC9945-1Стандарт определяет интерфейсы по созданию и управлению потоками, по механизмам разграничения доступа к разделяемым ресурсам процесса.

В программе всегда существует один поток, который создаются при загрузки функции main в Си и PROGRAM в фортране.Далее основной поток может создать дочерние потоки. При этом если основной поток завершается, автоматически (если не предпринято специальных действий) завершаются и дочерние потоки.

Для того, чтобы завершение дочерних потоков не происходило, можно использовать функцию выхода из (основного) потока pthread_exit().

Завершение потоков может происходить по двум причинам, а именно: завершилась функция, которую поток исполняет или (что аналогично) поток вызвал pthred_exit(), поток прервали.

Ход работы:

1. Ознакомиться с теоретическими сведениями.

2. Провести анализ многопоточности, выявить особенности, достоинства и недостатки. Результаты оформить в таблице.

Содержание отчета

Отчет по практической работе должен содержать следующие пункты:

- название практической работы;

- цель работы;

- краткие теоретические сведения;

- индивидуальное задание для выполнения практической работы;

- краткое описание хода выполнения работы;

- результаты выполнения работы;

- выводы.

Практическая работа №13

Наши рекомендации