社内の新年会で話した資料です。 このプレゼンテーションは - カーネルスレッドとグリーンスレッドの違い - JVMのスレッド - Actorモデル - Goroutine の内容を含みます。
This presentation includes these topics below: - Difference between kernel thread and green thread - JMV Thread - Actor Model - Goroutine
ฒߦ࢛ํࢁ04ʙHPSPVUJOFʙ"DUPS౻थ
View Slide
·ͣ͡ΊʹΞηϯϒϦݴޠͱ͔$ݴޠͱ͔ग़͖ͯ·ͤΜฒߦॲཧػߏͷ෦࣮ΑΓΈʹϑΥʔΧε͠·͢
͢͜ͱwεϨου͕̍छྨ͡Όͳ͍͜ͱw֤ฒߦॲཧϞδϡʔϧͷΈw+7.ͷεϨουwHPSPVUJOFw"LLB"DUPS˞͕ࣗؾʹͳͬͨ͜ͱΛத৺ʹ͍͖ͯ͠·͢ۀʹཱ͔ͭෆ໌͕ͩɺϚϧνίΞͷ࣌ͳͷͰฒߦॲཧ͔Βආ͚ΒΕͳ͍
ΞδΣϯμ0QFSBUJOH4ZTUFN1SPHSBNNJOH-BOHVBHFߴ
0QFSBUJOH4ZTUFNw ϓϩηεw εϨου
ϓϩηεϓϩάϥϜΛىಈͨ͠ͱ͖ʹͰ͖Δw ΞυϨεۭؒw ؔ࿈ͷ͋Δͯ͢ͷঢ়ଶ ϨδελͳͲw ֤छͷใ ϓϩηε*%ͳͲw ϓϩηεؒ௨৴ʹΘΕΔɺͦͷଞͷϦιʔε ϝοηʔδΩϡʔͳͲϓϩηε
εϨου$16ίΞ͕࣮ߦ͢Δॲཧͷ୯ҐελοΫϨδελͱ͍ͬͨɺ࠷খݶͷϦιʔεΛ࣋ͭɾελοΫྖҬɾελοΫϙΠϯλɾϓϩάϥϜΧϯλ
ϓϩηεͱεϨου˞Ϛϧνϓϩηεͷ͠·ͤΜγϯάϧεϨου ϚϧνεϨουϓϩηεʹ̍ͭҎ্ͷεϨου͕ଘࡏ͢ΔϓϩηεͷεϨουಉ͡ϝϞϦΛڞ༗
ϚϧνεϨουϞσϧCPUҰͭͷCPUίΞʹରͯ͠εϨου͕ෳ͋Δ߹ɺεϨουΛΓସ͑ͳ͕ΒෳͷλεΫΛ࣮ߦ͢Δ͜ͱεϨου1εϨου2࣌ؒ
ϚϧνεϨουϞσϧʹ͓͍ͯॏཁͳ͜ͱίϯςΩετεΠονεϨουͷੜίετϝϞϦ༻ྔεϨουͷΓସ͑ʢίϯςΩετεΠονʣΛ͍͔ʹ࣌ؒͰͰ͖Δ͔ҰͭͷεϨουͷϝϞϦ༻ྔ͕খ͚͞Εɺͨ͘͞ΜͷεϨουΛੜͰ͖Δ
ίϯςΩετεΠονεϨουΛΓସ͑Δ࣌ɺ࣍ʹಈ࡞͖͢εϨουͷબʢεέδϡʔϦϯάʣͱબ͞ΕͨεϨουͷ࠶։ʢσΟεύονʣ͕ߦΘΕΔεϨουεέδϡʔϥʔεϨου εϨουϝϞϦͷίϐʔΛߦͬͨΓ͢ΔͷͰɺΦʔόʔϔου͕͔͔Δ
ੜίετϝϞϦ༻ྔϝϞϦ༻ྔελοΫͷαΠζͳͲʹґଘ͢ΔϝϞϦྖҬΛ֬อ͢ΔͷͰɺੜʹΦʔόʔϔου͕͔͔Δ
ϚϧνεϨουͷྨεϨουͷछྨ ࣮ߦํࣜɾϢʔβʔεϨουɾΧʔωϧεϨουɾ/ɾɾ./
ఆڥϢɹβɹΧɹωϧۭۭؒؒʔ ʔʔ$16 $16ΞϓϦέʔγϣϯϓϩηε04ϋʔυΣΞҰͭͷΞϓϦέʔγϣϯϓϩηε͕ϚϧνεϨουͰಈ͘
εϨουͷछྨwΧʔωϧεϨουwϢʔβʔεϨου
ΧʔωϧεϨουΧʔωϧεέδϡʔϥʔ$16 $16Χɹωϧ04͕ఏڙ͢ΔεϨουۭؒʔ04ͷΧʔωϧͷεέδϡʔϥʔʹཧ͞ΕΔ
ΧʔωϧεϨουΧʔωϧεέδϡʔϥʔ$16 $16ͭͷ$16ίΞৗʹҰͭͷΧʔωϧεϨου͔࣮͠ߦͰ͖ͳ͍ͭͷ$16ίΞʹෳͷΧʔωϧεϨου͕͋Δ߹ɺ04͕ΧʔωϧεϨουΛΓସ͑ͳ͕ΒॲཧΛ࣮ߦ͢Δ
ϢʔβʔεϨουάϦʔϯεϨουͱ͍͏ϢɹβɹΧɹωϧۭۭؒؒʔ ʔʔϢʔβʔεέδϡʔϥʔϥϯλΠϜʢݴޠʣ͕ఏڙ͢ΔεϨουΞϓϦέʔγϣϯϓϩηεϥϯλΠϜͷεέδϡʔϥʔʹཧ͞ΕΔ
ϢʔβʔεϨου͋͘·ͰॲཧΛ࣮ߦ͢ΔͷΧʔωϧεϨουϢʔβʔεέδϡʔϥʔ͕ΧʔωϧεϨουʹରͯ͠ϢʔβʔεϨουΛׂΓͯΔϢʔβʔεέδϡʔϥʔΞϓϦέʔγϣϯϓϩηεͭͷΧʔωϧεϨουʹෳͷϢʔβʔεϨου͕͋Δ߹ɺΞϓϦέʔγϣϯଆ͕ϢʔβʔεϨουΛΓସ͑ͳ͕ΒॲཧΛ࣮ߦ͢Δ
ϢʔβʔεϨουϢʔβʔεϨουΛ࣮͍ͯ͠Δݴޠw3VCZw)BTLFMMw(PMBOH ޙड़FUD
ίϯςΩετεΠονൺֱΧʔωϧεϨουϢʔβʔεϨουϢʔβʔۭؒͷσʔλΛΧʔωϧۭؒʹίϐʔ͢ΔͷͰɺΦʔόʔϔου͕େ͖͍ϢʔβʔۭؒͰ݁͢ΔͨΊɺΦʔόʔϔου͕খ͍͞γεςϜίʔϧΧʔωϧεέδϡʔϥʔϢʔβʔεέδϡʔϥʔ
ੜίετϝϞϦ༻ྔΧʔωϧεϨουϢʔβʔεϨου࣮ߦڥ 04ʹґଘ͢ΔϥϯλΠϜʢϓϩάϥϛϯάݴޠʣʹґଘ͢ΔجຊతʹΧʔωϧεϨουΑΓੜলίετͰϝϞϦখ͍͞
εϨουͷൺֱΧʔωϧεϨου ϢʔβʔεϨουίϯςΩετεΠον ͍ ͍αΠζ04ʹґଘ͢Δʢେ͖͍ϥϯλΠϜʹґଘ͢Δখ͍͞
࣮ߦํࣜw/ํࣜʢ/ݸͷϢʔβʔεϨουɿݸͷΧʔωϧεϨουʣwํࣜʢ̍ݸͷ࣮ߦεϨουɿ̍ݸͷΧʔωϧεϨουʣw./ํࣜʢ.ݸͷϢʔβʔεϨουɿ/ݸͷΧʔωϧεϨουʣϚϧνεϨουػߏΛ࣮ݱ͢ΔʹҎԼͷ͍ͣΕ͔ͷ࣮ߦํࣜΛͱΔ
/ํࣜΧʔωϧεέδϡʔϥʔ$16 $16ϢɹβɹΧɹωϧۭۭؒؒʔ ʔʔϢʔβʔεέδϡʔϥʔ/ݸͷϢʔβʔεϨουɿݸͷΧʔωϧεϨουΞϓϦέʔγϣϯϓϩηεΞϓϦέʔγϣϯϓϩηε্ͷ̍ͭҎ্ͷϢʔβʔεϨου͕ɺ̍ͭͷΧʔωϧεϨουΛ͏ ෳෆՄ̍ϓϩηεʹ̍ΧʔωϧεϨουͷΈ
/ํࣜϝϦοτσϝϦοτҰͭͷΧʔωϧεϨου͔͑͠ͳ͍ͨΊɺϚϧνίΞΛ׆͔ͤͳ͍ʢฒߦʣίϯςΩετεΠον͕͍Χʔωϧεέδϡʔϥʔ$16 $16ϢʔβʔεέδϡʔϥʔΞϓϦέʔγϣϯϓϩηε
ํࣜΧʔωϧεέδϡʔϥʔ$16 $16ϢɹβɹΧɹωϧۭؒʔ ʔʔۭؒ̍ݸͷ࣮ߦεϨουɿ̍ݸͷΧʔωϧεϨουΞϓϦέʔγϣϯϓϩηεׂΓͯΒΕͨΧʔωϧεϨουͰॲཧΛ࣮ߦ͢ΔΞϓϦέʔγϣϯϓϩηεɺ$16ίΞͷ͚ͩΧʔωϧεϨουΛಉ࣌ʹ͑Δʢฒߦ͔ͭฒྻ͕ՄೳΞϓϦέʔγϣϯϓϩηε̍ϓϩηεʹෳΧʔωϧεϨου͕Մೳ
ํࣜϝϦοτσϝϦοτϚϧνίΞΛ׆͔ͤΔγεςϜίʔϧΛ͏ͨΊɺίϯςΩετεΠον͕͍Χʔωϧεέδϡʔϥʔ$16 $16ΞϓϦέʔγϣϯϓϩηε
./ํࣜΧʔωϧεέδϡʔϥʔ$16 $16ϢʔβʔεέδϡʔϥʔϢɹβɹΧɹωϧۭۭؒؒʔ ʔʔ.ݸͷϢʔβʔεϨουɿ/ݸͷΧʔωϧεϨουΞϓϦέʔγϣϯϓϩηεͱ/ͷϋΠϒϦουܕϓϩηεʹෳΧʔωϧεϨου͕ՄೳͰɺͦΕΒΛϢʔβʔεϨουͰڞ༗ͯ͠͏Πϝʔδʢฒߦ͔ͭฒྻ͕Մೳ
./ํࣜϝϦοτσϝϦοτํࣜͱ/ํࣜͷྑ͍ॴͲΓϚϧνίΞΛ׆͔ͤͯɺίϯςΩετεΠον͍εέδϡʔϥʔ͕ෳࡶʹͳΔݴޠଆ͕ؤுΒͳ͍ͱ͍͚ͳ͍ Χʔωϧεέδϡʔϥʔ$16 $16ϢʔβʔεέδϡʔϥʔΞϓϦέʔγϣϯϓϩηε
࣮ߦํࣜͷൺֱ/ ./ϝϦοτίϯςΩετεΠον͕͍Ϛγϯ্ͷίΞΛશͯ͑Δྑ͍ͱ͜ΖͲΓσϝϦοτϚϧνίΞΛੜ͔ͤͳ͍ίϯςΩετεΠον͕͍εέδϡʔϥʔ͕ෳࡶʹͳΔ
εϨου·ͱΊϓϩάϥϛϯάݴޠ͕࡞ΔεϨουͳͷ͔04͕࡞ΔεϨουͳͷ͔εϨου͕ͲͷΑ͏ʹεέδϡʔϦϯά͞ΕΔͷ͔ීஈҙࣝͤͣʹϓϩάϥϜΛॻ͍͍ͯΔ͕ɺ֤ϓϩάϥϛϯάݴޠฒߦॲཧͷੑೳΛ্͛ΔͨΊʹɺ্هͷ͜ͱΛ͍ͯ͠Δ
w ֤ฒߦॲཧϞδϡʔϧͷڍಈw ΧʔωϧεϨου͔ϢʔβʔεϨου͔w εέδϡʔϦϯά1SPHSBNNJOH-BOHVBHF˞۩ମతͳੑೳͱ͔҆શੑͱ͔ʹ৮Ε·ͤΜ
w +7.ͷεϨουw HPSPVUJOFw "LLB"DUPS1SPHSBNNJOH-BOHVBHF͜ΕΒͷ࣮ଶΛ͍ͬͯ͘
w +7.ͷεϨουw HPSPVUJOFw "LLB"DUPS1SPHSBNNJOH-BOHVBHF
+7.ͷεϨουval thread = new Thread()[email protected]෦ͰΧʔωϧεϨουΛੜ͍ͯ͠ΔΧʔωϧۭؒ[email protected] UJE BUUS WPJE WPJE[email protected]@FOUSZ UISFBEval executorService = Executors.newFixedThreadPool(4)ͭͷΧʔωϧεϨουͷϓʔϧΛੜ
+7.ͷεϨου+7.ͷεϨουΧʔωϧεϨουʢ+BWB·ͰϢʔβʔεϨου͕͋ͬͨΒ͍͠ʣΧʔωϧεϨουͷελοΫαΠζݻఆͰ͋Γɺ04ʹґଘ͢Δ
+7.εϨουͷεέδϡʔϦϯάϢʔβʔεϨου͕ଘࡏ͠ͳ͍ͷͰɺํࣜΧʔωϧεέδϡʔϥʔ$16 $16$16ͷίΞΑΓεϨου͕ଟ͍߹ɺΧʔωϧεέδϡʔϥʔ͕εϨουΛΓସ͑Δ+7.ϓϩηε
+7.ͷεϨου·ͱΊ+7.ͷεϨουHPSPVUJOF "LLB"DUPS࣮ଶΧʔωϧεϨουαΠζ .#࣮ߦํࣜ
HPSPVUJOFͱgo func() {fmt.Println("run asynchronously.")}()HPGVOD ͰؔΛඇಉظͰ࣮ߦ͢ΔඇಉظॲཧΛ؆୯ʹͰ͖Δੌ͍Ϡπ
HPSPVUJOFͷ࣮ଶΧʔωϧεϨουͰͳ͘ɺϢʔβʔεϨουHPMBOHଆ͕ੜ͔Βഁغ·ͰΛཧ͢Δ˞ݫີʹϢʔβʔεϨουͰͳ͍Β͍͠HPSPVUJOFεέδϡʔϥʔHPΞϓϦέʔγϣϯ
HPSPVUJOFͷαΠζHPSPVUJOFͷελοΫαΠζอଘ͢ΔσʔλʹԠͯ͡ಈతʹ৳ॖ͢Δ৽͘͠ੜͨ͠HPSPVUJOF,#ͷελοΫαΠζ+7.ͷεϨουͷͷελοΫαΠζ
HPSPVUJOFͷεέδϡʔϦϯάεέδϡʔϦϯά./ํࣜෳͷHPSPVUJOF͕ҰͭͷΧʔωϧεϨουΛ͍࣋ͬͯΔΠϝʔδΧʔωϧεέδϡʔϥʔ$16 $16HPSPVUJOFεέδϡʔϥʔΧʔωϧεϨουΛҙࣝͤͣʹHPଆͰHPSPVUJOFΛߴʹΓସ͑ͯฒߦॲཧͷੑೳΛ্͍͛ͯΔHPΞϓϦέʔγϣϯෳࡶͳεέδϡʔϦϯάHPଆͰٵऩ͍ͯ͠Δ
HPSPVUJOFͷίϯςΩετεΠον࣌ؒίϯςΩετεΠονʹཁ͢Δ࣌ؒͷൺֱྫΧʔωϧεϨουHPSPVUJOF࣌ؒ (PݴޠʹΑΔฒߦॲཧίϯςΩετεΠονΛΧʔωϧεϨουΑΓਝʹߦ͑Δ
HPSPVUJOF·ͱΊ+7.ͷεϨουHPSPVUJOF "LLB"DUPS࣮ଶΧʔωϧεϨουϢʔβʔεϨουαΠζ .# ,#࣮ߦํࣜ ./
"LLB"DUPS• ScalaͱJavaͷApache2ϥΠηϯεͰఏڙ͞Ε͍ͯΔOSSϥΠϒϥϦ• ΞΫλʔϞσϧΛద༻ͨ͠ϥΠϒϥϦ
ΞΫλʔϞσϧwશͯͷͷΞΫλʔwඇಉظϝοηʔδύογϯάw୯ҰΞΫλʔͰͷϝοηʔδॲཧͷஞ࣍ੑ
ΞΫλʔϞσϧΛ࣮ͨ͠ݴޠw+BWB4DBMBw&SMBOH
"LLB"DUPSͦΕͧΕͷΞΫλʔϝʔϧϘοΫεΛ࣋ͪɺϝοηʔδΛૹΓ͋ͬͯॲཧΛߦ͏ϝοηʔδͷΓͱΓશͯඇಉظΞΫλʔ̍ ΞΫλʔ̎ΞΫλʔ̏ ΞΫλʔ̐
"LLB"DUPSDispatcher͕ΞΫλʔʹεϨουΛׂΓͯΔΞΫλʔDispatcherʹׂΓͯΒΕͨεϨουΛͬͯॲཧΛ࣮ߦΞΫλʔΞΫλʔ ΞΫλʔ
"LLB"DUPSDispatcher͕ΞΫλʔʹεϨουΛׂΓͯΔΞΫλʔDispatcherʹׂΓͯΒΕͨεϨουΛͬͯॲཧΛ࣮ߦΞΫλʔΞΫλʔ ΞΫλʔwΞΫλʔͷ࣮ଶw%JTQBUDIFSׂ͕ΓͯΔεϨου
ΞΫλʔʹ·ͭΘΔΑ͘ฉ͘ΞΫλʔܰྔϓϩηεͩΑεϨουͷ͜ͱΛܰྔϓϩηεͱݴͬͨΓ͢Δ͕ɺ͜ͷจ຺ͰεϨουͰͳ͍͍͜͠
ܰྔϓϩηεʢ-JHIU8FJHIU1SPDFTTʣΧʔωϧ͕ཧ͢ΔɺεϨουΛ࣮ߦ͢ΔΦϒδΣΫτ-81͕ϢʔβʔεϨουΛબͯ͠ॲཧΛ࣮ߦ͢ΔϢʔβʔۭؒͷεϨουͱΧʔωϧۭؒͷ-81͕ϚοϐϯάΛΓସ͑ͳ͕ΒॲཧΛ࣮ߦ͢ΔIUUQTKBXJLJQFEJBPSHXJLJ&#&"$&&@ &#&#&&"&#$&#'
ܰྔϓϩηεʢ-JHIU8FJHIU1SPDFTTʣΧʔωϧ͕ཧ͢ΔɺεϨουΛ࣮ߦ͢ΔΦϒδΣΫτ-81͕ϢʔβʔεϨουΛબͯ͠ॲཧΛ࣮ߦ͢ΔϢʔβʔۭؒͷεϨουͱΧʔωϧۭؒͷ-81͕ϚοϐϯάΛΓସ͑ͳ͕ΒॲཧΛ࣮ߦ͢Δ͜ΕΞΫλʔͱҟͳΔIUUQTKBXJLJQFEJBPSHXJLJ&#&"$&&@ &#&#&&"&#$&#'
&SMBOHͷܰྔϓϩηε&SMBOHͷΞΫλʔͷਖ਼ମQSPDFTTͱ͍͏DͰॻ͔Εͨߏମ04ͷϓϩηεͱҟͳΔάϦʔϯϓϩηεͱݴΘΕͨΓ͢ΔTUSVDUQSPDFTT\ɾώʔϓྖҬɾελοΫɾϨδελɾΠϯετϥΫγϣϯɾϙΠϯλɾϝοηʔδɾΩϡʔɾϓϩηεͷ*%^Ҿ༻
"LLB"DUPS"LLB"DUPSʹ͓͍ͯΞΫλʔ4DBMBͷΦϒδΣΫτ+7.ϓϩηεαΠζ,#ΞΫλʔΦϒδΣΫτ
"LLB"DUPS+7.ϓϩηεΧʔωϧεϨου͕͜ͷΞΫλʔΦϒδΣΫτʹׂΓͯΒΕͯॲཧ͕࣮ߦ͞ΕΔͨͩͷΦϒδΣΫτͳͷͰɺΧʔωϧεϨουͱҧ͍ੜʹίετ͕͔͔Βͳ͍
%JTQBUDIFSΞΫλʔʹΧʔωϧεϨουΛׂΓͯΔσϑΥϧτ$16ͷίΞͷΧʔωϧεϨουϓʔϧΛѻ͏abstract class ActorSystem extends ActorRefFactory {implicit def dispatcher: ExecutionContextExecutor}Χʔωϧۭؒ
"LLB"DUPSʹ͓͚ΔεέδϡʔϦϯάΧʔωϧεέδϡʔϥʔ+7.ϓϩηε$16 $16%JTQBUDIFSํ͕ࣜͩɺ+7.ϓϩηεͰͳ͘ɺΞΫλʔ ܰྔϓϩηε͕ΧʔωϧεϨουΛͬͯॲཧΛߦ͏%JTQBUDIFS͕ϢʔβʔεέδϡʔϥʔͷΑ͏ʹৼΔ͏Πϝʔδ
·ͱΊ+7.ͷεϨουHPSPVUJOF "LLB"DUPS࣮ଶΧʔωϧεϨουϢʔβʔεϨουܰྔϓϩηεΦϒδΣΫταΠζ .# ,# ,#࣮ߦํࣜ ./
·ͱΊ࣮ߦํࣜେࣄ͚ͩͲɺίϯςΩετεΠονͷλΠϛϯάͳͲੑೳʹӨڹ͢Δੑೳେࣄ͚ͩͲɺεϨουηʔϑ͔ͳͲͷ҆શੑେࣄ֤ݴޠੑೳΛ্͛ΔͨΊʹɺ৭ʑͳฒߦॲཧػػߏΛͱ͍ͬͯΔฒߦॲཧΛͲ͏ઃܭ͢Δ͔ϓϩάϥϚ࣍ୈ