Доброго времени суток Хабр. Вдохновленный моделью синхронизации потоков в go и сигналов в QT появилась идея реализовать нечто подобное на c#.
Если интересно, прошу под кат.
Читать полностью »
Доброго времени суток Хабр. Вдохновленный моделью синхронизации потоков в go и сигналов в QT появилась идея реализовать нечто подобное на c#.
Если интересно, прошу под кат.
Читать полностью »
Добрый день, это «Без слайдов». В гостях у меня побывал Роман Елизаров, Java Champion, эксперт по Java и многопоточности (а с недавнего времени — еще и по финансовой математике), спикер многочисленных конференций, председатель жюри Северо-Восточного Европейского региона ACM-ICPC, престижнейшей в мире олимпиады по программированию, лектор в ИТМО и, наконец, VP по технологиям в компании Devexperts. В общем, «человек и пароход».
В разговоре мы затронули следующие темы:
Текстовая версия — под катом.
Читать полностью »
В Сети уже очень много написано об атомарных операциях, но в основном авторы рассматривают операции чтения-модификации-записи. Однако, существуют и другие атомарные операции, например, атомарные операции загрузки (load) и сохранения (store), которые не менее важны. В этой статье я сравню атомарные загрузки и сохранения с их неатомарными аналогами на уровне процессора и компилятора C/C++. По ходу статьи мы также разберемся с концепцией «состояния гонок» с точки зрения стандарта C++11.
Читать полностью »
Как-то, анализируя дефект в разрабатываемом продукте, я наткнулся на архитектурную особенность менеджера памяти, который мы использовали. Дефект приводил к увеличению времени создания некоторых объектов. Особенность архитектуры заключалась в использовании паттерна Singleton при работе с менеджером памяти (далее X allocator). Схематично это выглядит так:
Рисунок 1 – Структурная схема работы X allocator
Из схемы видно, что доступ к глобальной куче защищен мьютексом. Такая архитектура, при интенсивном создании однотипных объектов из нескольких потоков, может привести к тому, что потоки будут вставать в очередь на этом мьютексе. А ведь одна из главных особенностей продукта – это возможность его масштабирования за счет увеличения количества потоков обработки (потоков выполняющих одинаковые действия). Поэтому такой подход потенциально может стать узким местом.
Читать полностью »
Cобрал небольшую подборку вопросов. Возможно кому-то она будет полезна.
— В чем разница между потоком и процессом?
— Что такое кооперативная многозадачность и она ли в Java. Если да, то какие преимущества. Если нет, то какая тогда в Java?
— Сравните кооперативную и вытесняющую многозадачности.
— Что такое «зеленый потоки» и они ли в Java (в HotSpot JVM 7)?
— Когда началась «Multicore Era»?
— Что такое — Планировщик потоков? Предположите алгоритм работы.
— Какие выигрыши может дать многопоточность на одноядерной машине?
— Что такое Flynn's taxonomy, SISD/MISD/SIMD/MIMD? К какому классу относятся CPU? GPU?
— Расскажите про иерархию кэшей L1/L2/L3? Что вызвало ее появление?
— Что такое Memory wall?
— Что такое Memory Hierarchy?
— Что такое Cache line? В виде каких эффектов проявляется?
— Что такое False sharing? Плохо это или хорошо? Как с этим бороться?
— Что такое Memory padding?
— Что такое Cache pollution? Плохо это или хорошо? Как с этим бороться?
— Что такое Cache miss? Плохо это или хорошо? Как с этим бороться?
— В чем разница между SMP и NUMA? Как это сказывается на программах?
— В чем разница между Multicore и Multisocket?
— Что такое Thread affinity? Можно ли сделать в Java?
— Что такое Inter Thread Parallelism? Task Parallelism?
— Что такое Branch Prediction?
— Что такое Speculative Execution?
— Сравните с точки зрения программиста — машину с четырехядерным процессором и двумя двухядерными процессорами.
— Напишите программу, которая демонстрирует False sharing.
— Напишите программу, которая демонстрирует размер кэша L1.
— Напишите программу, которая демонстрирует размер кэша L2.
Читать полностью »
Переводы предыдущих двух частей:
Первая часть
Вторая часть
Это статья Jesse Storimer. Он выступает на семинаре Unix fu, онлайн классе для Ruby-разработчиков, которые хотят научиться удивительным хакам в Ruby и повысить свой уровень в разработке серверного стека. Количество участников ограничено, так что поторопитесь, пока есть свободные места. Так же, он является автором книг «Работа с Unix процессами», «Работа с TCP сокетами» и «Работа с потоками в Ruby».
В Ruby-сообществе существуют некоторые заблуждения относительно GIL в MRI-реализации интерпретатора. Если вы хотите узнать ответ на главный вопрос этой статьи, без ее прочтения, то вот он: GIL не делает ваш код на Ruby потоко-безопасным.
Но вы не должны принимать мои слова на веру.
Читать полностью »
Добрый день.
15 мая была проведен первый вебинар (из 16) курса «Multicore programming in Java». Вебинары, видео в записи, исходный код программ и проверка заданий доступны только записавшимся на курс (запись еще открыта, свяжитесь по контактам внизу страницы). Но тут я бы хотел опубликовать материалы, упоминавшиеся на лекции: ссылки на источники, термины, картинки, задание. Возможно кто-то сочтет их полезными для себя.
Стоит «посмотреть картинки» в следующих источниках
У Java отличная поддержка параллелизма (concurrency) и блокировки (locking) — возможно, самая лучшая из тех, что предлагают современные языки. Кроме того, что в самом языке есть встроенная поддержка синхронизации, существует целый ряд полезных утилит на основе AQS framework. К ним относятся CountDownLatches, Barriers, Semaphores и прочие. Однако часто встречается ситуация, не поддерживающаяся напрямую: когда надо блокировать доступ не к конкретному объекту, а к идее этого объекта.
Rust — новый язык программирования, разрабатываемый корпорацией Mozilla. Главная цель разработчиков — создание безопасного практичного языка для параллельных вычислений. Первая версия языка была написана Грэйдоном Хором в 2006 году, а в 2009 году к разработке подключилась Mozilla. С тех пор изменения претерпел и сам компилятор, изначально написанный на OCaml: он был успешно переписан на Rust с использованием LLVM в качестве back-end.
Основным продуктом, разрабатываемым на Rust, является новый веб-движок Servo, разработка которого также ведется Mozilla. В 2013 году к разработке Rust и Servo присоединилась корпорация Samsung Electronics, при активном участии которой код движка Servo был портирован на ARM архитектуру. Поддержка языка столь серьезными игроками IT индустрии не может не радовать и дает надежду на его дальнейшее активное развитие и совершенствование.
Язык Rust просто не может не понравится системным и сетевым разработчикам, тем, кому по работе приходится писать много кода, производительность которого критична, на C и C++, потому что:
Доброго времени суток, уважаемые читатели!
Этим постом я продолжаю серию статей, направленных на борьбу за чистоту и безопасность разрабатываемых многопоточных программ.
Рисунок 1 – Взаимная блокировка 1-го рода с участием сигнальной переменной.
В рамках этого поста мы рассмотрим проблемы, которые возникают при использовании сигнальных переменных, и покажем, как их можно избежать.Читать полностью »