Алексей Мичурин
Нити, называемые ещё «легковесными процессами» и управляющими потоками, –
это части кода, принадлежащие одному процессу, разделяющие общее адресное
пространство, но способные выполняться параллельно и асинхронно, что позволяет
разделять вычисления между отдельными процессорами в многопроцессорных системах
или продолжать вычисления, пока другие части программы ожидают определённых
событий. В настоящей статье рассказывается об организации нитей в Perl, даётся
оценка этой, пока достаточно новой и развивающейся, технологии.
threads vs fork
Все знают о системном вызове fork, который создаёт точную копию процесса.
При этом новый процесс получает своё собственное адресное пространство и
начинает существовать независимо от родителя. Такое ветвление процессов –
широко распространённая практика в многозадачных средах, способных выполнять
сразу несколько потоков команд. Но ветвление – не единственный способ
воспользоваться преимуществами многопотоковости.
Другой подход – создание нитей (threads). При обычном
fork-подходе одно отдельное адресное пространство обрабатывается одним потоком
команд. Но согласитесь, что нет никаких принципиальных ограничений на
количество потоков команд, работающих в одном адресном пространстве. Такие
потоки и принято называть нитями.
Нити позволяют операционной системе выполнять
программу сразу на нескольких процессорах или продолжать выполнение одной нити,
пока другая ожидает ввода/вывода, сетевого соединения или других событий.
Подобные возможности доступны и при fork-ветвлении, но нити дают некоторое
дополнительное преимущество перед ветвлением. Во-первых, при переключении между
нитями системе не приходится менять контекст задачи. Во-вторых, передача данных
между нитями происходит гораздо проще, чем между отдельными процессами,
благодаря общей памяти. Хотя, конечно, именно «благодаря» этим преимуществам,
программирование нитей требует повышенной аккуратности.
Но на недостатках нитей я подробно остановлюсь в
конце статьи, когда мы поближе познакомимся с тонкостями их функционирования.
В этой статье я рассказываю о средствах,
имеющихся в Perl, для создания нитей. Конечно, мне не удастся охватить все
возможности и тонкости программирования лёгких процессов, но я постараюсь
детально остановиться на базовых вопросах и по крайней мере упомянуть средства,
расширяющие возможности программиста.