Відэлец-Далучайцеся да распрацоўкі ў Java™ SE ў

Відэлец-далучайцеся для паўсядзеннага, шмат’ядравыя прыкладання java™

Разгалінаванне або падзяляць нагрузку на некалькі задач для паралельнай апрацоўкі і аб’яднанне вынікаў разам-гэта метад, які выкарыстоўваецца ў незлічоных навуковых, лік храбусценне прыкладанняў. Многія іншыя прыкладання маглі скарыстацца відэльцам-далучайцеся апрацоўкі, але выкарыстоўваючы навуковы падыход не можа быць у іх інтарэсах.

Гэты артыкул уяўляе сабой «надзвычай паралельныя» відэлец-далучайся падыход, які добра працуе як для паўсядзеннага, шмат’ядравых прыкладанняў на Java™ SE, я, а таксама Android.™ (3000 слоў)

Эдвард Harned (а ў coopsoft кропка ком) Старэйшы Распрацоўшчык, Кааператыў Праграмных Сістэм, Інк. Люты, 2010 [абноўлена чэрвень 2013]

Што такое «разгалінаванне-зліцце»?

Думаць аб скрыжаванні дарог, дзе кожны шлях рана ці позна прыходзіць назад разам аб’яднанняў.

Відэлец-далучайцеся разбівае заяўку на некалькі частак для паралельнай апрацоўкі і аб’ядноўвае вынікі ў канцы.

Мал. 1: Відэлец-Далучайцеся Да Структуры

Fork-Join Structure

Дапусцім, у нас есць масіў з тысячы лікаў. Мы павінны зрабіць працэдуру на кожнае з гэтых лікаў і дадаць да агульнай.

Лістынг 1: Блок Апрацоўкі


for (int i = 0; i < 1000; i++) {
total += doProcedure(array[i]);
}

Калі працэдура зойме адну секунду (час працы), пасля чаго яна збіраецца заняць адну тысячу секунд (больш 16½ хвілін), каб завяршыць гэтую задачу.

Відэлец-маглі б далучыцца

  • паасобнае (відэлец) на вялікія масівы масіў у дзесяці з ста элементаў, кожны,
  • апрацоўвае кожны блок на асобным працэсары, і
  • аб’яднанне вынікаў, калі скончыў.

Што б узяць сто секунд (крыху больш за 1½ мін.), дзясятая частка першапачатковага часу. Чым больш працэсараў даступны, тым хутчэй вынік.

Гэта якія навуковыя вылічэнні-гэта ўсе аб — адначасова апрацоўваць велізарныя аб’емы дадзеных на, як многія ЦП калі такая маецца. Гэтая абстракцыя нагадвае стандартную навуковую мадэль «падзяляй і ўладар».

Падзяляй і ўладар-гэта натуральная парадыгма паралельных алгарытмаў. Пасля дзялення праблемы на дзве або больш подзадач, метад вырашае подзадач паралельна. Як правіла, на суб-праблемы вырашаюцца рэкурсіўна і, такім чынам, наступны крок падзяліце ўраджаі нават больш подзадач для рашэння ў паралельным рэжыме.

Малюнак 2: «падзяляй і ўладар»

Divide and Conquer

Праблемы з дапамогай fork-аб’яднаць навуковую мадэль для штодзеннага прымянення

Пастаноўка задач-гэта не праблема; яны толькі аб’екты. Праблема-гэта вялікая колькасць патокаў апрацоўкі задач, калі гэтыя задачы трэба:

Злучэння

Звароты да выдаленых сэрвісаў (СКБД, сістэмы абмену паведамленнямі, і многія іншыя) патрабуе падлучэння да выдаленай службе. Як правіла, дыстанцыйныя сэрвісы выкарыстоўвайце нітка для апрацоўкі і злучэнні, што патрабуе памяці, пераключэнне кантэксту, сінхранізацыі і каардынацыі. Чым больш падлучэнняў да сэрвісу, тым больш рэсурсаў на абслугоўванне патрэбаў, а чым менш злучэнняў, даступных для выканання іншых задач у jvm. Што ўплывае на кожнага карыстальніка.

Замкі

Замкі на забойцу высокая прадукцыйнасць. Мертвыя/жывыя замкі, інверсія прыярытэтаў, галаданне, канваіраванне і накладныя (што ідзе ўверх па экспаненце з даўжыней спіс задач) некалькі праблем з дапамогай замкаў.

Семафоры

Чым больш патокаў, якія хочаце вырашыць адначасова некалькі патокаў, якія павінны чакаць дазволу ад наяўнасці магчымасці. Гэта вяртае нас да ўсе праблемы з дапамогай замкаў.

Кагерэнтнасць кэш-памяці

Калі некалькі працэсараў доступ/абнаўленне адной і той жа зменнай ўнутры радкі кэша, (блок дадзеных капіюецца з асноўнай памяці, змяшчае шмат палеў), модуляў памяці можа прывесці да анулявання радкі кэша. Гэта не толькі запавольвае дадатак, яно можа паўплываць на іншыя прыкладанні, а таксама.

Шырокая памяць

Чым больш аб’ектаў або чым больш аб’ектаў, тым больш памяці. Чым больш актыўных патокаў апрацоўкі задач, то тым больш памяці выкарыстоўваецца. Натуральна, адсюль вынікае, што вялікі аб’ем памяці задачы неабходнасць рэгулявання.

Неабходнасць гуляць прыемна

Ты прыкладанне не можа быць адзіным дадаткам, якія працуюць на кампутары. Калі адно прыкладанне парсюкоў рэсурсы, кожны адчувае боль. Добра гуляе з іншым, вяртаецца да таго, што ўсе мы даведаліся ў дзяцінстве. Тое ж самае справядліва і пры распрацоўцы праграмнага забеспячэння, якая не запускаецца як асобнае прыкладанне.

Тэма шмат’ядравых развіцця-захаваць разладу, задач, канкуруючых за тыя ж рэсурсы, да мінімуму.

Калі дынамічная декомпозиция парадыгма » падзяляй і ўладар чынам адпавядае вашым патрэбам, тады прачытайце гэтую артыкул, аб высокай эфектыўнасці ДСЕ версія Tymeac. У адваротным выпадку функцыянальнае Разгалінаванне рамкі могуць лепш задаволіць вашы патрэбы.

Функцыянальнае Разгалінаванне Рамкі

Прыкладання java™ГП / мне шмат’ядравых прыкладанняў, а таксама Android™ прыкладання, якія нельга выкарыстоўваць па прынцыпе «падзяляй і ўладар» мадэль, не апрацоўваць вялікія масівы лікаў, або не валодаюць вялікім аб’емам вылічэнняў структура патрэбна функцыянальная разгалінаванне рамкі для распаралельвання прыкладанняў. У прыватнасці, яны павінны раскашэліцца працаваць у сваіх функцыянальных кампанентаў, а не раскласці масіў у аднолькавых подзадач.

Мал. 3: Функцыянальная Разгалінаванне Рамкі

Functional Forking Framework

Функцыянальнае разгалінаванне рамкі мае два абавязковых атрыбутаў. Яна павінна:

  • Абмежаванні канкурэнцыі.
  • Быць простымі ў выкарыстанні або смущающе паралельна.

Абмежаванне Канкурэнцыі

Падтрыманне колькасці актыўных, канкуруючых патокаў да абсалютнага мінімуму мае першараднае значэнне. Самы просты спосаб абмежаваць паток разладу з’яўляецца выкарыстанне парогавых значэнняў для кожнага пула патокаў для абслугоўвання чарзе заданняў. Глядзіце артыкул аб высокай эфектыўнасці прыярытэтных чэргаў у Java SE для прыкладу, як з дапамогай спісаў можна чакаць захавання разьбы рэсурсаў.

Паўторнае выкарыстанне рэсурсаў, а не набыцця новых копій рэсурсаў з’яўляецца пераможцам у мнагабор’і. Мы павінны разгледзець не толькі мэтавай код, але код рэсурсу кіравання як добра.

Возьмем у якасці прыкладу задачу патрэбен доступ да базы дадзеных, што патрабуе [ява.для SQL.]заяву. Выкарыстоўваючы чарзе запытаў, мэтавай код можа падзяліцца той жа інструкцыі для многіх доступаў, а затым набыцце новага заяву для кожнага доступу. Дадзенае выказванне з’яўляецца велізарная эканомія накладных выдаткаў і абмежаванняў канкурэнцыі ў рамках кодэкса па кіраванні.

Што такое смущающе паралельна?

Смущающе паралельных алгарытмаў з’яўляюцца тыя, якія могуць вырашыць мноства падобных, але незалежных задач адначасова, практычна няма неабходнасці ў каардынацыі паміж задачамі. Праблемы такога роду легка такое распаралельванне, што адзін амаль «сорамна» гаварыць аб тым, як проста атрымаць мноства працэсараў, якія працуюць эфектыўна.

Трывожна паралельнае рашэнне можа легка раскашэліцца на некалькі цалкам незалежных кампанентаў, кожны з якіх выконвае на асобным працэсары.

Мал. 4: Паралельны Смущающе

Embarrassingly Parallel

Напрыклад:

Бізнес можа спатрэбіцца аўтаматызаваная сістэма катыровак. Распрацоўка коштавага прапановы, сістэмы патрэбаў наменклатуры Базавая цана (цана базы дадзеных), кліента зніжка на тавары і дастаўку (база дадзеных кліентаў), і асноўныя выдаткі па дастаўцы (грузаадпраўшчыка базы дадзеных.)

Традыцыйна, праграма атрымлівае доступ да кожнай базе серыйна, чакае кожны поўны доступ да ўсіх перш чым перайсці да наступнага доступ.

У паралельнай сістэме, праграма відэльцы() запыт на тры чаргі, кожны з якіх абслугоўваецца пула патокаў, чакае да апошняга доступ аздаблення і злучэння() вынікі разам.

Мал. 5: Цэнавае Прапанову

Вышэйпаказаныя цэнавае прапанова з’яўляецца прыкладам сінхроннага запыту, дзе якая выклікае бок чакае завяршэння. Гэта толькі невялікі крок наперад, каб дадаць падтрымку для асінхроннай або аўтаномнага запыце, дзе абанент не чакае завяршэння.

Есць мноства сітуацый, дзе разгалінаванне праца на кампаненты пажадана:

  • Вазьміце гульнявое дадатак, дзе мы можам відэлец падзея на асобныя кампаненты. Перавагай тут з’яўляецца рызыка; тым больш сегментаў падзеі, якія адбываюцца адначасова, тым цікавей гульня.
  • Бярыце заяву з некалькімі анімацыямі, дзе мы можам відэлец кожная анімацыя выконваецца на ўласным працэсары.
  • Узяць працу апрацоўкі малюнкаў, дзе кожны піксель малюнка павінен мець свой колер назад. Платформа можа легка распаўсюджваць дадзеныя выявы на мноства задач, якія могуць працаваць незалежна адзін ад аднаго.
  • Прыняць фінансавае ўстанова, дзе Re-ацэнка партфеля ўключае ў сябе кампаненты, якія ўзаемадзейнічаюць з розных рынках па ўсім свеце.
  • Вазьміце для прымянення ў сферы аховы здароўя, дзе розныя тэсты кампанентаў у дыягностыцы.

Гэта імкненне бачыць толькі тое, што прыкладанне не можа выкарыстоўваць распаралельванне з функцыянальнай разгалінаванне рамкі.

Як бы гэтыя рамкі выглядаюць у Java-дадатку?

Рамкі для разгалінавання запыт у яго функцыянальных кампанентаў павінен:

Ведаць кампаненты (чарзе) для кожнай аперацыі запыту (функцыя.) Просты клас, які змяшчае радок, імя функцыі і спіс звязаных чэргаў з’яўляецца асноўным праграмавання java™.

Лістынг 2: Функцыя Класа


public class Function {

private String name; // Function name
private Queue[] que;   // Queues for this Function
}

Размесціце запыт (які змяшчае ўваходных аб’ектаў) у кожнай з чэргаў аб’екта масіва назад якая выклікае баку або ігнараванне вяртаюцца аб’ектаў.

Лістынг 3: паставіць у чаргу


public Object[] fork(Queue[] que, Object request) {

Object[] return_obj = new Object[] {null, null, null};

      for (int i = 0; i < que.length; i++) {
putInQueue(que[i], return_obj [i], request);
}

return return_obj;
}

 

Дачакайцеся завяршэння/тайм-аўт або не чакаць.

Лістынг 4: чакаць/nowait ў


public boolean join(Object[] obj) {

/* when all elements are non-null, return true
* wait for a while
* after an interval, return false
*/

}

Вяртання вынікаў якая выклікае баку або ігнараваць аб’екты

Мал. 6: вяртанне да выклікалай   

Return Object[]

Для пабудовы гэтых рамках мы б:

  1. Неабходнасць падтрымання актуальнай задачай кода, што робіць працу
  2. Трэба весці спіс чарзе і функцый
  3. Неабходнасць падтрымання «старт ап» — клас, які загружае чэргаў і функцыі ў памяці

(1) код, які выконвае гэтую працу павінен выглядаць так:

Лістынг 5: Код Працы


public static Object main(Object obj) {}

Метад main (), якая прымае аб’ект (уваход ад выклікалай боку) і вяртае аб’ект (вынік працы.)

(2) мы маглі б падтрымліваць чэргаў і функцыі як аб’екты ў просты спіс класа.

(3) Запусціце мог проста загрузіць спіс класаў у памяць з новай (спіс класа) і пачаць патокаў для кожнай чарзе.

Як просты выклік функцыі можа выглядаць:

Лістынг 6): Просты Званок


Framework
fw = new Framework();

// For each call:
Function
func = fw.getFunction(name);
Object[] back =
func.fork(request};

Гэтая аснова простая ў выкарыстанні, на здзіўленне простая.

Рэзюмэ

Да гэтага часу мы бачылі, як разгалінаванне запыт у яго функцыянальныя кампаненты могуць працаваць у якасці ўбудаванага кампанента аднаразовага прымянення (у межах той жа самай jvm.) Каб быць практычнымі, мы таксама павінны зрабіць гэтую схему даступнай для jvm ад іншых. Проста, яна павінна падтрымліваць мноства карыстацкіх выклікаў адначасова ў якасці сервера

Што робіць яго сервер

Якія змены мы павінны зрабіць, каб выкаваць гэты просты фреймворк на серверы?

  1. Мы павінны аддзяліць абанента ад працы.
  2. Мы павінны забяспечыць аднаўленне пасля памылак.
  3. Мы павінны падтрымліваць гэтую аснову ў якасці аддаленага аб’екта.
  4. Мы павінны забяспечваць бяспеку.
  5. Мы павінны прадастаўляць магчымасці адміністравання для кіравання серверам

Падзел

Першая змена, якая падзяляе запыце брокерская дзейнасць (вось над відэльцам() метад) ад уласна апрацоўкі. Мы павінны аддзяліць, але адсочваць кожны запыт у ўнікальны аб’ект.

Лістынг 7. Запыт Аб’екта

private long unique_id; // unique identification of this request
private Object input; // input reference, if any
private boolean type; // type of request true=sync false=async
private Object[] output // the output objects from the tasks
private AtomicInteger next_output; // subscript to add an element to above
private Queue[] que_names; // list of all the queues in this function
private Queue agent; // future queue, if used
private AtomicInteger nbr_remaining; // queues remaining to be processed
private int wait_time; // max wait time for sync request

Што такое поле «агент?»

Агент

Сінхронны запыт вяртае масіў аб’ектаў з апрацоўкі выклікалай боку. Што павінен рабіць рамкі з аб’ектам масіў, які вяртаецца з асінхроннага запыту? Рамкі могуць дадаткова ўвесці аб’ект масіва (у якасці ўкладу) у новую чаргу на апрацоўку агентам задач. Такім чынам задача агента можа прыняць меры на аснове стану выканання папярэдняй апрацоўкі.

Напрыклад:

Функцыя сфармаваць цэнавае прапанову і адправіць яго Карыстальніку ў якасці асінхроннага запыту.

  1. Абанент выкарыстоўвае асінхронны выклік fork() метад.
  2. Рамках відэльцы запыт у адпаведнай чарзе.
  3. Калі апошні ў чарзе заканчвае, Платформа перадае вернуты аб’ект масіва агенту задачу шляхам памяшкання запыту ў чаргу, вызначаная як «агент.»
  4. Агент заданне адсылае ліст назад нічога.

Памылка аднаўлення

Другое змяненне заключаецца ў даданні памылка аднаўлення, таўро прафесіяналізму.

Што можа пайсці няправільна? «Усе, што можа пайсці не так пойдзе не так.» Закон Мэрфі.

Назад

Мы маглі б мець разгалінаванне памылка. Абмежаваная чаргу можа быць поўным або чарзе можа быць адключаны (больш на гэтым ніжэй.) Памылка аднаўлення павінны адступіць чарзе ўсе, што раздвоены паспяхова і інфармаваць абанента праблемы. Напрыклад:

  • У нас есць тры чаргі (А, Б, в) У функцыі.
  • Чэргаў А І Б паспяхова атрымліваюць запыт.
  • З чаргі не можа атрымаць запыт, так як чаргу запоўненая.
  • Цяпер мы ідзем у зваротным кірунку, спрабуючы выцягнуць запыт з усіх чэргаў, раздвоены паспяхова, таму мы можам скараціць час апрацоўкі за няспраўнага запыты.

Выключэнне/Памылка

Мы маглі б выключэнне/памылка ў рэальнай задачы код, які выконвае гэтую працу. Калі гэта не ўдалося раз, ен, верагодна, не атрымаецца зноў. Таму, пажадана адключыць у чарзе да таго часу, пакуль забудоўшчык ліквідуе праблему. Калі мэтавай код чысты, мы не хочам разбіраць сервер. Паведамляем сервера, што мы маем новую копію кода задачы, якая з’яўляецца чыстым і мы хочам, каб чарзе ўключана.

Ларок

Мы маглі б мець вышэй адбыцца ў асінхронны запыт, званы ларок (сінхронныя запыты часу і могуць выдаляць з сістэмы.) Паколькі функцыі не можа завяршыцца да тых часоў, пакуль ва ўсіх чэргах скончыць, мы павінны паставіць у тупік просьбы ў тупік спісу. Калі чарга зноў дзелавіты, мы можам зноўку запусціць апрацоўку з спісу заглух.

Разьба цяжкім становішчы

Мы маглі б што-нітка заблакаваць назаўседы на знешні рэсурс або пяройдзе ў бясконцы цыкл. У любым выпадку, па часе падзеі ў жыцці нітка, Платформа можа распазнаць гэтую сітуацыю і можа выкрасліць нітка замяніўшы яго новай разьбы.

Пагашэння з’яўляецца прадметам сама па сабе і патрабуе герметызацыі разьбы. У дадзеным артыкуле прадстаўлены тэма:Кіраванне патокамі ў Java ГП

Адмена

Мы маглі б тэлефануе хочаце адмовіцца ад раней пададзенай заяўцы. Адмена аналагічная памылка тайм-аўту, але гэта дастасавальна як сінхронныя і асінхронныя запыты. Хоць адмена запыту з’яўляецца найбольш пажаданым, логіка для апрацоўкі адмене у шматкампанентнай запыце не для слабанервных.

Маніторынг

Тэрміны бескарысная, калі паток дэмана кантралюе таймераў шукаю фактычных або патэнцыйных праблем.

Апавяшчэнне

Ніякіх рамак не можа справіцца з любой сітуацыяй; часам ўмяшанне чалавека неабходна. Мы павінны паведаміць адміністратараў шляхам адпраўкі паведамленняў праз любыя сродкі выкарыстоўвае арганізацыя (абмену імгненнымі паведамленнямі, электроннай пошты, або любы дамарослы спосаб.)

Аддалены аб’ект

Трэцяе змяненне-гэта падтрымка рамак у якасці аддаленага аб’екта з неабавязковым ўключэнне/выключэнне для эканоміі рэсурсаў.

Аддалены выклік метаду адбываецца ў многіх варыянтах:

Асноўныя

Прыстасаваныя Фабрыкі Сокета На

iiop

Пераносны Аб’ектны Адаптар

Джыні

У Межпроцессном Узаемадзеянні

Асяроддзе можа складацца з воблака з асобнымі працэсарамі ў розных кропках зямнога шара. Афармленне рамак гнуткае лагічна.

Бяспекі

Чацвертае змена-гэта даданне функцый бяспекі.

Прыкладання java™ тэхналогія бяспекі з’яўляецца часткай ГП/мне платформы, яна патрабуе пярэдні заканчэнне сервер бяспекі заняткі для гнуткасці.

Функцыі адміністратара

Пятае змена-гэта даданне функцыі адміністратара.

Вядзенне часопіса сумны і ў асноўным бескарысна, пакуль што-то пойдзе не так.

Статыстычныя дадзеныя з’яўляюцца асновай для аналізу прадукцыйнасці і налады.

Мы павінны прадастаўляць інтэрфейсы для ўнутраных канструкцый, так што карыстальнікі могуць адсочваць і кантраляваць функцыянальнасць. Яна не моцна карысная, калі ніхто не ведае, што ен робіць. Як толькі людзі даведаюцца, што ен робіць, верагодна, яны захочуць змяніць яго.

Напісанне Відэлец-далучайцеся Framework, якая з’яўляецца простым ў выкарыстанні і эфектыўным для мясцовых званкоў складана. Робіш ж для доступу да сеткі ўяўляе сабой сур’езную задачу.

Як доўга гэта зойме, каб пабудаваць такі сервер?

Каля 5-6 секунд. Проста дастаткова доўга, каб распакаваць файл.

На шчасце, есць агульнага прызначэння, разгалінаванне-аб’яднанне структур падтрымкі вышэйпералічаныя ўласцівасці для паўсядзеннага, шмат’ядравых прыкладанняў на Java™ SE, я і Android™, даступныя сення. І з Framework, можа працаваць у якасці сервера rmi (стандарт/актывацыі, iiop і ПД) яно даступна для Java EE прыкладанняў.

Tymeac™ для Java™ ЅЕ / МЕ / АС Android™ платформы з адкрытым зыходным кодам праектаў падтрымліваецца на і вы можаце загрузіць апошнія выпускі там.

SourceForge.net

Выснова

Выкарыстоўваючы відэлец-далучайцеся рамкі, распрацаваныя для выканання складаных вылічальных абшчын не можа добра працаваць для паўсядзеннага ўжывання.

Асноўная маса прыкладанняў java™ шмат’ядравых прыкладанняў трэба раскашэліцца на працу ў яго функцыянальныя кампаненты прафесійнага класа Framework, якая простая ў выкарыстанні, эфектыўная, і з адкрытым зыходным кодам.

Спасылкі

Загрузак:

Спампаваць апошнюю SE выданне Tymeac тут. З усей дакументацыяй, скрыптоў, класаў і крыніца.

Спампаваць апошнюю ME выданне Tymeac тут. Усю дакументацыю і зыходны.

Спампаваць апошнюю AND выданне Tymeac тут. Усю дакументацыю і поўнае зацьменне праектаў.

Спампаваць апошнюю DSE выданне Tymeac тут. Па прынцыпе «падзяляй і ўладар» версіі.

Артыкулы:

Высокая прадукцыйнасць падзяляй і ўладар » версія Tymeac — java з відэльцам-далучайцеся Заваеўнік

Высокая прадукцыйнасць Android™ версіі Tymeac — Кіраванне патокамі ў Android

Праз спісы чакання для эфектыўнасці — высокая эфектыўнасць прыярытэтных чэргаў у Java ГП

У Java™ SE з разьбой кантэйнера — кіравання патокамі ў Java ГП

Іншыя:

Відэлец-далучыцца да чаргі Вікі — http://en.wikipedia.org/wiki/Fork-join_queue

Закон Мэрфі — http://en.wikipedia.org/wiki/Murphy%27s_law

Кэш працэсара Вікі — http://en.wikipedia.org/wiki/CPU_cache

Кагерэнтнасць кэш Вікі — http://en.wikipedia.org/wiki/Cache_coherence

Надзвычай паралельныя Вікі — http://en.wikipedia.org/wiki/Embarrassingly_parallel

Пра аўтара

Эдвард Harned з’яўляецца распрацоўшчыкам праграмнага забеспячэння з больш чым трыццацігадовы вопыт працы ў галіны. Ен спачатку веў праекты як супрацоўнік у буйную прамысловасць, а затым працаваў у якасці незалежнага кансультанта. Сення, Эд-старэйшы распрацоўшчык праграмнага забеспячэння ў кааператыўных сістэм, Інк., дзе, на працягу апошніх дванаццаці гадоў, ен выкарыстаў праграмавання java™, каб прынесці відэльцы-далучайцеся рашэння шырокага круга задач.

Ссылка на оригинал статьи: http://www.coopsoft.com/ar/ForkJoinArticle.html

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *