13 ноября 2013

Многопоточное программирование. Материалы

Приветствую читателей своего блога в очередной раз.
Сегодня речь пойдёт о такой интересной, и одновременно сложной, теме - многопоточное программирование. А точнее - о материалах, которые можно найти по данной теме, в сети. Все упоминаемые мною источники я "пропустил" через себя и поэтому представляю их обзор.

Дисклаймер.
Я не являюсь спецом по concurrency. Всё описанное дальше - всего лишь мой путь, который я прошёл в изучении данного вопроса.Так что если вы, как и я, были знакомы с concurrency только понаслышке в рамках небольшого теоретического университетского курса по современным ОС и вам этого оказалось мало - возможно, данный пост вас подтолкнёт к продолжению изучения данной темы.

Плох тот студент - будущий системный программист, если его не интересуют вопросы параллельных и распределённых вычислений. Учитывая существующие реалии, когда ко всему серьёзному ПО, работающему на кластерах, с каждым годом предъявляются всё более строгие требования по увеличению throughput (пропускной способности системы) и/или уменьшению latency (задержки, отклика на действие), единственным способом справиться с нагрузкой без потери важных бизнес-качеств (например, latency) становится распределение общей нагрузки на многочисленные физические вычислительные устройства (будь то потоки или отдельные ноды (машины) кластеров). Поэтому грамотное понимание особенностей разработки подобных систем и навыки работы с уже существующими решениями, которые упрощают разработку распределённого или многопоточного софта, стали фактически обязательными требованиями для разработчиков, которые планируют работать над серьёзными приложениями в не менее серьёзных компаниях.

И так, допустим, вы за время учёбы в университете что-то слышали про потоки, процессы. Что программы с ними весьма не тривиальны. И вы так же становитесь неравнодушны к ним, как я к сладкому ;-) Вас опьяняет чувство, что ещё немного, и вы сможете управлять любым количеством физических устройств как одним целым, а не только своим двухъядерным процом с жалким hyperthreading'ом на домашней тачке. И вот тут начинается "засада"...

Мало того, что в университете не удалось реально на практике пописать concurrency-программы под присмотром знающего человека, так у тебя и в реале, скорее всего, нет под рукой железа, на котором можно почувствовать performance boost от concurrency. Да и на работе молодому юнцу писать что-то подобное вряд ли доверят для продакшена, который должен работать "как часы".

Осознавая, что для начала без нормальной теории совсем некуда - начинаешь её искать. Но как показывает поиск в гугле - не так чтобы данную тему освещали так же всеобъемлюще, как выход нового IPhone'a или очередную скандальную выходку какой-то "медийной (mass media) тушки". Но, как говорится, "дорогу осилит идущий" и найти весьма достойные источники информации всё-таки можно. Ими и хочу с вами поделится.

Сделаю небольшую ремарку. Я по специализации Java программист и меня интересовала разработка concurrency прежде всего для неё. Но некоторые указанные ниже источники имеют отношение для многопоточки вцелом.

Первая книга, с которой началось знакомство - это "Современные операционные системы". Э. Таненбаум. Её пришлось прочитать для того самого зачёта по современным ОС в универе. В ней была глава, как про сами потоки, так и про программирование работы с ними в современных ОС.


Вторую книгу мне подсказал мой бывший руководитель на работе - "Java Concurrency in Practice". Brian Goetz, Tim Peierls, Joshua Bloh. Она весьма не маленького размера, но в ней разбираются принципы и особенности реализации многопоточных программ на Java с кучей примеров и с использованием concurrency-примитивов, которые есть в библиотеках Java. Очень толковая книжка, как и "Effective Java"  Joshua Bloh. По поему скромному мнению, эти две книжки должен прочитать каждый уважающий себя Java программист.

Само собой для написания реальных concurrency-программ не мешало бы прочитать про основы работы с потоками и синхронизацией в Java из той же "Thinking in Java (4th Edition)" Bruce Eckel, но мне эта книжка попалась в руки весьма поздно. Для совсем уж досконального понимания принципов работы concurrency-программ на Java не мешало бы ознакомиться с Java Memory Model (до неё у меня пока руки не дошли).


Одним прекрасным днём я для себя открыл сайт jug.ru (и соответственно YouTube-каналы JUGRuVideo, СodeFreezeVideo, ITmozg.ru)  на которых выложены записи докладов инженеров разных компаний в том числе и по разработке высоконагруженных приложений. Особенно доставляют доклады Алексея Шипелёва, Сергея Куксенко (инженеры Oracle), Романа Елизарова (DevExperts) и товарищей из сервиса Badoo. Первые два канала рекомендую посмотреть почти целиком. Оно того стоит.

Да, всё это классно, но докладчики редко готовят свои презентации "для новичков" и всё-таки ощущается неприятный "осадок" оттого, что вместо последовательного обучения ты смотришь "сборную солянку" из решений разных проблем, с которыми люди сталкиваются на практике при разработке систем, и их опыт не так чтобы тебе близок. И тут приходит на помощь...

Яндекс. А точнее выложенные лекции Школы Анализа Данных (ШАД) по многопоточному и распределённому программированию. Посмотрев вступительный ролик, понимаешь, что это кажется то, что тебе реально не хватало. При чём, обучение не останавливается на многопоточном программировании (Java, OpenMP), затрагиваются и распределённые системы (MPI), MapReduce, NoSQL. А узнав, что домашние задания студенты ШАДа выполняют на учебном кластере из 20 машин, на каждой из которых по 12 хардварных ядер + hyperThreading, просто начинаешь люто завидовать этим студентам :-). Посмотрев почти целиком все лекции, понимаешь, что именно так должен был выглядеть университетский курс, который бы ты точно посещал без прогулов.

Ну вот и всё. Мне кажется, что данного объёма информации вполне достаточно, чтобы смело начинать писать свои первые надёжные concurrency-программы. Если я что найду ещё интересного - обязательно допишу в этот пост. Если у вас есть достойные материалы по данной теме - присылайте ссылки и они дополнят данный список.

Спасибо за внимание.

2 комментария:

  1. Добавлю еще две полезные ссылки:
    Модель памяти в примерах и не только
    https://habrahabr.ru/post/133981/
    Безопасная публикация и инициализация Java-объектов, или когдаужепочинятdoublecheckedlocking
    https://shipilev.net/blog/archive/safe-publication/
    Ну и весь блог Алексея Шипелева: https://shipilev.net/

    ОтветитьУдалить
  2. В догонку:
    Close Encounters of The Java Memory Model Kind
    https://shipilev.net/blog/2016/close-encounters-of-jmm-kind/

    ОтветитьУдалить