
- •Clock_gettime
- •Int main(int argc, char **argv)
- •Timer_create
- •Int timer_create(
- •Timer_settime
- •Int timer_settime(
- •Int flags,
- •Многопотоковое программирование
- •13.1. Структура и методика использования потоков выполнения
- •13.2. Потоки и облегченные процессы
- •13.3. Api потоков выполнения фирмы Sun Microsystems
- •Void* printmsg (void* msg )
Многопотоковое программирование
Для организации (псевдо)параллельной обработки в POSIX используются два понятия - процессы и потоки управления. Процессы в POSIX являются держателями ресурсов (память, таблица открытых файлов и др.) и работают в значительной степени независимо друг от друга. Одной из функций ОС является защита процессов от нежелательного воздействия друг на друга.
Поток выполнения — это элемент кода программы, выполняемый последовательно. Большинство UNIX-приложений — однопотоковые программы, так как каждая из них выполняет в каждый момент времени только один элемент кода. Например, однопотоковый процесс получает команду от пользователя, выполняет ее, сообщает пользователю результаты, а затем ожидает следующую команду. Пользователь должен дождаться, пока процесс закончит выполнение команды, и лишь затем вводить следующие команды.
В многопотоковой программе в каждый момент времени могут выполняться "параллельно" несколько элементов кода, при этом каждый элемент кода выполняется одним потоком управления. Работая с многопотоковым процессом, пользователь может вводить команды непрерывно, одну за другой, и процесс выполняет все команды параллельно.
Многопотоковое программирование можно использовать для разработки приложений, которые могут выполняться параллельно. Эти приложения можно запускать на любых многопроцессорных системах, эффективно используя аппаратные ресурсы. В частности, если многопотоковое приложение запускается на системе с М процессорами, то все его потоки могут выполняться одновременно, каждый — на отдельном процессоре. Следовательно, производительность такого приложения можно увеличить в N раз, где N — максимальное число свободных в данный момент процессоров (N меньше или равно М).
Производительность многопотокового приложения можно улучшить да - же в том случае, если оно запускается на однопроцессорной системе.
Например, если один из потоков приложения блокируется каким-то системным вызовом, на этом процессоре может выполняться другой поток. Таким образом, сокращается общее время выполнения приложения.
Потоки выполнения отличаются от порожденных процессов создаваемых функцией API fork
• Потоками выполнения можно управлять либо с помощью библиотечных функций пользовательского уровня, либо с помощью ядра операционной системы. Процессами, которые порождаются системным вызовом fork, управляет ядро операционной системы. Вообще говоря, потоки более эффективны и требуют гораздо меньше внимания со стороны ядра в процессе создания и управления.
• Все потоки выполнения в процессе совместно используют сегменты данных и кода. Порожденный процесс имеет собственную копию виртуального адресного пространства, отдельную от родительского процесса. Таким образом, потоки используют гораздо меньше системных ресурсов, чем порожденные процессы.
• Функции exit или ехес, вызываемые потоком, завершают все потоки в этом процессе. Если же эти функции вызывает порожденный процесс, то на родительский процесс ее действие не распространяется.
• Если поток модифицирует в процессе какую-то глобальную переменную, эти изменения видимы для остальных потоков этого процесса. Поэтому для потоков, обращающихся к совместно используемым данным, необходима синхронизация. Во взаимоотношениях между порожденным и родительским процессами эта проблема не возникает.
Теперь перечислим преимущества многопотокового программирования;
• повышается производительность процессов и ускоряется реакция на действия пользователя;
• процесс может использовать все свободные аппаратные средства многопроцессорной системы, в которой выполняется многопотоковое приложение.
• программистам могут структурировать код в независимо выполняемые компоненты;
• снижается необходимость использования функции fork для создания порожденных процессов и таким образом увеличивается производительность каждого процесса (реже выполняется переключение контекста); в управлении выполнением потоков в меньшей степени участвует ядро системы;
многопотоковое программирование — оптимальный способ повышения производительности объектно-ориентированных приложений, рассчитанных на использование в многопроцессорных системах.
Недостаток многопотокового программирования состоит в том, что пользователи должны обеспечить синхронизацию потоков в каждой программе. Синхронизация нужна для того, чтобы потоки не делали случайных ошибок при чтении и записи совместно используемых данных и не могли уничтожить свой процесс системным вызовом exit или ехес.