Введение
1. Что такое потоки
Теперь у нее есть дочь. Другое поколение,другие дела
Ей только пять лет, но время летит как стрела
И хотя она пока что не умеет читать
Она уже знает больше, чем знала мать
Ведь она видит сразу много программ
Глядя в телевизор
В Unix-системах для исполнения программ используются объекты, называемые процессами. Процессу выделяется собственное виртуальное адресное пространство и некоторые другие ресурсы. Для каждого процесса создается иллюзия последовательного исполнения. Программа исполняется в рамках процесса так же, как она исполнялась бы в однозадачной ОС.
Процесс взаимодействует с ядром ОС при помощи так называемых системных вызовов. При исполнении системного вызова, процесс исполняет специальную команду (у современных версий x86 эта команда называется SYSCALL, у SPARC – TA 0x8 для 32-битных программ, TA 0x40 для 64-битных программ), которая переключает адресное пространство и передает управление ядру. Процессы в традиционных Unix-системах могут взаимодействовать друг с другом только при помощи системных вызовов – чтения и записи в трубы и разделяемые файлы, а в более современных системах – при помощи System V IPC.
Таким образом, процессы в Unix надежно изолированы друг от друга. Нарушения целостности данных одного процесса (например, в результате переполнения буфера или ошибок при работе с указателями) приводят к аварийному завершению этого процесса, но не затрагивают, во всяком случае, непосредственно, другие процессы. Даже удаленное исполнение кода в рамках одного из процессов приводит только к тому, что злоумышленник, написавший этот код, получает лишь те привилегии, которые имел этот процесс.
Однако ряд задач – примеры которых мы рассмотрим далее в этом разделе – требует реализации в виде нескольких параллельно (или, на однопроцессорной машине, квазипараллельно) исполняющихся процессов. Традиционные Unix-системы предполагали решать такие задачи при помощи нескольких взаимодействующих процессов. Среди системных вызовов, поддерживаемых всеми современными Unix-системами можно выделить несколько групп, специально предназначенных для такого взаимодействия – это вызовы для работы с трубами (pipe), сетевые средства (которые можно применять и для взаимодействия между процессами на одной машине) и System V IPC. К сожалению, далеко не для всех задач эти средства оптимальны, а для некоторых и вовсе неадекватны.
Кроме того, нередко возникала потребность в переносе приложений, разработанных для ОС, допускавших несколько нитей исполнения в пределах одной задачи или процесса, под Unix. Поэтому в современных Unix-системах было введено понятие нитей (thread), которые соответствуют единицам планирования в рамках одного процесса. Нити разделяют общее адресное пространство, но планируются независимо. Иллюзия последовательного исполнения создается для нити, а не для процесса в целом.
В начале 90х в различных Unix-системах использовались разные подходы к реализации многопоточности и несовместимые API для управления потоками. В 1995 году был принят стандарт IEEE POSIX 1003.1c-1995 (также известен как ISO/IEC 9945-1:1996). Большинство современных Unix-систем, а также некоторые не-Unix системы (например, OpenVMS и IBM zOS) реализуют этот стандарт.
При разработке новых приложений рекомендуется пользоваться стандартным API. Это облегчит вам перенос приложений под другие ОС и под новые версии Solaris.
2. Зачем нужны многопоточные программы
- Улучшение времени реакции интерактивных программ.
- Улучшение времени реакции серверных приложений. Возможность обрабатывать несколько запросов одновременно.
- Использование дополнительных ресурсов на многопроцессорных и гипертрединговых компьютерах.
- Задачи реального времени
2.1 Улучшение времени реакции интерактивных программ
- Фоновое скачивание страницы в браузере
- Фоновый ввод-вывод (например, утилита просмотра файла может считывать файл по мере его просмотра)
- Фоновая проверка орфографии
- Фоновое переразбиение текста на страницы в WYSIWYG текстовых процессорах.
В старых версиях MS Word, переразбиение текста на страницы осуществлялось по мере набора текста, так что вставка текста в начало документа из нескольких страниц превращалась в чистое издевательство над пользователем.
Незнакомые с техникой подготовки печатных документов читатели, возможно, нуждаются в пояснении, что такого сложного в задаче разбиения текста на страницы. Дело в том, что в типографской практике хорошим тоном считается минимизировать количество разбиений параграфов при переносе со страницы на страницу. Также, ряд явлений, возникающих при наивном разбиении текста на страницы, например "висячие строки", когда на страницу попадает только одна строка из параграфа, или "висячие заголовки", когда заголовок раздела попадает на конец страницы, а тело раздела размещается на следующей, считаются совершенно нетерпимыми.
При этом также считается хорошим тоном делать текст на страницах по возможности одинаковой высоты. В условиях, когда текст содержит крупные неразбиваемые объек-ты, такие как рисунки и таблицы, это требование может оказаться трудновыполнимым. Во всяком случае, минимизация "дефекта" заполнения страниц сводится к так называемой задаче о рюкзаке, которая относится к классу NP-полных задач (т. е. задач, для которых неизвестно решения, работающего быстрее, чем полный перебор вариантов). На практике, системы подготовки печатных документов — как TeX и troff, так и WYSIWYG-системы — ищут лишь относительно приемлемое решение, а для подготовки документа типографского качества, т. е. такого, который не стыдно издать в виде книги, нуждаются в помощи верстальщика. Тем не менее, даже поиск относительно приемлемого решения в сложных случаях может продолжаться десятки секунд.
В Microsoft Word для Win 32, задача переразбиения текста на страницы решается фоновой нитью, которая работает параллельно с пользовательским интерфейсом. При нормальной работе пользователь этого вообще не замечает (впрочем, внимательный пользователь может увидеть, что при редактировании в нижней панели возникает анимационная иконка в виде перелистываемой книги, на которой что-то пишет карандаш). Фактически, именно введение фонового разбиения на страницы в версии Office 95 сделало Word более или менее пригодным для редактирования больших документов.
В StarOffice / OpenOffice переразбиение текста на страницы также осуществляется в фоновом режиме при помощи отдельной нити.