ãã®ã¡ã¢ã§ã¯äžŠè¡/䞊åããããŠConcurrentããæ§è³ªã®ããã°ã©ãã³ã°ãã¿ãŒã³ãæ±ã.
ð¡äžŠè¡èšç®ãšäžŠåèšç®ã®éã
䞊è¡ããã°ã©ãã³ã°(Concurrenct Programming)
Concurrent Programming, 䞊è¡ããã°ã©ãã³ã°.
è€æ°ã®çžäºäœçšãåãŒãèšç®ã¿ã¹ã¯ã® (åæ) 䞊è¡çå®è¡ããããªããã©ãã€ã .
Multiple progressing activities that exist at the same time Activities that can communicate and synchronize
- Communicate: information passes from one activity to another
- Synchronize: an activity waits for another to perform a specific action.
䞊è¡ããã°ã©ãã³ã°ã®ä»£è¡šçãªãã©ãã€ã ã¯ä»¥äž.
- ðå ±æã¡ã¢ãªã¢ãã«(Shared-State Concurrency)
- ðã¡ãã»ãŒãžããã·ã³ã°ã¢ãã«(Message Passing Concurrency)
- ðæ±ºå®æ§ããŒã¿ãããŒã¢ãã«(Deterministic Dataflow)
ãã®ä», 䞊åå®è¡ã®ç«¶åããããããã«ã¯, 以äžãããªãã©ãã€ã ããã.
- Lazy Deterministic Dataflow
- Constraint Programming
䞊è¡ããã°ã©ãã³ã°ãå¿ èŠãšãªãå Žåã¯,
- Distributed System: ãããã¯ãŒã¯ã§ã€ãªãã£ãè€æ°ã®ã³ã³ãã¥ãŒã¿.
- Operating System: äžã€ã®ã³ã³ãã¥ãŒã¿ã®äžã®è€æ°ã®ããã»ã¹.
- Process: è€æ°ã®ããã»ã¹ã®ãªãã®è€æ°ã®ã¹ã¬ãã.
ð䞊åããã°ã©ãã³ã°(Parallel Programming)
Parallel Computing(䞊åèšç®)ãšã¯, ã³ã³ãã¥ãŒã¿ã«ãããŠç¹å®ã®åŠçãããã€ãã®ç¬ç«ããå°ããªåŠçã«çްååããè€æ°ã®åŠçè£ çœ®ïŒããã»ããµïŒäžã§ããããã®åŠçãåæã«å®è¡ãããããš.
ãããŠãããå®è¡ããããã®ããã°ã©ãã³ã°ææ³ã䞊åããã°ã©ãã³ã°.
ãã°ãã°, ð䞊è¡ããã°ã©ãã³ã°ãšæ··åããã. 䞊åèšç®ã¯ãã«ãããã»ããµ(2ã³ã¢ä»¥äž)ãåæãšãªã. ç¬ç«ããåããã»ããµãå²ãæ¯ãããèšç®ãåæå®è¡ãã.
ð鿬¡å
ã·ãªã¢ã«å, ã·ãªã¢ã©ã€ãº.
cf. ðã·ãªã¢ã«å(çŽåå)
ðç«¶åç¶æ (Race Condition)
Race Condition. 䞊è¡ããã°ã©ãã³ã°ãšã¯ãããã©ãåé¿ããããã€ã·ã¥ãŒã§ãã, ããŸããŸãªã¢ãããŒãã詊ã¿ãŠãã.
ãããããã¯(Dead Lock)
deadlock.
2ã€ä»¥äžã®ã¹ã¬ãããããã¯ããã»ã¹ãªã©ã®åŠçåäœãäºãã®åŠççµäºãåŸ ã¡, çµæãšããŠã©ã®åŠçãå ã«é²ããªããªã£ãŠããŸãããš.
ðã¹ã¬ããããã°ã©ãã³ã°
è€æ°ã®ðã¹ã¬ãã, åã³ã¹ã¬ãããé§äœ¿ããŠäžŠè¡åŠçãè¡ãããã°ã©ãã³ã°.
ãã«ãã¹ã¬ãããã¹ã¬ããããã°ã©ãã³ã°ã®ç¥ç§°ãšããŠåŒã¶ããšãå€ã.
åäœã®æŠå¿µã§ã¯ãªã, 䞊è¡ã¢ãã«ãéåæéä¿¡ãšé¢ãã. äŒŒãæŠå¿µã¯ã¡ããŒã³ã¢.
ðJavaèšèªã§åŠã¶ãã¶ã€ã³ãã¿ãŒã³å ¥éãã«ãã¹ã¬ããç·š - çµå浩
ã¹ã¬ããã»ãŒã
Thread Safe.
è€æ°ã®ã¹ã¬ããããã©ã®ãããªé çªã§ã¢ã¯ã»ã¹ãããŠãæ£ãããµããŸãããš. åŒã³åºãåŽã«ã¢ã¯ã»ã¹é çªãèæ ®ãããã, åæåãæ±ãããããªããšã¯ããŠã¯ãªããªã.
ã°ãªãŒã³ã¹ã¬ãã
Green Thread.
OSã§ã¯ãªãJVMãã©ã³ã¿ã€ã ã«ãã£ãŠã¹ã±ãžã¥ãŒã«ãããã¹ã¬ãã.
OSã®æ©èœã«ç°åããªãèšèªç¬èªã®æ©èœãªãã, ã³ã³ããã¹ãã¹ã€ããã®ã³ã¹ããããããªã(ãšããæå³ã§ã¹ãããããšããæå³ã®ã°ãªãŒã³ã. å°é»å).
ã°ãªãŒã³ã¹ã¬ããã«å¯Ÿããå ã ã®ã¹ã¬ããããã€ãã£ãã¹ã¬ãã(Native Thread)ãšããããšããã.
- links:
- ã°ãªãŒã³ã¹ã¬ãã - Wikipedia
- ãªã Go ã§ã¯äœçŸäžãã® Goroutine ãäœããã®ã« Java ã¯æ°åã®ã¹ã¬ããããäœããªãã®ã?
- ä»®æ³ã¹ã¬ããã«ããããã€ãŠã®Javaã®ã°ãªãŒã³ã»ã¹ã¬ãããããªãã¡ãªãã¬ãŒãã£ã³ã°ã»ã·ã¹ãã ã®ã¹ã¬ãããšã¯çµã³ã€ããŠããªãJavaã¹ã¬ããããã¿ããã
軜éã¹ã¬ãã, light-weight thread, LWT, è«çã¹ã¬ãã, ä»®æ³ã¹ã¬ããâŠ
ããããã°ãªãŒã³ã¹ã¬ãããšåäžæŠå¿µãªã®ãã¯èª¿æ»äžâŠ
Worker Thread
ã¡ã€ã³ã¹ã¬ããããããã¯ãããŠå§ãŸãå¥ã®ã¹ã¬ãã.
ã¯ããŸããšçµããããã, äžã€ã®ã¿ã¹ã¯ãå®è¡ãã.
Workerãšããæ©èœã«ã€ããŠ, ã¹ã¬ããããã°ã©ãã³ã°ã§ã¯é »åºããã¯ãŒããªã®ã ã, ãã®èªæºãç±æ¥ãã©ãããæ¥ãã®ãã¯äžæãªã®ã§èª¿æ»äž.
æ £ç¿çãªåŒã³åãªã®ã ããã, ãããããåºãŠãã.
Future, ããã¯ã°ã©ãŠã³ãåŠçãšåŒã°ããããšãå€ã. ããã¯ã°ã©ãŠã³ãã®åŠçã¯ããã»ã¹ã§ãå¯èœ.
ã¹ããªãŒã ããã»ãã·ã³ã°
Stream Processing
䞊ååŠçãå®çŸããããã°ã©ãã³ã°ææ³ã®äžã€.
ðã¹ããªãŒã /Streams
ãªã¹ãã®çµç«¯ã ðUnbound Value ã§ãããã®.
S = a|b|c|d|S2
Streams 㯠2 ã€ã® Thread éã®éä¿¡ãã£ãã«ãšããŠå©çšã§ãã.
ãã¹ãŠã® List 颿°ã¯ Agent ã«ãªããã,ãã¹ãŠã®é¢æ°åèšèªã®ãã¯ããã¯ã¯æ±ºå®æ§ããŒã¿ãããŒã«å¿çšã§ãã.
InputStreamãšOutputStreamã®2ã€ã®Streamã®ãæãããã®ãduplex stream(åæ¹åã¹ããªãŒã )ãšãã.
- a list with unbound values.
- list read by one agent and created y anothor agent.
ð€ãšãŒãžã§ã³ã(Agents)
ã¹ã¬ããã®ãªãã§ Stream ãèªã¿æžãããã«ãŒã.
- a list of function running in a thread.
- tail recursive function executing in its own thread.
ð§Transducer
ãã©ã³ã¹ãã¥ãŒãµ, Transducer, 倿åšãšã.
ã¹ããªãŒã ã®å€ã倿ãããããªãšãŒãžã§ã³ã.
ðProducer-Consumerãã¿ãŒã³
䞊è¡ããã°ã©ãã³ã°ãã©ãã€ã (ãã«ãã¹ã¬ãã)ã®é »åºãã¿ãŒã³.
- Producer(çç£è ): ã¹ããªãŒã ã®ããŒã¿ãçæããã¹ã¬ãã.
- Consumer(æ¶è²»è ): ã¹ããªãŒã ã®ããŒã¿ãåãåã£ãŠã¢ã¯ã·ã§ã³ãèµ·ããã¹ã¬ãã.
çç£è ãšæ¶è²»è ã®æ©æž¡ã圹ãã€ãã£ãŠåŠçé床ã®ãºã¬ãåãããã¿ãŒã³.
å ±æã¡ã¢ãªã¢ãã«ã§æä»å¶åŸ¡ãããå Žå, blockingqueueãå©çšããŠïŒã€ã®ã¹ã¬ããã§read/writeãããããªå®è£ ãšãªã.
çç£è ãšæ¶è²»è ã1察1ã®å Žå㯠Pipe ãã¿ãŒã³ ãšããããšããã(ðPipelineãã¿ãŒã³).
ãããå®è£ ã®å匷ãçµæ§ããã, ãã®åŸãRubyãPythonã§ã¹ã¬ããåŠçãå®è£ ãããªãã°ããã§ãŠããçéãã¿ãŒã³ãã€æãåºæ·±ããããã¯.
- ããŒã¿ãããŒå€æ° (Oz) ã§å®çŸãã Producer-Consumer Pattern | Futurismo
- Java ã§ Producer-Consumer Pattern ãå®è£ ããŠã¿ã | Futurismo
- å ±æã¡ã¢ãªã§ã®æä»å¶åŸ¡ã¯Producer-consumer pattern
æŽå²çã«ã¯ãã€ã¯ã¹ãã©ãåé¡å®çŸ©ãããããã.
ðPipelineãã¿ãŒã³
ðProducer-Consumerãã¿ãŒã³ã®æŽŸç. Pipeãã¿ãŒã³. Unixã®pipeãæå.
ProducerãšConsumerã®éã«ã¯æ å ±ã倿ããããã®ç¬¬äžã®ã¹ããªãŒã ãªããžã§ã¯ãã眮ãããšãåºæ¥ã. ãã®å€æããã¹ããªãŒã ãTransducerãšãã.
ãããŠ, Producer-Transducer-Transducer-⊠-Consumerã®äžé£ã®é£çµãPipelineãšãã. Pipelineã®æ å ±ãã€ã³ãããããå£ãsink, ã¢ãŠããããããå£ãsourceãšãã. (ðCTMCP, 4.3.2ãã).
- Sink: æ å ±ãå ¥ãã.
- Source: æ å ±ãçã¿åºã.
- transducer(倿åš/transformer)
- Producer ãš Consumer ãšã®éã仲ä»ãã
- Pipeline
- Producer ãš Consumer ãš Transformer ã®éã仲ä»ãã.
- Pipeline (software) - Wikipedia, the free encyclopedia
- ãã€ãã©ã€ã³åŠç - Wikipedia
åäžæ ŒçŽå€æ° (single-assined value) ã®æ§è³ª (äžåºŠããä»£å ¥ã§ããªã)ãåæã®ã¹ã¬ããééä¿¡ã®ããã®ææ®µã«ãã.
ðPublisher-Subscriberãã¿ãŒã³
éåæã¡ãã»ãŒãžã³ã°ãã©ãã€ã . Pub/Subãã¿ãŒã³ãšã.
éä¿¡åŽãšåä¿¡åŽãçµåããã«, ã¢ããªã±ãŒã·ã§ã³ããé¢å¿ãæã£ãŠããè€æ°ã®ã³ã³ã·ã¥ãŒããŒã«å¯ŸããŠéåæçã«ã€ãã³ããéç¥ã§ããããã«ãã.
- åºçè
(Publischer): æ
å ±ã®éä¿¡ã¿ã¹ã¯
- å ¥åãã£ãã«: åºçè ãå ¥åãããã£ãã«
- ã¡ãã»ãŒãžãããŒã«ãŒ:
- å ¥å/åºåãã£ãã«ãã€ãªã.
- ã¡ãã»ãŒãžãé¢å¿ããã賌èªè
ã®ããã«ã³ããŒãã.
- ãã® ã³ã㌠ãšããéšåãproducer-consumerãšã®éã.
- æ å ±åæäžžå²ããšåãåç.
- Event Busãšããã.
- 賌èªè
(Subscriber):
- æ å ±ã®åä¿¡ã¿ã¹ã¯.
- ã³ã³ã·ã¥ãŒããšããã.
- åºåãã£ãã«: 賌èªè ãåãåããã£ãã«.
åºçåŽãšè³ŒèªåŽã®çµå床ãäœããã, ã¹ã±ãŒã©ããªãã£ããã, åçãªãããã¯ãŒã¯æ§æã«å¯Ÿå¿å¯èœ.
- links
ð¡ãããã¯ã«ã€ããŠ
éèŠæŠå¿µã®ãããã¯ã«ã€ããŠ.
ã¡ãã»ãŒãžã«ã¯Topicãšããã©ãã«ãã€ããŠéçšããããšãå€ã(topic-based). ããã¯ãã£ãã«ã«å¯Ÿããè«çãã£ãã«ãšã¿ãããšãã§ãã. ãã£ãã«ã®ãµããã£ãã«.
Pub/Subã¡ãã»ãŒãžã³ã°ã¢ãã«ã®ããŒãžã®æš¡åŒå³ããããããã. ã¡ãã»ãŒãžãããŒã«ãŒã®ã³ã³ããŒãã³ãã®ãªãã«ãããã¯ããšã«ã¡ãã»ãŒãžãæ¯ãåããããŠããŠ, ããããããã«é¢å¿ããã賌èªè ã«ã¡ãã»ãŒãžãå±ã.
åºç瀟ãšéèªã®é¢ä¿ã§æããŠããããããããªã.
- publisher:
- å°Ÿç°æ äžé
- åŸå³ åŒäžæŽ
- ãããŒã«ãŒ: éè±ç€Ÿ
- Topic: ãžã£ã³ã
- Topic: ãã¬ã€ããŒã€
- subscriber:
- ãã£ãã
- 倧åŠç
topic-based ãšã¯å¥ã«content-baseãšãããã®ããã, ããŒã¿ã®äžèº«ãã¿ãŠè³Œèªè ã§å Žååããããã®ããã.
ð¡Pub/Subãã¿ãŒã³ãšProd/Consãã¿ãŒã³ã®éã
ã©ã¡ããã¹ã¬ããå士ãã¡ãã»ãŒãžãããåããããšããç¹ã§åãã§ãã䌌ãŠãã. ãããå¥ã®æŠå¿µ. åºå¥ã§ããã°èšæ¶ã«å®çããã¯ã.
- Publish/Subscribe
- å
šãŠã®è³Œèªè
ã¯åºç瀟ããåãã¡ãã»ãŒãžãåãåã.
- cf. æ°èã®è³Œèªè ã¯çããåãæ å ±ãåãåã.
- å
šãŠã®è³Œèªè
ã¯åºç瀟ããåãã¡ãã»ãŒãžãåãåã.
- Producer/Consumer
- ããçç£è ã®ã¡ãã»ãŒãžã¯ããæ¶è²»è ãåãåã. çç£è ã«å¯ŸããŠæ¶è²»ããæ åœã決ãŸã£ãŠãã.
producer/consumerãã¿ãŒã³ã§ã¯ããŒã¿ãmessageãšããããšãå€ãã®ã«å¯ŸããŠ, Publish/Subscribeãã¿ãŒã³ã§ã¯topicãšããããšãå€ãæ°ããã.
ð¡ãœãŒã¹é»æµãšã·ã³ã¯é»æµ
source, sink. èšç®æ©ç§åŠã®å°éçšèªãšããããã§ã¯ãªã, 埪ç°ã瀺ãç©çãé»åå·¥åŠã§ã䜿ãããŠããããã .
sinkã®æå³ã¯æ²ãã§ãã, å°æã®æµãå°, ãªã«ããæºãŸã£ãŠãããšãã. ããããåžã蟌ã¿é»æµ(ã·ã³ã¯é»æµ).
sourceã®æå³ã¯æºã§ãã, ãªã«ããåºãŠãããšãã, ããããåãåºã黿µ(ãœãŒã¹é»æµ).
ð¡äžŠè¡åŠçãšã¯ã¿ã¹ã¯ã®ã€ã³ã¿ãŒãªãŒããªé 眮
interleaveãšããåèªããã. ããã¯ããŒã¿ãäžé£ç¶ãªåœ¢ã§é 眮ããŠæ§èœåäžãããããš.
ã€ã³ã¿ãŒãªãŒã - Wikipedia
䞊è¡åŠçãšã¯ãã®ã€ã¡ãŒãžã«è¿ãã®ãããããªã. ããŸã䞊è¡ããã°ã©ãã³ã°ã®æ çµã¿ã§ã¯ã€ããããªãã®ã§, åèªã®èªæããã®æšæž¬ã«éããªãã.
ðãœãããŠã§ã¢ãã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãª(STM)
Software transactinal memory, ããããSTM(衚èšãé·ããããªããâŠ).
3ã€ã®éèŠãªç¹æ§ããã.
- Atomic
- è€æ°ã®ã¡ã¢ãªãæŽæ°ããŠãå€éšããã¯ã²ãšã€ã®ã€ãã³ãã§èŠ³æž¬ããã.
- Consistent
- æŽæ°ã¯äžè²«ããŠãã.
- æŽæ°åŸã®validationã倱æããã°å šãŠã®æŽæ°åŠçã¯å€±æãã.
- Isolated
- ãããã©ã³ã¶ã¯ã·ã§ã³ããå¥ã®ãã©ã³ã¶ã¯ã·ã§ã³ãã¿ãããšã¯ã§ããªã.
- Clojureã§æ¡çšãããŠããããšã§äžèºæå. Clojure: ref
- ðACID
- ãœãããŠã§ã¢ãã©ã³ã¶ã¯ã·ã§ãã«ã¡ã¢ãª - Wikipedia
ð¡äžŠè¡èšç®ãšäžŠåèšç®ã®éã
ããã«ã€ããŠ, 芳ç¹ã«ãã£ãŠèšèã®äœ¿ãæ¹ãéãããã«æã, éãæ·±ãâŠ
倧äºãªããšã¯è°è«ããããªãã°åæãšããŠãäºãã®èªèãåæããŠãã®å ã®è°è«ãããããšãã. ããããå ã®è°è«ããããã¯ãã§, ãã®å Žã§çžæãšäžŠè¡äžŠåã®å®çŸ©ã®è°è«ãããäºå®ã§ã¯ãªãã£ãã¯ããªã®ã§å§å©ããã«åæããšããã°ãã.
Wikipediaã§ãããšããã®å®çŸ©ã¯ããŒããŠã§ã¢(èšç®æ©)ã®èŠç¹ã§ããã, ç§ãé¢å¿ãããã®ã¯ãœãããŠã§ã¢ã®èŠç¹ã ã£ãããã.
cf. ð¡äžŠè¡ãšéåæã®éã
䞊è¡èšç®ãšäžŠåèšç®ã®éãã¯ïŒ
䞊è¡ïŒConcurrentïŒã¯ãè€æ°ã®åäœã, è«ççã«, é äžåãããã¯åæã«èµ·ãããããããš. ãã1ã€ã®æç¹ã§ã¯1ã€ã®ä»äºããããŠããªãã, è€æ°ã®ä»äºéãåãæ¿ããããšã«ãã£ãŠåæã«ãã£ãŠããããã«èŠããããš.
䞊åïŒParallelïŒã¯ãè€æ°ã®åäœã, ç©ççã«, åæã«èµ·ããããšã.
䞊è¡ã¯äžã€ã®CPUãããã»ã¹ãåãæ¿ããªããåŠçãè¡ã. 䞊åã¯è€æ°ã®CPUãè€æ°ã®ããã»ã¹ãåæã«è¡ã.
ååã䌌ãŠããã®ã§ãšãŠãå¿ããããâŠ
䞊è¡ã®ãµãæŠå¿µã䞊å
以äžãèªåãªãã«è§£éããŠèŠçŽ.
- åãã¡ã®ã䞊è¡ãã®çè§£ã¯ééã£ãŠã
- ããšãã°ãªãã§èŠãèªåŒµã®å°ãªãã䞊è¡ããšã䞊åã
䞊è¡ã¯Concurrent, ãšãã«(con)èµ°ã(cur). åæã«ãšããæå³ã§ãã, ãã以äžã®æå³ã¯ãªã.
ãããããš, ãããã䞊åã§ãããšããã®ãè€æ°ã®åŠçè£ çœ®ïŒããã»ããµïŒäžã§ããããã®åŠçã åæã« å®è¡ãããããšã§ããããšããã®ã¯, Concurretãšããæ§è³ªãå«ãã§ãã.
ãããš, 䞊åãšããæŠå¿µã¯äžŠè¡ã®ãµãæŠå¿µãšãªã.
ãããã§ããèŠããã説æ, 䞊è¡ããã«ãã³ã¢, 䞊åããã«ãã¹ã¬ãããšãããã®ã, ãã®å®çŸ©ããèãããšééã£ãŠãã. 䞊åãã·ã³ã°ã«ã³ã¢ã§åããããšãã§ããã, ããã ãšãªãŒããŒããããå¢ããã ãã§æ§èœæªåããã ããªã®ã§, 䞊åã¯è€æ°ã³ã¢ã§ã®åäœãåæã«ããŠãã.
䞊è¡ã¯ç¬ç«ããŠå®è¡ã§ãã/䞊åã¯åæã«å®è¡ããããš
è±èªã®æžç±ãšãããã°ãã¿ããš, Concurrent ProgrammingãšããèŠåºããã€ããŠãããã®, å®éã¯ã¹ã¬ããããã¬ãã®è©±ãå±éãããŠãããã®ãå€ã, ããã®ç¹ãããããããŠãã.
when people hear the word concurrency they often think of parallelism
ãã®ç¹ã«ã€ãConcurrentã¯Parallelismãšã¯éããšãã話é¡ãGoã®èŠç¹ããã¿ã.
- 䞊è¡åŠçãšäžŠååŠçïœGoã§ã®äžŠè¡åŠçã培åºè§£åïŒ
- Concurrency is not parallelism - The Go Programming Language
Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once..
- æé軞
- ããç¯å²ã«ãããŠè€æ°ã®ã¿ã¹ã¯ãæ±ã
- ããç¹ã«ãããŠè€æ°ã®ã¿ã¹ã¯ãæ±ã
- æ§æ vs å®è¡
- 䞊è¡ã¯ç¬ç«ã«å®è¡åºæ¥ãæ§æ
- 䞊åã¯åæã«å®è¡ããããš
- ãœãããŠã§ã¢ vs ããŒããŠã§ã¢
- 䞊è¡ã¯Race Conditionã®è§£æ±ºã®ããã®ããã°ã©ãã³ã°ãã¿ãŒã³
- 䞊åã¯äžŠè¡åŠçãå¯èœã«ããããŒããŠã§ã¢ã®ç¹æ§.
- äžŠè¡æ§ã¯ã³ãŒãã®æ§è³ª vs 䞊åã¯åäœããŠããããã°ã©ã ã®æ§è³ª
ðJavaèšèªã§åŠã¶ãã¶ã€ã³ãã¿ãŒã³å ¥éãã«ãã¹ã¬ããç·š - çµå浩
ãã«ãã¹ã¬ããã«ãããðšãã¶ã€ã³ãã¿ãŒã³. ðšçµå浩
- ãå¢è£æ¹èšç Java èšèªã§åŠã¶ãã¶ã€ã³ãã¿ãŒã³å ¥éãã«ãã¹ã¬ããç·šã
- ruby ã§ãã£ãŠã¿ã. ãå¢è£æ¹èšç Java èšèªã§åŠã¶ãã¶ã€ã³ãã¿ãŒã³å ¥éãã«ãã¹ã¬ããç·šããŸãšã - ãããã°ã§!
Single Threaded Execution - ãã®æ©ãæž¡ããã®ã¯, ãã£ãäžäºº
Immutable - å£ããããšã, å£ããªã
Guarded suspension
åææ¡ä»¶ãæºãããããŸã§åŸ æ©ããããã®æ©æ§. çšæã§ãããŸã§, åŸ ã£ãŠãŠã.
æºããããªããã°ãªããªãæ¡ä»¶ã ã¬ãŒãæ¡ä»¶ ãšãã.
- Guarded suspension - Wikipedia
- ãJavaèšèªã§åŠã¶ãã¶ã€ã³ãã¿ãŒã³(ãã«ãã¹ã¬ããç·š)ããŸãšã(ãã®ïŒ) - Qiita
cf.
Balking - å¿ èŠãªãã£ãã, ããã¡ããã
åææ¡ä»¶ãæºããããŠããªãå Žåã¯, (ãã®æç¹ã§ã®) åŠçã®å®è¡ãããããã.
Producer-Consumer
ã¹ã¬ããéã§åŠçã®åŸ ã¡åãããè¡ããªããåŠçãå®è¡ã§ãã.
ãçç£è ã (producer) ã¹ã¬ãã矀ãããŒã¿ãçæããŠãéä¿¡è·¯ãã«è¿œå ã, ãæ¶è²»è ã (consumer) ã¹ã¬ãã矀ããã®ããŒã¿ããéä¿¡è·¯ãããåãåºããŠåŠçãããšããæ§é .
å¿ èŠãªåæã¯ãã¹ãŠãéä¿¡è·¯ãã«ãã£ãŠè¡ãªããããã, çç£è ãšæ¶è²»è ã®ã«ãŒãã³ã¯åæãæèããã«å®è£ ã§ãã. ãã®éä¿¡è·¯ã¯åæãã¥ãŒãªã©ã§å®çŸããã (äžéšã®èšèªã¯ãããæšæºã©ã€ãã©ãªã§æäŸããŠãã).
Producer ãš Consumer ã®åŠçã¹ããŒããéããšã¹ã«ãŒããããèœã¡ã. ããã§äžç¶å°ç¹ãšããŠãã¥ãŒããã, ããã«ããŒã¿ãä¿æãã, åŠçã¹ããŒãã®éããåžåããã
Java ã§ã¯ wait, notifyAll ã䜿ã.
- Java ã§ Producer-Consumer ãã¿ãŒã³ãå®è·µ! - omiya6048âs blog
- Producer â consumer problem - Wikipedia, the free encyclopedia
- Publisher-Subscriber - Strategic Choice
POSA ã®èª²é¡ã§ã¯, BlockingQueue ãå©çšãã.
- BlockingQueue (Java Platform SE 6)
- Java ã§ Producer-Consumer ãã¿ãŒã³ãå®è·µ! - omiya6048âs blog
Ruby ã®äŸããã. Ruby ã§ã¯ ConditionVariable ã® wait, broadcast ãå©çš.
more. ðProducer-Consumerãã¿ãŒã³
Read-Write Lock - ã¿ããªã§èªãã®ã¯ããããã©, èªãã§ãéã¯æžãã¡ãã ã
æžã蟌ã¿ã¯æä»ã¢ã¯ã»ã¹ãå¿ èŠã ãèªã¿èŸŒã¿ã¯äžŠè¡ã«è¡ããããã«ãããå Žåã®ããã®ããã¯æ©æ§.
æä»å¶åŸ¡ãå¿ èŠãªå ±æãªãœãŒã¹ã®ããã«å°å ¥ãã.
Thread-Per-Message - ãã®ä»äº, ãã£ãšããŠã
Worker Thread - ä»äºãæ¥ããŸã§åŸ ã¡, ä»äºãæ¥ããåã
Future - åŒæåžã, ãå ã«ã©ãã
ãåŠçãå®äºããŠãããã©ããåãããªãåŠççµæãã衚ããªããžã§ã¯ããäœæããããšã§åæãå®çŸãã. åŠçãå®äºããŠããªããã¡ã«çµæãååŸããããšããå Žåã¯åŠçãå®äºãããŸã§ããã¯ããã.
Two-Phase Termination - åŸçä»ãããŠãã, ãããã¿ãªãã
Thread-Specific Storage - ã¹ã¬ããããšã®ã³ã€ã³ããã«ãŒ
Active Object - éåæã¡ãã»ãŒãžãåãåã, èœåçãªãªããžã§ã¯ã
Lock
ãªãœãŒã¹ã«å¯Ÿã㊠1 ã€ã®ã¹ã¬ããããããã¯ãããããŠ, ãã®ããã ä»ã®ã¹ã¬ããããã®ãªãœãŒã¹ã«ã¢ã¯ã»ã¹ããã倿Žãå ãããã§ããªãããã«ãã.
Scheduler
ã·ã³ã°ã«ã¹ã¬ããã§å®è¡ãããåŠç (äŸãã°ãã¡ã€ã«ãžã®æžã蟌ã¿) ã®å®è¡ãåã¹ã¬ããã«èš±å¯ããã¿ã€ãã³ã°ãæç¢ºã«å¶åŸ¡ãã.
Thread pool
倿°ã®ã¹ã¬ãããäœæããŠãããã«å€æ°ã®ã¿ã¹ã¯ãåŠçããã. å žåçãªç¶æ³ã§ã¯ã¹ã¬ããæ°ãããããªãå€ãã®ã¿ã¹ã¯ãååšã, åã¹ã¬ããã¯, ããã¿ã¹ã¯ã®åŠçãçµãããšæ¬¡ã®åŠçåŸ ã¡ã¿ã¹ã¯ã®å®è¡ã«åãããã.
äžè¬ã«, Producer-consumer ãã¿ãŒã³ã䜿ã£ãŠå®çŸããã.
Two-phase termination
ã¹ã¬ãããå®å šã«çµäºãããæ¹æ³. ã¹ã¬ããã¯, çµäºèŠæ±ã衚ããã©ã°ã宿çã«ç¢ºèªããŠ, ãããã»ããããããçµäºåŠçãè¡ã.
䞊è¡ããã°ã©ãã³ã°Topics
ðConcurrent systems separate what happens from when it happens
以äžãã. ããããã£ãšäžè¬çãªåèšãªã®ãã¯äžæã ã, ãããã«ãã®ãšãããšæã£ã.
ref. https://github.com/clj-commons/manifold/blob/master/doc/execution.md
ð¡CPUããŠã³ããIOããŠã³ãã
䞊ååŠçããããšãã®ããçŸããTopics.
- CPUããŠã³ã
- æ©æ¢°åŠç¿
- ãããåŠç
- IOããŠã³ã
- éä¿¡åŠç
- å€éšAPI
- ãã¡ã€ã«åŠç
Concurrent Insights
ð¡ã¹ããªãŒã ãšãšãŒãžã§ã³ãã®é¢ä¿ã¯ããŒã¿ãšæäœã®æœè±¡
Streamã¯, a list with unbound values.
Agentã¯, a list of function running in a thread.
é¢çœãã®ã¯, ã¹ããªãŒã ã¯ããŒã¿, ãšãŒãžã§ã³ãã¯æäœã®æœè±¡ããããš.
S1=1|2|3.. S2=1|4|9..
Producer ----------> Transformer --------> Consuemer
S1={Prod 1} S2={Trans S1} {Disp S2}䞊è¡ãšå¹³è¡ãééãããã
ååã䌌ãŠããã®ã§æ³šæããããš. ç§ã¯10幎ãããééã£ã挢åã䜿ã£ãŠããŠè¡æãåãããTwitterã§æ€çŽ¢ããŠãåããããªééããããŠãã人ã¯ããã.
- å¹³è¡: äºã€ã®çŽç·ã亀ãããªã.
- 䞊è¡: ãªããã§é²ã, åæã«è¡ã.
å¹³è¡ã¯æ°åŠã®ã³ã³ããã¹ãã§ããã€ãã. 䞊è¡ã¯èšç®æ©ç§åŠã®ã³ã³ããã¹ãã§ããã€ãã.
ããã«çŽããããã®ã¯å¹³è¡ã®äžè¬çãªè±èš³ã¯parallelã§ããã, ããã°ã©ãã³ã°ã®äžçã«ãããŠparallelãšã¯äžŠåãæã. ãªãã ãã.
äžŠè¡æ§ã®è°è«ã«ã¯ã·ãŒã±ã³ã¹å³ã圹ã«ç«ã€
äžŠè¡æ§ã«ã€ããŠé ã®äžã§èãããè°è«ãããšãã¯UMLã®ã·ãŒã±ã³ã¹å³ã圹ã«ç«ã€.
ã·ãŒã±ã³ã¹å³ã®æ£ããæžãæ¹ãšãã¯ã©ãã§ãããã, ãã³ãçµµçãªèããããŒã«ãšããŠåœ¹ã«ç«ã€.
References
ãããããã. å ±æã¡ã¢ãªæ¹åŒã®ããã¯åŸ ã¡ãã©ãå æããã.
- Concurrency Glossary
- ããŒã¿å ±æã®æ°æœ®æµ - ã¢ã¯ã¿ãŒ, Agent, STM | ããã°ã©ããŒãºéèšåž³
Books
ðã¢ãŒããã¯ãã£ãã¿ãŒã³(POSA)ã®ããŒãžãåç §ã®ããš.
POSA2: Pattern-Oriented Software Architecture: Patterns for Concurrent and Networked Objects
çµåå çã®ãã«ãã¹ã¬ããã«é¢ããæ¬. å 容㯠POSA2 ã®ç䌌.
ðJavaèšèªã§åŠã¶ãã¶ã€ã³ãã¿ãŒã³å ¥éãã«ãã¹ã¬ããç·š - çµå浩