Original:https://swtch.com/~rsc/thread/

Лаборатория Белла и ЦСП потоки

Russ Cox
rsc@swtch.com

Введение

На этой странице находится кусочек истории параллельного программирования, сосредоточив внимание на одном конкретном происхождении языка Хоара- взаимодействующего последовательного процесса (ЦСП) [1] [1a]. Параллельное программирование в этом стиле-интересно по причинам не эффективности, но ясности. То есть, это распространенная ошибка думать только о параллельном программировании о как средстве повышения производительности например, перекрытие операций ввода-вывода запросов, чтобы сократить задержку за счет предварительной выборки результаты с ожидаемыми запросами, или воспользоваться несколькими процессорами. Такие достоинства являются важными, но не относится к этому обсуждению. Ведь они могут быть реализованы в других стилях, таких как асинхронные событийно-ориентированное программирование. Напротив, мы заинтересованы в параллельном программировании, поскольку он обеспечивает природную абстракцию, которая может заставить некоторые программ быть гораздо проще.

Что не так

Большинство студентов компьютерных наук заставляют читать Андрея Биррелла “Введение в Программирование с использованием потоков.” Модель потоков ЦСП используется большинством нитей в настоящее время. Проблема со всем этим заключается в том, что они слишком низкого уровня. В отличие от общения примитивной, предусмотренной Хоаром, примитивы в КГД-стиле модуля потоков должны быть в сочетании с другими методами, обычно разделяемой памяти, для того, чтобы использоваться эффективно. В общем, программисты не склонны строить свои собственные нити более высокого уровня, а не желают испытывать разочарование по необходимости обращать внимание на такие мелкие детали.

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

Взаимодействующие Последовательные Процессы

К 1978 году было много предложенных методов связи и синхронизации в контексте мультипроцессоров программирования. Разделяемая память является наиболее распространенным механизмом коммуникации, и семафоры, критические регионы, и мониторы были среди механизмов синхронизации. К. А. р. Хоар решал обе проблемы с помощью одного языка примитивно: синхронной связи. В Хоара языке ЦСП, был реализован процессом общения путем отправки или принимающего значения от именованных каналов без буферизации. Поскольку каналы являются небуферизованной операцией отправкой блоков пока значение не было передано получателю, таким образом, обеспечивая механизм для синхронизации.

Одним из примеров Хоара-это переформатирование 80-колонных карточки для печати на 125-колоночный принтер. В свое решение, один процесс считывает карту, в то время, как отправка в разобранном виде содержания посимвольно на второй процесс. Этот второй процесс собирает группы из 125 символов, отправки групп к линии принтера. Это звучит тривиально, но при отсутствии буферизованного ввода/вывода библиотеки, необходимый Бухгалтерский учет, участвующих в едином процессе решения согласования. На самом деле, буферизованного ввода/вывода библиотеки действительно просто инкапсулируют эти два типа процессов, которые экспортируют односимвольный коммуникационный интерфейс.

В качестве другого примера, который Хоара кредиты на Дугом Макилроем рассмотрим генерацию всех простых чисел менее тысячи. Решето Эратосфена может быть смоделировано трубопроводом процессов выполнения следующаго псевдокода:

p = сделать ряд из левого соседа
print p
loop:
    n = сделать ряд из левого соседа
    if (p does not divide n)
        send n to right neighbor

Производя процесс может кормить числами 2, 3, 4, ..., 1000 в левом конце трубопровода: первый процесс в очереди устраняет кратные 2, второй исключает кратные 3, на третий устраняет кратные 5, и так далее:

Линейный конвейер является примером - до сих пор это извращение общего характера ЦСП но даже ограниченные линейные трубопроводы, модель достаточно мощная. Мощь была убедительно продемонстрировал в успехе фильтра и подхода трубопровода, для которого в операционной системе Unix известно [2] Действительно, трубопроводов предшествуют бумаги Хоара. Во внутреннем колоколе памятки лаборатории от 11 октября 1964 года, Дуг Макилрой играл с идеями, которые могли бы стать трубопроводов в Unix; мы должны иметь несколько способов программ связывания, таких как сад шланг-винт в другой сегмент, когда она становится необходимые для обработки данных в другой способ. Это путь ИО тоже.” [3]

Взаимодействующие процессы хоара являются более общими, чем обычные оболочки Unix трубопроводов, поскольку они могут быть соединены в произвольную форму. В самом деле, хоар дает в качестве примера матрица 3х3 процессов несколько как премьер-сита, которые могут быть использованы для умножение вектора на квадратную матрицу 3х3.

Конечно, трубный механизм Unix не требуют линейной планировки; только синтаксис оболочки. Отчеты макилроя играли с синтаксисом для раковины с общим водопроводом на ранней стадии, но не нравится синтаксис достаточно для его реализации (личное сообщение, 2011). Позже снаряды сделали поддержку некоторых ограниченных форм нелинейные трубопроводов. 2dsh рохкинд поддерживает дагс; Тома Даффа RC поддерживает деревья.

Хоара язык был романтичным и влиятельными, но не хватает нескольких ключевых аспектов. Основной дефект заключается в том, что каналы небуферизованные используется для коммуникации не являются объектами первого класса: они не могут храниться в переменных, подходить в качестве аргументов функции, или направлятся по разным каналам. В результате этого, структура общения должны быть закреплена при написании программы. Следовательно мы должны написать программу для печати первой 1000 первичных, а не первых n простых, и чтобы умножить вектор на матрицу 3х3 а не nxn matrix.

Пан и Promela

В 1980 году, не прошло и двух лет после бумажной версии Хоара, Джерард Хольцман и Роб Пайк создал анализатор протокола назвали его пан, который принимает ЦСП диалект в качестве входных данных. Пан ЦСП диалект имел сцепления, выбора и циклs, но не имел переменных. Даже так, Хольцман сообщает, что “Пан нашел свою первую ошибку в данных-переключателе в лабораториях Белла - протоколе контроля на 21 ноября 1980 года. ” [14]. Этот диалект был первым языком ЦСП в Bell Labs, и это, конечно, при условии Щука с опытом использования и внедрения ЦСП-подобного языка, его первая из многих.

Анализатор хольцмана - протокол, разработанный в Spin модели и проверки ее языка Promela, какие функции первого класса каналы таким же образом, как Newsqueak (см.).

Newsqueak

Двигаться в другом направлении, Лука Cardelli и Роб Пайк разработал идеи в ЦСП в Squeak мини-язык [4] для генерации кода пользовательского интерфейса. (Этот Squeak  отличается от Squeak реализации на языке smalltalk.) Пайк позже расширил Squeak в полноценный язык программирования Newsqueak [5][6] который родился из Plan  9-х Алеф [7] [8], Инферно Лимб [9], и Google Go [13]. Основная смысловая преимущество Newsqueak перед Squeak это Newsqueak использует каналы связи как объекты первого класса: в отличие от ЦСП и писк, каналы можно хранить в переменных, переданных в качестве аргументов для функций, и посылать по всем каналам. Это в свою очередь позволяет программам строить структуры коммуникации, что позволяет создавать более сложные структуры чем можно было бы разумно дизайнить вручную. В частности, Дуг Макилрой продемонстрировал как средства связи что Newsqueak может быть использован для записи элегантных программ для манипулирования символическими сериями Power [10]. Подобные попытки в традиционных языках программирования, как правило,используются в мире в бухгалтерии. В подобном ключе, Роб Пайк продемонстрировал, как средства связи могут быть использованы чтобы вырваться из общей событийно-ориентированной модели программирования, пишу систему параллельных окно [11].

Алеф

Алеф [7] [8] это был язык, разработанный Фил Уинтерботтом чтобы применить Newsqueak идеи до полноценной системы языка программирования. Алеф имеет два вида, что мы могли бы назвать процессами, процедурами и потоками. Программа организована в одну или более процедур, которые разделяют память процессов операционной системы, которые могут быть заранее запланированными. Каждый процесс содержит одну или несколько задач, которые совместно имеют запланированные сопрограммы. Обратите внимание, что каждой задаче присваивается определенный поток: они не мигрируют между потоками. > для ввода/вывода независимо от основной задачи. (План 9 нет выберите вызов, и даже на Unix вам нужно несколько потоков если вы хотите перекрыть вычисление с сетевого ввода-вывода.) В статье "Акме\ [12] имеет приятное краткое обсуждение по поводу потоков и нитей, как сделано в лекции заметки о плане 9 оконной системы, также упомянуты ниже.

Лимбо

Операционная система Inferno-это план 9 спинофф, предназначенных для сет-топ боксов. Его язык программирования Лимбо [9], находился под сильным влиянием Алеф. Он снял различие между потоками и задачами, эффективно только прокси, если бы они имели меньший вес, чем большинство людей думают, как процессы. Все параллельности является вытесненными. Интересно, что несмотря на это, язык не дает никаких реальных поддержек блокировок. Вместо этого, канал связи, как правило, обеспечивает достаточную синхронизацию и призывает программистов установить, кто всегда четко является владелецем для любого блока данных. Явная Блокировка ненужных потоков.

Libthread

Обратно в плане 9 мир, Алеф составители оказалось трудно поддерживать так как план 9 был портирован на все большее количество архитектур. Libthread изначально был создан для портирования Алеф программы на C, так что Алеф компиляторы могли идти на пенсию. Алеф это прокси и задачи называются проксями и нитями в libthread. В руководство по эксплуатации - является окончательным ссылкой.

Go

Роб Пайк и Кен Томпсон перешел на Google и разместил ЦСП в центре Go язык'а поддерживающий параллелизм.

Приступая К Работе

Для того чтобы получить чувство для модели, особенно как для процессов и потоков и их взаимодействия, то стоит почитать Руководство пользователя Алеф по [8]. Первые тридцать слайдов это презентация с хорошим введением в как Алеф конструкты представлены в C.

Лучшие примеры мощность модели CSP-это Макилрой и документы Пайк, упомянутые выше [10] [11].

Главная страница Роба Пайка содержит конспекты лекций от курса по параллельному программированию: электронное введение, и слайды о двух вышеуказанных документах: щурясь and система окна. Последний из трех является хорошим примером того, как План 9 программ обычно используют прокси и задачи.

Роб Пайк дал техничекие разговоры в Google и это обеспечивает хорошее введение (57-минутное видео).

Rob Pike's half of his 2010 Google ввода-вывода поговорить с Рассом Коксом показано, как использовать каналы и перейти в параллелизм для реализации балансировки нагрузки системы управления работой.

Связанные Ресурсы

Джон Reppy применяет одни и те же идеи в ML, производство Одновременных ML. Он использовал XML для создания, среди прочего, the eXene многопоточный (не событийную) системы х Window инструментов.

References

[1] C. A. R. Hoare, “Взаимодействующие Последовательные Процессы,” Коммуникаций АКМ 21(8) (August 1978), 666-677.

[1a]C. A. R. Hoare, Взаимодействующие Последовательные Процессы. Прентис-Холл, Энглвуд Клифс, Нью-Джерси, 1985.

[2] Майкл С. Махони, изд., Проект Устной Истории Unix, В Выпуске 0: Начало

[3] М. Дугласом Макилроем внутренний меморандум Белл Лабс, October 1964.

[4] Luca Cardelli and Rob Pike, “Squeak: язык для общения с мышами,” Компьютерная Графика, 19(3) (Июля 1985 года: конференции siggraph '85 производства), 199-204.

[5] Rob Pike, “Реализация Newsqueak,” Программное обеспечение-практика и опыт, 20(7) (Июля 1990), 649-659.

[6] Роб Пайк, “Newsqueak: язык для общения с мышами,” Информатики Технический Отчет 143, AT&T Лабораториях Белл, Мюррей-Хилл, 1989.

[7] Фил Уинтерботтом, “Алеф Справочник По Языку Руководство,” in План 9 руководство программиста: два тома, AT&T, Мюррей-Хилл, 1995.

[8] Боб Flandrena, “Алеф Руководство Пользователя,” in Plруководство программиста 9: два тома, AT&T, Мюррей-Хилл, 1995.

[9] Деннис М. Ритчи, “Лимбо Язык Программирования,” in Руководство Инферно программиста, Объем 2, Жизнь Ltd., York, 2000.

[10] М. Дугласом Макилроем, “Щурясь в серии Power,” Программное обеспечение-практика и опыт, 20(7) (July 1990), 661-683.

[11] Rob Pike, “A Система Параллельных Окно,” Вычислительных Систем, 2(2) 133-153.

[12] Роб Пайк, “Акме: пользовательский интерфейс для программистов,” Труды зима 1994 года конференции usenix, 223-234.

[13] golang.org, “Go Язык Программирования”.

[14] Джерард Хольцман, “Spin's Roots”.

[15] Джерард Хольцман, “Promela - cправочник по языку”.