Pull to refresh
  • by relevance
  • by date
  • by rating

Fork в приложениях использующих event loop

Perl *
Существуют разные способы реализовать одновременную обработку данных: fork, threads, event loop… и, насколько я понимаю, вместе они уживаются довольно паршиво.

Давайте возьмём event loop и fork. Есть ли смысл использовать их в одном приложении? На первый взгляд — конечно, есть! Event loop будет нормально работать только при условии, что обработчики событий отрабатывают достаточно быстро. И как только какой-то обработчик начинает требовать много времени для работы, первое что приходит в голову — отforkнуть его в отдельный процесс (в принципе есть ещё и нити, но в perl с ними туго, так что этот вариант даже не рассматриваем).

Но это на первый взгляд. А если копнуть глубже…
Читать дальше →
Total votes 4: ↑4 and ↓0 +4
Views 3.5K
Comments 12

Проще сделать самому, или to fork() or not to fork()

Lumber room
Решая проблему вычисления объемных данных в циклах частенько тянет распараллелить задачку.
Конечно же в perl есть сразу пара моделей: fork или thread, позволюящих использовать «многопоточность». Реализация каждого способа и религиозные предпочтения к материалу данной заметки не относятся.
Говорить будем о подкреплении выбора «делить/не делить» цифрами.
Читать дальше →
Total votes 16: ↑4 and ↓12 -8
Views 392
Comments 10

Процесcы в операционной системе Linux (основные понятия)

Configuring Linux *
Sandbox
Основными активными сущностями в системе Linux являются процессы. Каждый процесс выполняет одну программу и изначально получает один поток управления. Иначе говоря, у процесса есть один счетчик команд, который отслеживает следующую исполняемую команду. Linux позволяет процессу создавать дополнительные потоки (после того, как он начинает выполнение).

Linux представляет собой многозадачную систему, так что несколько независимых процессов могут работать одновременно. Более того, у каждого пользователя может быть одновременно несколько активных процессов, так что в большой системе могут одновременно работать cотни и даже тысячи процессов. Фактически на большинстве однопользовательских рабочих станций (даже когда пользователь куда-либо отлучился) работают десятки фоновых процессов, называемых демонами (daemons). Они запускаются при загрузке системы из сценария оболочки.

Читать дальше →
Total votes 106: ↑68 and ↓38 +30
Views 20K
Comments 37

Параллельные вычисления, класс-обёртка для pcntl_fork()

PHP *
Хочу показать свой базовый класс, который я использую для PHP скриптов.
Приемущество его в том, что легко можно «распараллелить» работу.
Используется pcntl_fork() со всеми «вытекающими».

(тестировалось только на линукс)
Читать дальше →
Total votes 43: ↑33 and ↓10 +23
Views 6.6K
Comments 47

AzaThread — многопоточность для PHP с блэкджеком

PHP *
В сети гуляет довольно много решений для эмуляции многопоточности в php. Чаще всего они основываются на форках, но есть и вариации на тему с использованием curl, proc_open и т.п.

Все встреченные варианты по тем или иным причинам меня не устроили и пришлось написать свое решение.
Набор требований у меня был следующий:
  • Использование форков;
  • Синхронный режим с сохранением интерфейса при отсутствии необходимых расширений;
  • Многократное использование дочерних процессов;
  • Полноценный обмен данными между процессами. Т.е. запуск с аргументами и получение результата по завершении;
  • Возможность обмена событиями между дочерним процессом-«потоком» и основным процессом во время работы;
  • Работа с пулом потоков с сохранением многократного использования, передачи аргументов и получения результатов;
  • Обработка ошибок выполнения;
  • Таймауты на выполнение работы, ожидание работы потоком, инициализацию;
  • Максимум производительности;

В результате получилась библиотека AzaThread (старое название — CThread).
Подробности
Total votes 156: ↑146 and ↓10 +136
Views 17K
Comments 66

ForkCMS — новая вилка с ложкой

CMS *
Доброе время суток хабражители.
На днях, шарясь на просторах интернета, в одном дизайнерском блоге наткнулся на статью, в которой автор восхищался адаптивной версткой на сайте www.fork-cms.com. Меня эта статья привлекла именно суффиксом CMS. «Очередной велосипед» подумал я. И по большому счёту оказался прав. Но все же мне захотелось поделиться этой находкой с сообществом.
Итак, встречайте, Fork CMS из глубин Тихого океана от самого Тритона.


* Изображение с официального сайта ForkCMS
Читать дальше →
Total votes 33: ↑18 and ↓15 +3
Views 3.8K
Comments 22

Написание программ на PHP с использованием fork()

High performance *PHP *

Параллельные программы на PHP


Раньше заголовок темы был «Написание многопоточных программ на PHP». В PHP есть ровно один «нормальный» способ писать приложения, которые используют несколько ядер/процессоров — это fork(). О прикладном использовании системного вызова fork() в языке PHP и расширения pcntl я и расскажу. В качестве примера мы напишем достаточно быструю параллельную реализацию grep (со скоростью работы, аналогичной find . -type f -print0 | xargs -0 -P $NUM_PROCS grep $EXPR).
Читать дальше →
Total votes 111: ↑89 and ↓22 +67
Views 33K
Comments 62

Bash: запускаем демон с дочерними процессами

Programming *
Sandbox
Доброго всем настроения!
Прочитал я вот эту статью, и решил немного сам взять в руки шашки, и попробовать сделать что-нибудь приятное для себя и для других.
Мой скрипт не делает никаких полезных вещей, но думаю для более менее начинающих писателей на bash он чему-нибудь научит, да и если будут комментарии, то и я научусь от тех людей которые укажут на мои ошибки.

Вводная

Скрипт будет запускаться в фоне демоном. Сразу думаю надо договориться что сам процесс который будет висеть в памяти постоянно я буду называть «Родителем». Родитель будет в определенном каталоге искать определенный файл, и если он существует, то файл будет удален и запущен процесс, который я буду называть «Потомок», целью которого будет просто спать какое-то время, и после чего завершиться. Но Родитель не должен будет запускать более одного Потомка в единицу времени. В принципе, если Вы прочитали вышеуказанную статью, то смысл я думаю понятен.
Читать дальше →
Total votes 24: ↑22 and ↓2 +20
Views 40K
Comments 15

fork() vs. vfork()

Embox corporate blog System Programming *C *
Sandbox
Послушайте!
Ведь, если звезды зажигают — значит — это кому-нибудь нужно?

В. В. Маяковский, 1914


Я занимаюсь программированием для встроенных систем, и данную статью решил написать для того, чтобы лучше разобраться с проблемой использования системных вызовов fork() и vfork(). Второй из них часто советуют не использовать, но ясно, что появился он не просто так.

Давайте разберёмся, когда и почему лучше использовать тот или иной вызов.

В качестве бонуса будет приведено описание реализаций vfork()/fork() в нашем проекте. Прежде всего, мой интерес связан с применением этих вызовов во встроенных системах, и главной особенностью приведённых реализаций является отсутствие виртуальной памяти. Возможно, хабровчане, хорошо разбирающиеся в системном программировании и во встроенных системах, дадут советы и поделятся опытом.

Кому интересно, прошу под кат.
Читать дальше →
Total votes 80: ↑74 and ↓6 +68
Views 36K
Comments 29

Java 8 в параллель. Учимся создавать подзадачи и контролировать их выполнение

Programming *Java *Concurrent computing *
Продолжаем цикл статей, посвященный обработке больших объемов данных в параллель (красивое слово, неправда?).

В предыдущей статье мы познакомились и интересным инструментарием Fork/Join Framework, позволяющим разбить обработку на несколько частей и запустить параллельно выполнение отдельных задач. Что нового в этой статье – спросите Вы? Отвечу – более содержательные примеры и новые механизмы для качественной обработки информации. Параллельно я вам расскажу о ресурсных и прочих особенностях работы в этом режиме.



Всех заинтересованных приглашаю под кат:
Читать дальше →
Total votes 15: ↑11 and ↓4 +7
Views 31K
Comments 10

Неожиданное поведение openssl_random_pseudo_bytes() приводящее к фатальной потере криптостойкости

PHP *
Доброго времени суток всем.

Недавно в одном из проектов мы столкнулись со следующей проблемой — функция openssl_random_pseudo_bytes() выдавала дублирующиеся псевдослучайные последовательности!

Этого не может быть, потому что этого не может быть никогда! — Скажет любой, кто читал документацию этой функции. И, да, $crypto_strong исправно выдавал TRUE.

И тем не менее — ошибки уникальности при вставке в базу сыпались пачками и лог подтверждал — 32-байтные последовательности генерировались повторно через разные интервалы, от суток до недели. Расследование заняло целый месяц. Сейчас я на 99% уверен, что причина найдена — но буду благодарен, если Хабражители подтвердят или опровергнут мои выводы.

Так в чем же было дело?
Total votes 36: ↑32 and ↓4 +28
Views 18K
Comments 10

Реализация fork() без MMU

Embox corporate blog Abnormal programming *Open source *System Programming *C *
Здравствуй, читатель! Пару лет назад в статье про vfork() я обещал рассказать про реализацию fork() для систем без MMU, но руки до этого дошли только сейчас :)

В этой статье я расскажу, как мы реализовали такой странный fork(). Проверять работоспособность буду на сторонней программе — dash — интерпретаторе, который использует fork() для запуска приложений.

Кому интересно, прошу под кат.
Читать дальше →
Total votes 43: ↑42 and ↓1 +41
Views 7.2K
Comments 1

Форк блокчейна Ethereum, или «вот так свобода и умирает, под гром аплодисментов»

Finance in IT Cryptocurrencies
Звёздные войны. Эпизод III: Месть ситхов. Сцена с выступлением, пока еще, канцлера Палпатина в сенате.

Криптовалюта Ethereum стоит на историческом распутье, которое оставит неизгладимый след в её истории. О «чёрных списках», централизованной «децентрализованной автономности» и почему сообщество с такой радостью, рвением и беззаботностью открывает ящик регуляции криптовалюты, тем самым забивая гвозди в гроб Ethereum.
Читать дальше →
Total votes 50: ↑42 and ↓8 +34
Views 30K
Comments 171

Почему ограничение лимита размера блока опасно для bitcoin и про segwit2x

Cryptocurrencies
В ноябре 2017-го, произойдет действительно важный хардфорк bitcoin, а не мусорный хайп-форк bitcoin cash (весь смысл которого — принципиальная не поддержка segwit и 8мб лимит бока), прошедший первого августа, единственной целью которого, по моему мнению, было отвлечение внимания и сил сообщества от реальной проблемы. Номер блока старта segwit2x стал точно известен — это будет блок 494 784.

Напомню коротко, в феврале 2016-го, значимыми участниками, включая bitcoin core, было подписано соглашение Bitcoin Roundtable Consensus in Hong-Kong, в котором описывался поэтапно процесс внедрения нового формата транзакций segregated withness и увеличение лимита размера блока до 2мб но не больше 4мб.

Вне зависимости от того, кто виноват, полагаю обе стороны вели себя более чем неразумно (я считаю большая часть вины на майнерах), условия это соглашения не были выполнены в срок, и через год — в мае 2017-го, уже без участия представителей bitcoin core было подписано новое соглашение — Bitcoin Scaling Agreement in New York, подразумевающее фактически то же самое но в порядке, не совместимом с планом, проводимым командой bitcoin core.

По факту происходит попытка отъема управляющих и координирующих функций у команды bitcoin core.
Читать дальше →
Total votes 25: ↑19 and ↓6 +13
Views 17K
Comments 12

Что именно произойдет в момент активации форка bitcoin segwit2x в ноябре?

Cryptocurrencies

Что произойдет


После вводной статьи о ситуации с текущим форком bitcoin — segwit2x, позволю себе немного пованговать. Что же именно произойдет в середине ноября 2017-го? Перейдут ли все биржи и пользователи на новый кошелек btc1 (именно он позиционируется как совместимый с технологией segwit2x) или все дружно, включая майнеров скажут ой мы ошиблись, bitcoin core лапочки, давайте жить дружно и т.п?


Читать дальше →
Total votes 9: ↑6 and ↓3 +3
Views 16K
Comments 28

fork() может потерпеть неудачу: это важно

Configuring Linux *System administration **nix *
Translation
Эх, fork(). Одни процессы порождают другие. Кажется, у меня есть история об этом.

Форк может потерпеть неудачу. Понимаете? В самом деле, понимаете? Это очень серьёзно. Форк может завершиться с ошибкой. Так же, как и malloc. Нечасто, но когда такое происходит, нельзя просто взять и игнорировать это. Вы должны что-то предпринять в таком случае.

Похоже, всем известно, что fork возвращает дочернему процессу 0, а родителю некоторое положительное число — pid ребенка. Он выдаёт этот номер, который используется позже.

Угадайте, что происходит, когда вы не проверяете ответ на ошибку? Да, вы обработаете "-1" (ошибка форка) в качестве валидного pid.
Читать дальше →
Total votes 189: ↑169 and ↓20 +149
Views 23K
Comments 256

fork() — зло; vfork() — добро; afork() — лучше; clone () — глупо

OTUS corporate blog Programming *C *
Translation

Недавно я наткнулся на реализацию popen() (та же идея, другой API) с использованием clone(2), где я открыл issue с запросом использования vfork(2) или posix_spawn() в целях лучшей переносимости на другие платформы. Оказывается, для Linux есть одно очень важное преимущество в использовании clone(2). И вот я думаю, что мне следует раскрыть тему, которую я там затронул, где-нибудь еще: в гисте, в блоге, да где угодно.

Итак, начнем.

Давным-давно я, как и многие фанаты Unix, думал, что fork(2) и модель порождения процессов fork-exec были лучшим решением в мире, а Windows нервно курил в сторонке, имея только exec*() и _spawn*(), последний из которых был чистым виндоусизмом.

После многих лет практики я пришел к выводу, что fork(2) на самом деле является злом. А vfork(2), долгое время считавшийся злом, на самом деле является добром. Изящная вариация vfork(2), которая избегает необходимости блокировать родителя, была бы даже лучше (об этом чуть позже).

Такие серьезные заявки требуют объяснений, поэтому позвольте мне объяснить все по порядку.

Я не буду утруждать себя объяснением, что такое fork(2) - если вы это читаете, я полагаю, вы уже знаете. Но я расскажу про vfork(2) и почему он считается опасным. vfork(2) очень похож на fork(2), но новый процесс, который он создает, запускается в том же адресном пространстве, что и родительский, как если бы он был потоком. Он даже разделяет тот же стек с потоком, который вызвал vfork(2)! Два потока не могут совместно использовать стек, поэтому родительский процесс останавливается до момента, когда дочерний выполнит свою задачу: либо exec*(2), либо _exit(2).

Читать далее
Total votes 21: ↑12 and ↓9 +3
Views 3.7K
Comments 2