Upgrade to Pro — share decks privately, control downloads, hide ads and more …

スケジューラから学ぶGoランタイム 〜code reading of runtime pkg〜

H.Saki
November 13, 2021

スケジューラから学ぶGoランタイム 〜code reading of runtime pkg〜

21/11/13 Go Conference 2021 Autumnにて発表

https://gocon.jp/2021autumn/
https://gocon.connpass.com/event/213865/

H.Saki

November 13, 2021
Tweet

More Decks by H.Saki

Other Decks in Technology

Transcript

  1. スケジューラから学ぶGoランタイム
    〜 code reading of runtime pkg〜
    さき(H.Saki)
    @saki-engineer
    Go Conference 2021 Autumn, NOV 13 2021

    View Slide

  2. 自己紹介
    About Me
    l ͖͞ )4BLJ

    ○ ౦େ޻ֶ෦ ˠ ࠓ೥͔Β৽ࣾձਓ
    ○ 5XJUUFS!TBLJFOHJOFFS
    l աڈͷ੒Ռ෺
    FUDʜ

    View Slide

  3. 自己紹介
    About Me
    l ͖͞ )4BLJ

    ○ ౦େ޻ֶ෦ ˠ ࠓ೥͔Β৽ࣾձਓ
    ○ 5XJUUFS!TBLJFOHJOFFS
    l աڈͷ੒Ռ෺
    FUDʜ
    ͜ΕΛॻ͘ͷʹΊͬͪΌۤ࿑ͨ͠
    ಛʹ৘ใιʔεΛ͋ͨΔͨΊʹ
    SVOUJNFύοέʔδΛίʔυϦʔςΟϯά͢Δͱ͜Ζ
    ࣥචʹ͔͔ͬͨ࣌ؒϲ݄

    View Slide

  4. アジェンダ
    ϥϯλΠϜͱ͸
    ʜʜϥϯλΠϜͬͯԿʁ
    (PϥϯλΠϜͷίϯϙʔωϯτ
    ʜʜϥϯλΠϜͬͯͲΜͳ෦඼Ͱग़དྷ͍ͯΔͷʁ
    εέδϡʔϦϯάͱϓϦΤϯϓγϣϯ
    ʜʜϥϯλΠϜʹ͸͜ͷΑ͏ͳػೳ͕͋Γ·͢
    ϥϯλΠϜ͕བྷΉॲཧ
    ʜʜϥϯλΠϜͷػೳ͸͜ͷΑ͏ͳ৔ॴ Ϣʔεέʔε
    Ͱ࢖ΘΕ·͢
    ϥϯλΠϜΛֶͿʹ͸

    View Slide

  5. おことわり
    ͜ͷηογϣϯͰ͸ɺҎԼͷ͜ͱ͸ط஌ͱͯ͠ѻΘ͍͖ͤͯͨͩ·͢ɻ
    l ΰʔϧʔνϯͱ͸Կ͔
    l ฒߦॲཧͱ͸Կ͔
    l ॳาతͳίϯϐϡʔλʔαΠΤϯε
    ○ $16 ϓϩηε εϨου ʜͳͲͦͷลͷ୯ޠ͕෼͔Ε͹0,

    View Slide

  6. アジェンダ
    ϥϯλΠϜͱ͸
    ᶃ ϥϯλΠϜͱ͸Կ͔ʁ
    ᶄ (Pͷεέδϡʔϥʔͷ໾ׂ
    (PϥϯλΠϜͷίϯϙʔωϯτ
    εέδϡʔϦϯάͱϓϦΤϯϓγϣϯ
    ϥϯλΠϜ͕བྷΉॲཧ
    ϥϯλΠϜΛֶͿʹ͸

    View Slide

  7. 「ランタイム」とは何か? from Wikipedia
    1. ランタイムとは
    ϥϯλΠϜγεςϜ ӳޠSVOUJNFTZTUFN·ͨ͸SVOUJNFTZTUFN
    ͱ͸ɺ
    ओʹ࣮ߦϞσϧͷҰ෦Λ࣮૷͢Δ΋ͷͰ͋Δɻ
    ϓϩάϥϜͷ௚઀ͷ࡞༻Ͱͳ͍ৼΔ෣͍͸͢΂ͯϥϯλΠϜγεςϜͷৼΔ෣͍Ͱ͋Δɺͱ
    ͍͏෩ʹϥϯλΠϜγεςϜΛఆٛ͢Δํ๏΋͋Δɻ
    8JLJQFEJBΑΓ

    View Slide

  8. 「ランタイム」とは何か? from Wikipedia
    1. ランタイムとは
    ϥϯλΠϜγεςϜ ӳޠSVOUJNFTZTUFN·ͨ͸SVOUJNFTZTUFN
    ͱ͸ɺ
    ओʹ࣮ߦϞσϧͷҰ෦Λ࣮૷͢Δ΋ͷͰ͋Δɻ
    ϓϩάϥϜͷ௚઀ͷ࡞༻Ͱͳ͍ৼΔ෣͍͸͢΂ͯϥϯλΠϜγεςϜͷৼΔ෣͍Ͱ͋Δɺͱ
    ͍͏෩ʹϥϯλΠϜγεςϜΛఆٛ͢Δํ๏΋͋Δɻ
    8JLJQFEJBΑΓ
    ͳΔ΄ͲΘ͔ΒΜ

    View Slide

  9. 「ランタイム」の具体例
    1. ランタイムとは
    (PͰ͸։ൃऀ͕ϏδωεϩδοΫͷهड़ʹ஫ྗͰ͖ΔΑ͏ʹɺ͋Δఔ౓ͷ͜ͱ
    ͸ʮϥϯλΠϜʯଆͰ࣮ߦͯ͘͠Ε·͢ɻ
    ϝϞϦͷׂΓ౰ͯ
    intܕͭΛ֨ೲ͢ΔϝϞϦ͸
    ࣗಈͰ֬อ͞ΕΔ
    ஫$ݴޠͩͱmallocͳͲͰ
    ໌ࣔతʹ֬อ͢Δඞཁ͋Γ
    (PϥϯλΠϜͷ໾ׂ
    ΨϕʔδίϨΫτ εέδϡʔϦϯά
    ࢖͍ऴΘͬͨม਺arrayͷ
    ϝϞϦղ์͸ࣗಈͰߦΘΕΔ
    ஫$ݴޠͩͱfreeͰ
    ໌ࣔతʹղ์͢Δඞཁ͋Γ
    ฒߦͳؔ਺Λ࣮ࡍʹͲͷλΠ
    ϛϯάͰಈ͔͢ͷ͔͸ࣗಈͰ
    ௐ੔͞ΕΔ

    View Slide

  10. 「ランタイム」の具体例
    1. ランタイムとは
    (PͰ͸։ൃऀ͕ϏδωεϩδοΫͷهड़ʹ஫ྗͰ͖ΔΑ͏ʹɺ͋Δఔ౓ͷ͜ͱ
    ͸ʮϥϯλΠϜʯଆͰ࣮ߦͯ͘͠Ε·͢ɻ
    ϝϞϦͷׂΓ౰ͯ
    intܕͭΛ֨ೲ͢ΔϝϞϦ͸
    ࣗಈͰ֬อ͞ΕΔ
    ஫$ݴޠͩͱmallocͳͲͰ
    ໌ࣔతʹ֬อ͢Δඞཁ͋Γ
    (PϥϯλΠϜͷ໾ׂ
    ΨϕʔδίϨΫτ εέδϡʔϦϯά
    ࢖͍ऴΘͬͨม਺arrayͷ
    ϝϞϦղ์͸ࣗಈͰߦΘΕΔ
    ஫$ݴޠͩͱfreeͰ
    ໌ࣔతʹղ์͢Δඞཁ͋Γ
    ฒߦͳؔ਺Λ࣮ࡍʹͲͷλΠ
    ϛϯάͰಈ͔͢ͷ͔͸ࣗಈͰ
    ௐ੔͞ΕΔ

    View Slide

  11. アジェンダ
    ϥϯλΠϜͱ͸
    ᶃ ϥϯλΠϜͱ͸Կ͔ʁ
    ᶄ (Pͷεέδϡʔϥʔͷ໾ׂ
    (Pεέδϡʔϥͷߏ੒ཁૉ
    εέδϡʔϦϯάͱϓϦΤϯϓγϣϯ
    ϥϯλΠϜ͕བྷΉॲཧ
    ϥϯλΠϜΛֶͿʹ͸

    View Slide

  12. Goのスケジューラーの役割(1/5)
    1. ランタイムとは
    ฒߦʹ࣮ߦ͢Δΰʔϧʔνϯͷ਺͕ɺϓϩάϥϜͰ࢖༻Ͱ͖Δ04εϨου਺Α
    Γ΋গͳ͔ͬͨ৔߹͸࿩͕؆୯ɻ୯७ʹରԠͤ͞Δ͜ͱ͕Ͱ͖·͢ɻ
    idle
    ฒྻʹ࣮ߦ͢Δΰʔϧʔνϯ਺ 04εϨου ͷ৔߹
    go MyFunc1()
    ϓϩάϥϜத
    04εϨου
    UJNF
    idle
    myFunc2
    idle
    myFunc1
    go MyFunc2()

    View Slide

  13. Goのスケジューラーの役割(2/5)
    1. ランタイムとは
    ͔͠͠ΰʔϧʔνϯͷ਺͕04εϨου਺Λ্ճ͍ͬͯΔ৔߹͸ɺ͏·͍۩߹ʹ
    ϦιʔεΛ෼͚߹͏ඞཁ͕͋Γ·͢ɻ
    ฒྻʹ࣮ߦ͢Δΰʔϧʔνϯ਺ 04εϨου ͷ৔߹
    go MyFunc1()
    go MyFunc2()
    ϓϩάϥϜத
    04εϨου
    UJNF
    idle
    myFunc2
    myFunc1
    go MyFunc3()
    go MyFunc4()
    idle
    myFunc3

    View Slide

  14. Goのスケジューラーの役割(3/5)
    1. ランタイムとは
    ͔͠͠ΰʔϧʔνϯͷ਺͕04εϨου਺Λ্ճ͍ͬͯΔ৔߹͸ɺ͏·͍۩߹ʹ
    ϦιʔεΛ෼͚߹͏ඞཁ͕͋Γ·͢ɻ
    idle
    idle
    ฒྻʹ࣮ߦ͢Δΰʔϧʔνϯ਺ 04εϨου ͷ৔߹
    go MyFunc1()
    go MyFunc2()
    ϓϩάϥϜத
    04εϨου
    UJNF
    myFunc2
    myFunc1
    go MyFunc3()
    go MyFunc4()
    myFunc3
    MyFunc4͚͕࣮ͩߦ͞Εͳ͍··
    ࢒ͬͯ͠·͍ͬͯΔ

    View Slide

  15. Goのスケジューラーの役割(4/5)
    1. ランタイムとは
    ͦ͜Ͱ(Pͷεέδϡʔϥʔ͸ɺΰʔϧʔνϯ04εϨουؒͷׂΓ౰ͯΛௐ੔
    ͢Δ໾ׂΛ୲͍·͢ɻ
    ฒྻʹ࣮ߦ͢Δΰʔϧʔνϯ਺ 04εϨου ͷ৔߹
    go MyFunc1()
    go MyFunc2()
    ϓϩάϥϜத
    04εϨου
    UJNF
    idle
    myFunc2
    go MyFunc3()
    idle
    myFunc3
    go MyFunc4()
    myFunc1 myFunc4
    εέδϡʔϥ͕myFunc1Λதஅͤ͞ɺ
    myFunc4ʹϦιʔεΛ౉͢

    View Slide

  16. Goのスケジューラーの役割(5/5)
    1. ランタイムとは
    ·ͨεέδϡʔϥ͸ɺΰʔϧʔνϯ͚ͩͰ͸ͳ͘ɺΨϕʔδίϨΫτͷΑ͏ͳผ
    ͷϥϯλΠϜͷػೳ·Ͱ߹Θ࣮ͤͯߦλΠϛϯάΛௐ੔͢Δ͜ͱ͕Ͱ͖·͢ɻ
    ฒྻʹ࣮ߦ͢Δΰʔϧʔνϯ਺ 04εϨου ͷ৔߹
    go MyFunc1()
    go MyFunc2()
    ϓϩάϥϜத
    04εϨου
    UJNF
    idle
    myFunc2
    go MyFunc3()
    idle
    myFunc3
    go MyFunc4()
    ΨϕʔδίϨΫτΛ
    (PͷλΠϛϯάͰೖΕΔ͜ͱ͕Ͱ͖Δ
    myFunc1 GC myFunc1

    View Slide

  17. ここまでのまとめ
    l ϥϯλΠϜ͸ɺϓϩάϥϚ͕ϏδωεϩδοΫ෦෼ͷ։ൃʹ஫ྗͰ͖ΔΑ͏
    ʹɺϓϩάϥϜΛಈ͔ͨ͢ΊʹඞཁͳॾػೳΛҾ͖ड͚ͯ͘Ε͍ͯΔ
    l ϥϯλΠϜ͕࣋ͭͭͷػೳ͕εέδϡʔϦϯά
    l ಠࣗʹεέδϡʔϥʔΛ࣋ͭ͜ͱͰɺʮ͍ͭͲΜͳΰʔϧʔνϯ͕࣮ߦ͞Ε
    Δͷ͔ʯΛ(PMJLFʹܾΊΔ͜ͱ͕Ͱ͖͍ͯΔ

    View Slide

  18. アジェンダ
    (PϥϯλΠϜͷίϯϙʔωϯτ
    ᶃ ( . 1ͱ͸ʁ
    ᶄ ௥Ճͷߏ੒ཁૉ
    ϥϯλΠϜͱ͸
    εέδϡʔϦϯάͱϓϦΤϯϓγϣϯ
    ϥϯλΠϜ͕བྷΉॲཧ
    ϥϯλΠϜΛֶͿʹ͸

    View Slide

  19. コンポーネントって一体どういうこと
    2. Goランタイムのコンポーネント
    ཁ͢ΔʹɺʮSVOUJNFύοέʔδͰΑ͘ग़ͯ͘Δߏ଄ମɾม਺ɾؔ਺ʯͷ࿩Λ͜
    Ε͔Β͠·͢ɻ
    PTύοέʔδͷ৔߹ TRMύοέʔδͷ৔߹ SVOUJNFύοέʔδͷ৔߹
    PT'JMFܕͷಋೖ TRM%#ܕͷಋೖ 5PCFDPOUJOVFEʜ
    ϑΝΠϧૢ࡞͍ͨ͠Ͱ͢ %#઀ଓ͍ͨ͠Ͱ͢ εέδϡʔϦϯά͍ͨ͠Ͱ͢

    View Slide

  20. Goランタイムのコンポーネント
    2. Goランタイムのコンポーネント
    SVOUJNFύοέʔδ಺ʹ)"$,*/(NEͱ͍͏ϑΝΠϧ͕͋Γɺͦ͜ʹ͸ҎԼͷ
    Α͏ʹهड़͞Ε͍ͯ·͢ɻ
    5IFTDIFEVMFSNBOBHFTUISFFUZQFTPGSFTPVSDFTUIBUQFSWBEFUIFSVOUJNF
    (T .T BOE1T

    εέδϡʔϥͷ໾ׂ͸(PϥϯλΠϜΛࢧ͑ΔҎԼͭͷϦιʔεΛ؅ཧ͢Δ͜ͱͰ͋Δɻ
    Ұͭ͸( ΋͏Ұͭ͸. ͦͯ͠࠷ޙʹ1Ͱ͋Δɻ
    SVOUJNF)"$,*/(NE
    ϥϯλΠϜΛࢧ͑Δʮ( . 1ʯͱ͸Կ͔ʁ

    View Slide

  21. Goランタイムのコンポーネント
    2. Goランタイムのコンポーネント
    (PεέδϡʔϥͰ͸ɺҎԼͷ( . 1Λ͏·͘૊Έ߹ΘͤΔ͜ͱͰ࢓ࣄΛߦͳͬ
    ͍ͯ·͢ɻ
    ໊শ
    (PSPVUJOF
    (
    .
    1
    .BDIJOF
    1SPDFTTPS
    ΰʔϧʔνϯͦͷ΋ͷɻ
    goจʹΑͬͯىಈ͞Εɺؔ਺ͷ࣮ߦ͕ऴΘͬͨΒऴྃ͞ΕΔɻ
    04εϨουɻ
    (Pͷίʔυ΍ϥϯλΠϜίʔυΛ࣮ߦͨ͠ΓɺγεςϜίʔϧΛݺ
    ΜͩΓΞΠυϧʹͳͬͨΓ͢Δɻ
    ΰʔϧʔνϯΛ࣮ߦ͢Δͷʹඞཁͳ1$Ϧιʔεɻ
    04εέδϡʔϥʹͱͬͯͷ$16ͷΑ͏ͳ΋ͷɻ
    ུশ ֓ཁ

    View Slide

  22. コードを実行するために必要なもの
    2. Goランタイムのコンポーネント
    ϓϩάϥϜͷίʔυͱ͍͏όΠτྻ͚ͩͰ͸ɺͦΕΛಈ͔͢͜ͱ͸Ͱ͖ͳ͍ɻಈ
    ͔͢ʹ͸04εϨουͱ$16ίΞ͕ඞཁͰ͋Δɻ
    ϓϩάϥϜίʔυͷΈ
    ϓϩάϥϜίʔυͱ
    ͦΕ͕ͷͬͨϝϞϦۭ͚ؒͩ
    ˣ
    ࣮ߦ͢Δ͜ͱ͕Ͱ͖ͳ͍
    Πϝʔδ
    ίʔυεϨουͷΈ ίʔυεϨου$16
    ϓϩάϥϜϝϞϦͱ
    04εϨου͚ͩ
    ˣ
    ࣮ߦ͢Δ͜ͱ͕Ͱ͖ͳ͍
    ϓϩάϥϜϝϞϦͱ
    04εϨουͱ
    Ծ૝
    $16
    ˣ
    ࣮ߦͰ͖Δ
    γʔϯʜ γʔϯʜ
    DPEF 04
    εϨου
    $16
    ΢Οʔϯʂ
    DPEF 04
    εϨου
    DPEF

    View Slide

  23. Goランタイム上でのモデリング
    2. Goランタイムのコンポーネント
    (PϥϯλΠϜͷ( . 1͸ɺઌ΄Ͳͷ࿩ΛϞσϦϯάͨ͠΋ͷͰ͢ɻجຊతʹɺ
    ( . 1͕ͭଗΘͳ͍ͱϓϩάϥϜΛ࣮ߦ͢Δ͜ͱ͕Ͱ͖·ͤΜɻ
    (ͷΈ
    ϓϩάϥϜίʔυͱ
    ͦΕ͕ͷͬͨϝϞϦۭ͚ؒͩ
    ˣ
    ࣮ߦ͢Δ͜ͱ͕Ͱ͖ͳ͍
    Πϝʔδ
    (ͱ.ͷΈ (ͱ.ͱ1
    ϓϩάϥϜϝϞϦͱ
    04εϨου͚ͩ
    ˣ
    ࣮ߦ͢Δ͜ͱ͕Ͱ͖ͳ͍
    ϓϩάϥϜϝϞϦͱ
    04εϨουͱ
    Ծ૝
    $16
    ˣ
    ࣮ߦͰ͖Δ
    (
    γʔϯʜ
    . (
    γʔϯʜ
    ϝϞϦ
    ϝϞϦ

    εϨου

    1 . (
    ϝϞϦ

    εϨου

    $16

    ΢Οʔϯʂ

    View Slide

  24. Goランタイムのコンポーネント(再掲)
    2. Goランタイムのコンポーネント
    (PεέδϡʔϥͰ͸ɺҎԼͷ( . 1Λ͏·͘૊Έ߹ΘͤΔ͜ͱͰ࢓ࣄΛߦͳͬ
    ͍ͯ·͢ɻ
    ໊শ
    (PSPVUJOF
    (
    .
    1
    .BDIJOF
    1SPDFTTPS
    ΰʔϧʔνϯͦͷ΋ͷɻ
    goจʹΑͬͯىಈ͞Εɺؔ਺ͷ࣮ߦ͕ऴΘͬͨΒऴྃ͞ΕΔɻ
    04εϨουɻ
    (Pͷίʔυ΍ϥϯλΠϜίʔυΛ࣮ߦͨ͠ΓɺγεςϜίʔϧΛݺ
    ΜͩΓΞΠυϧʹͳͬͨΓ͢Δɻ
    ΰʔϧʔνϯΛ࣮ߦ͢Δͷʹඞཁͳ1$Ϧιʔεɻ
    04εέδϡʔϥʹͱͬͯͷ$16ͷΑ͏ͳ΋ͷɻ
    ུশ ֓ཁ

    View Slide

  25. G構造体 〜ゴールーチン〜(1/4)
    2. Goランタイムのコンポーネント
    (͸ɺΰʔϧʔνϯͦͷ΋ͷΛࢦ͢SVOUJNFύοέʔδ಺ͷߏ଄ମͰ͢ɻ
    ग़యSVOUJNFSVOUJNFHP
    (

    View Slide

  26. G構造体 〜ゴールーチン〜(2/4)
    2. Goランタイムのコンポーネント
    NϑΟʔϧυʹͯɺͦͷ(ʹඥͮ͘04εϨου͕ࢦఆ͞Ε͍ͯ·͢ɻ
    . (
    ͦͷΰʔϧʔνϯΛಈ͔͢
    04εϨου͕
    NϑΟʔϧυͰࢦఆ͞Ε͍ͯΔ
    ग़యSVOUJNFSVOUJNFHP

    View Slide

  27. G構造体 〜ゴールーチン〜(3/4)
    2. Goランタイムのコンポーネント
    ΰʔϧʔνϯ্Ͱ࣮ߦ͢Δίʔυ͕ࡌΔϝϞϦϑΟʔϧυ΋͋Γ·͢ɻ
    . (
    ͦͷΰʔϧʔνϯͰ࣮ߦ͢Δॲཧ͕ͷͬͨ
    ϝϞϦΞυϨε͕TDIFEʹ֨ೲ
    ग़యSVOUJNFSVOUJNFHP

    View Slide

  28. G構造体 〜ゴールーチン〜(4/4)
    2. Goランタイムのコンポーネント
    ݱࡏͷΰʔϧʔνϯͷεςʔλεΛද͢ϑΟʔϧυ͕͋Γ·͢ɻ
    . (
    (͕ࠓͲͷΑ͏ͳঢ়ଶͳͷ͔
    εςʔλε͕֨ೲ͞Ε͍ͯΔ
    ग़యSVOUJNFSVOUJNFHP

    View Slide

  29. Goランタイムのコンポーネント(再掲)
    2. Goランタイムのコンポーネント
    (PεέδϡʔϥͰ͸ɺҎԼͷ( . 1Λ͏·͘૊Έ߹ΘͤΔ͜ͱͰ࢓ࣄΛߦͳͬ
    ͍ͯ·͢ɻ
    ໊শ
    (PSPVUJOF
    (
    .
    1
    .BDIJOF
    1SPDFTTPS
    ΰʔϧʔνϯͦͷ΋ͷɻ
    goจʹΑͬͯىಈ͞Εɺؔ਺ͷ࣮ߦ͕ऴΘͬͨΒऴྃ͞ΕΔɻ
    04εϨουɻ
    (Pͷίʔυ΍ϥϯλΠϜίʔυΛ࣮ߦͨ͠ΓɺγεςϜίʔϧΛݺ
    ΜͩΓΞΠυϧʹͳͬͨΓ͢Δɻ
    ΰʔϧʔνϯΛ࣮ߦ͢Δͷʹඞཁͳ1$Ϧιʔεɻ
    04εέδϡʔϥʹͱͬͯͷ$16ͷΑ͏ͳ΋ͷɻ
    ུশ ֓ཁ

    View Slide

  30. M構造体 〜OSスレッド〜(1/4)
    2. Goランタイムのコンポーネント
    .͸ɺ(Λ࣮ߦ͢ΔͨΊͷ04εϨουΛදݱͨ͠ߏ଄ମͰ͢ɻ
    .
    ग़యSVOUJNFSVOUJNFHP

    View Slide

  31. M構造体 〜OSスレッド〜(2/4)
    2. Goランタイムのコンポーネント
    ࠓݱࡏ04εϨου.্Ͱಈ͍͍ͯΔ(Λද͢ϑΟʔϧυ͕͋Γ·͢ɻ
    . (
    ͦͷ.ͷ্Ͱಈ͔͍ͯ͠Δ(
    ग़యSVOUJNFSVOUJNFHP

    View Slide

  32. M構造体 〜OSスレッド〜(3/4)
    2. Goランタイムのコンポーネント
    ࠓͷ.ࣗ਎͕ඥͮ͘Ծ૝1$Ϧιʔε1Λද͢ϑΟʔϧυ΋͋Γ·͢ɻ
    1
    . (
    ͦͷ.Λಈ͔͍ͯ͠Δ1
    ग़యSVOUJNFSVOUJNFHP

    View Slide

  33. M構造体 〜OSスレッド〜(4/4)
    2. Goランタイムのコンポーネント
    N04ϑΟʔϧυͷதʹ͸ɺ04εϨουͷ࣮ମ͕֨ೲ͞Ε͍ͯ·͢ɻ
    1
    . (
    04εϨου͕
    தʹೖ͍ͬͯΔ
    ग़యSVOUJNFSVOUJNFHP

    View Slide

  34. Goランタイムのコンポーネント(再掲)
    2. Goランタイムのコンポーネント
    (PεέδϡʔϥͰ͸ɺҎԼͷ( . 1Λ͏·͘૊Έ߹ΘͤΔ͜ͱͰ࢓ࣄΛߦͳͬ
    ͍ͯ·͢ɻ
    ໊শ
    (PSPVUJOF
    (
    .
    1
    .BDIJOF
    1SPDFTTPS
    ΰʔϧʔνϯͦͷ΋ͷɻ
    goจʹΑͬͯىಈ͞Εɺؔ਺ͷ࣮ߦ͕ऴΘͬͨΒऴྃ͞ΕΔɻ
    04εϨουɻ
    (Pͷίʔυ΍ϥϯλΠϜίʔυΛ࣮ߦͨ͠ΓɺγεςϜίʔϧΛݺ
    ΜͩΓΞΠυϧʹͳͬͨΓ͢Δɻ
    ΰʔϧʔνϯΛ࣮ߦ͢Δͷʹඞཁͳ1$Ϧιʔεɻ
    04εέδϡʔϥʹͱͬͯͷ$16ͷΑ͏ͳ΋ͷɻ
    ུশ ֓ཁ

    View Slide

  35. P構造体 〜仮想PCリソース〜(1/3)
    2. Goランタイムのコンポーネント
    1ߏ଄ମ͸ɺ04εϨουΛ࣮ࡍʹಈ͔͢1$ϦιʔεΛද͠·͢ɻ
    1
    ग़యSVOUJNFSVOUJNFHP

    View Slide

  36. P構造体 〜仮想PCリソース〜(2/3)
    2. Goランタイムのコンポーネント
    ݱࡏͷ1͕ඥ͍͍ͮͯΔ.Λද͢ϑΟʔϧυ͕͋Γ·͢ɻ
    1
    .
    ͦͷ1Ͱࠓಈ͔͍ͯ͠Δ.
    ग़యSVOUJNFSVOUJNFHP

    View Slide

  37. P構造体 〜仮想PCリソース〜(3/3)
    2. Goランタイムのコンポーネント
    ࣮ߦ༧ఆͷ(ΛͨΊ͓ͯͨ͘ΊͷϩʔΧϧΩϡʔΛද͢ϑΟʔϧυ΋͋Γ·͢ɻ
    1
    .
    ( (
    ͦͷ1Ͱ࣮ߦ͢Δ༧ఆͷ(ΛΩϡʔͰͨΊ͓ͯ͘
    (ͷϩʔΧϧΩϡʔ
    ग़యSVOUJNFSVOUJNFHP

    View Slide

  38. Goランタイムの全体図(仮)
    2. Goランタイムのコンポーネント
    (PϥϯλΠϜͷ෦඼ಉ࢜ͷؔ܎Λ·ͱΊΔͱɺҎԼͷਤͷΑ͏ʹදͤ·͢ɻ
    1
    . (
    ( (
    ৔߹ʹΑͬͯ͸ෳ਺ݸੜ੒͞ΕΔ

    View Slide

  39. Goランタイムの全体図
    2. Goランタイムのコンポーネント
    (PϥϯλΠϜͷ෦඼ಉ࢜ͷؔ܎Λ·ͱΊΔͱɺҎԼͷਤͷΑ͏ʹදͤ·͢ɻ
    1
    .
    (

    (
    ( (
    .
    TZTNPO

    (
    ৔߹ʹΑͬͯ͸ෳ਺ݸੜ੒͞ΕΔ
    ( ( (

    View Slide

  40. アジェンダ
    (PϥϯλΠϜͷίϯϙʔωϯτ
    ᶃ ( . 1ͱ͸ʁ
    ᶄ ௥Ճͷߏ੒ཁૉ
    ϥϯλΠϜͱ͸
    εέδϡʔϦϯάͱϓϦΤϯϓγϣϯ
    ϥϯλΠϜ͕བྷΉॲཧ
    ϥϯλΠϜΛֶͿʹ͸

    View Slide

  41. Goランタイムの全体図(再掲)
    2. Goランタイムのコンポーネント
    (PϥϯλΠϜͷ෦඼ಉ࢜ͷؔ܎Λ·ͱΊΔͱɺҎԼͷਤͷΑ͏ʹදͤ·͢ɻ
    .
    (

    (
    ( (
    .
    TZTNPO

    (
    TDIFE SVOR ( ( (

    View Slide

  42. グローバル変数sched(1/2)
    2. Goランタイムのコンポーネント
    TDIFE͸ɺ(PϥϯλΠϜશମͰ࢖͏஋ɾΦϒδΣΫτΛ֨ೲ͢ΔͨΊͷάϩʔ
    όϧม਺Ͱ͢ɻ
    TDIFE
    த਎͸TDIFEUܕΛݟΕ͹Θ͔Δ
    ग़యSVOUJNFSVOUJNFHP

    View Slide

  43. グローバル変数sched(2/2)
    2. Goランタイムのコンポーネント
    TDIFEͷதʹ͸ɺϥϯλΠϜશମͰڞ༗͢Δ(ΛͨΊ͓ͯ͘Ωϡʔ͕ଘࡏ͠ɺ1
    ͷϩʔΧϧΩϡʔͱରൺͯ͠άϩʔόϧΩϡʔͱݺ͹Ε͍ͯ·͢ɻ
    TDIFE SVOR ( ( (
    ಛఆͷ1ʹґଘ͠ͳ͍(ΛͨΊ͓ͯ͘
    άϩʔόϧΩϡʔ
    ग़యSVOUJNFSVOUJNFHP

    View Slide

  44. Goランタイムの全体図(再掲)
    2. Goランタイムのコンポーネント
    (PϥϯλΠϜͷ෦඼ಉ࢜ͷؔ܎Λ·ͱΊΔͱɺҎԼͷਤͷΑ͏ʹදͤ·͢ɻ
    .
    (

    (
    ( (
    ( ( (
    .
    TZTNPO

    (

    View Slide

  45. sysmon関数 〜システムモニタ〜
    2. Goランタイムのコンポーネント
    TZTNPOؔ਺͸ɺSVOUJNFύοέʔδ಺ʹଘࡏ͢Δؔ਺Ͱ͢ɻ
    1ͳ͠Ͱಈ࡞͠ɺγεςϜϞχλͱͯ͠ͷ໾ׂΛՌͨ͠·͢ɻ
    1
    .
    (
    (
    ( (
    . (
    TZTNPO͸௨ৗͷ1ͱ͸ಠཱͯ͠ಈ͘
    ग़యSVOUJNFQSPDHP

    View Slide

  46. Goランタイムの全体図(再掲)
    2. Goランタイムのコンポーネント
    (PϥϯλΠϜͷ෦඼ಉ࢜ͷؔ܎Λ·ͱΊΔͱɺҎԼͷਤͷΑ͏ʹදͤ·͢ɻ
    .
    (

    (
    ( (
    ( ( (
    .
    TZTNPO

    (

    View Slide

  47. G0 〜スケジューラ専用の特別なゴールーチンG〜
    2. Goランタイムのコンポーネント
    Ϣʔβʔ͕ॻ͍ͨίʔυΛ֨ೲ͢Δ(ͱ͸ผʹɺεέδϡʔϥؔ਺Λಈ͔ͨ͢Ί
    ͷಛผͳΰʔϧʔνϯ͕ଘࡏ͓ͯ͠ΓɺͦΕ͸(ͱݺ͹Ε͍ͯ·͢ɻ
    . (
    (

    (ͷதͰ͸TDIFEVMFؔ਺͕ಈ࡞͢Δ
    ग़యSVOUJNFSVOUJNFHP

    View Slide

  48. G,M,P以外の追加コンポーネント
    2. Goランタイムのコンポーネント
    ͜ͷ5BMLͰ͸ɺ( . 1ʹՃ͑ͯҎԼͷͭ΋ʮεέδϡʔϥͷઆ໌ʹग़ͯ͘Δ
    ߏ੒ཁૉʯͱͯ͠औΓ্͍͛ͨͱࢥ͍·͢ɻ
    ໊শ
    runtime.
    sched
    TDIFE
    TZTNPO
    (
    runtime.
    sysmon
    G0
    (PϥϯλΠϜશମͷ؀ڥ৘ใΛอ͓࣋ͯͨ͘͠Ίͷάϩʔόϧม਺ɻ
    γεςϜϞχλɻ
    ϓϩάϥϜ࣮ߦ͕ԁ׈ʹߦΘΕ͍ͯΔ͔ɺϘτϧωοΫͱͳ͍ͬͯ
    Δΰʔϧʔνϯ͕ଘࡏ͍ͯ͠ͳ͍͔Λ؂ࢹ͢Δɻ
    (Pͷεέδϡʔϥͦͷ΋ͷΛಈ͔͢(ɻ
    ུশ ֓ཁ

    View Slide

  49. アジェンダ
    ϥϯλΠϜͱ͸
    (PϥϯλΠϜͷίϯϙʔωϯτ
    εέδϡʔϦϯάͱϓϦΤϯϓγϣϯ
    ϥϯλΠϜ͕བྷΉॲཧ
    ϥϯλΠϜΛֶͿʹ͸
    ষ ষ
    1 . ( 1 . (

    View Slide

  50. スケジューリングとプリエンプション
    3. スケジューリングとプリエンプション
    ͜ͷ5BMLͰ͸ʮεέδϡʔϦϯάʯͱʮϓϦΤϯϓγϣϯʯ͕ࣔ͢ൣғΛɺҎ
    ԼͷΑ͏ʹఆٛ͠·͢ɻ
    (Λ࣮ߦ͍ͯ͠ͳ͍.͕͋ͬͨ৔߹ɺ
    ͦ͜Ͱ୅ΘΓʹ࣮ߦ͢Δ(ΛબΜͰׂΓ౰ͯΔ
    εέδϡʔϦϯά
    Ұఆͷ৚݅Λຬͨͨ͠(Λ.͔Β੾Γ཭͠ɺ
    ϦιʔεΛ։์͢Δ
    ϓϦΤϯϓγϣϯ
    (
    .
    . (
    . (
    (
    .

    View Slide

  51. 説明を始める前に
    3. スケジューリングとプリエンプション
    l ͔͜͜ΒͷεϥΠυͰ͸ɺҎԼͭΛݟͤͳ͕Βઆ໌Λ͍ͯ͠·͢
    ○ SVOUJNFύοέʔδͷιʔείʔυ
    ○ Πϝʔδਤ
    l ʮ৘ใྔ͕ଟ͍͗ͯͬ͢ͺ͍͍ͬͺ͍ʂʯͱͳͬͨΒɺΠϝʔδਤ͚ͩݟͯ
    ฉ͘ɺͱ͍͏ͷͰ΋ߏ͍·ͤΜ
    ○ εϥΠυ಺ʹίʔυͷग़యΛ໌هͯ͋͠ΔͷͰɺޙ͔Βੋඇʮ͋ʔ͋ͷ
    ਤͷಈ͖Λ࣮૷͍ͯ͠Δͷ͸͔͜͜ʯͱ௥ͬͯ΋Β͑Δͱخ͍͠Ͱ͢

    View Slide

  52. アジェンダ
    ϥϯλΠϜͱ͸
    (PϥϯλΠϜͷίϯϙʔωϯτ
    εέδϡʔϦϯάͱϓϦΤϯϓγϣϯ
    ᶃ ϓϦΤϯϓγϣϯͷ࢓૊Έ
    ᶄ εέδϡʔϥͷ࣮૷
    ϥϯλΠϜ͕བྷΉॲཧ
    ϥϯλΠϜΛֶͿʹ͸

    View Slide

  53. プリエンプション対象の検出(1/3)
    3. スケジューリングとプリエンプション
    1
    .
    (

    (
    ( (
    .
    TZTNPO

    ( ؂ࢹ
    ৗ࣌Քಇ͍ͯ͠ΔTZTNPOͷதͰɺSFUBLFؔ਺͕ݺ͹Ε͍ͯ·͢ɻ
    ग़యSVOUJNFQSPDHP
    ௕͘ಉ͡΋ͷΛ࣮ߦதͩͬͨΓ
    γεςϜίʔϧʹೖ͍ͬͯΔ1͕͋Ε͹
    ϓϦΤϯϓτ͍ͨ͠ͳʜ

    View Slide

  54. プリエンプション対象の検出(2/3)
    3. スケジューリングとプリエンプション
    1
    .
    (

    (
    ( (
    .
    TZTNPO

    ( ؂ࢹ
    ͦͯͦ͠ͷSFUBLFؔ਺ͷதͰɺQSFFNQUPOFؔ਺͕௚Ͱݺ͹Ε͍ͯ·͢ɻ
    ௕͘ಉ͡΋ͷΛ࣮ߦதͩͬͨΓ
    γεςϜίʔϧʹೖ͍ͬͯΔ1͕͋Ε͹
    ϓϦΤϯϓτ͍ͨ͠ͳʜ
    ग़యSVOUJNFQSPDHP

    View Slide

  55. プリエンプション対象の検出(3/3)
    3. スケジューリングとプリエンプション
    QSFFNQUPOFؔ਺ͷதͰ͸ʮ͜ͷ(Λ੾Γ཭͍ͯͩ͘͠͞Ͷʯͱ͍͏ϑϥάཱͯ
    Λ͍ͯ͠·͢ɻ࣮ࡍʹ(Λ੾Γ཭͢࡞ۀ͸ɺ·ͨผʹߦΘΕ·͢ɻ
    1
    .
    (

    (
    ( (
    .
    TZTNPO

    ( ϑϥάཱͯ
    ʮϓϦΤϯϓτର৅ʹͳͬͨʯͱ͍͏
    ϑϥάཱͯ
    ग़యSVOUJNFQSPDHP

    View Slide

  56. GとMの切り離し作業(1/4)
    3. スケジューリングとプリエンプション
    ྫ͑͹ελοΫ͕৽͘͠࡞ΒΕΔͱ͖ͳͲ͸ϓϦΤϯϓτ͕ߦΘΕɺ࠷ऴతʹ
    HPTDIFE*NQMؔ਺Ͱ੾Γ཭͠࡞ۀ͕ͳ͞Ε·͢ɻ
    ग़యSVOUJNFTUBDLHP
    ग़యSVOUJNFQSPDHP

    View Slide

  57. GとMの切り離し作業(2/4)
    3. スケジューリングとプリエンプション
    1
    .
    (

    (
    ( ( TDIFE SVOR ( ( (
    (ͷεςʔλεΛมߋ
    (SVOOJOHˠ (SVOOBCMF
    .
    TZTNPO

    (
    ग़యSVOUJNFQSPDHP

    View Slide

  58. GとMの切り離し作業(3/4)
    3. スケジューリングとプリエンプション
    1
    .
    (

    (
    ( (
    (Λ.͔Β੾Γ཭͢
    TDIFE SVOR ( ( (
    .
    TZTNPO

    (
    ग़యSVOUJNFQSPDHP

    View Slide

  59. GとMの切り離し作業(4/4)
    3. スケジューリングとプリエンプション
    1
    .
    (

    (
    ( (
    .
    TZTNPO

    (
    TDIFE SVOR ( ( ( (
    .͔Β੾Γ཭ͨ͠(Λ
    (ͷάϩʔόϧΩϡʔʹೖΕΔ
    ग़యSVOUJNFQSPDHP

    View Slide

  60. プリエンプションまとめ
    3. スケジューリングとプリエンプション
    l ϓϦΤϯϓγϣϯʹ(ͱ.Λ੾Γ཭ͯ͠ϦιʔεΛղ์͢Δ
    l γεςϜϞχλ͕ϥϯλΠϜશମΛ؂ࢹͯ͠ɺର৅ͱͳΔ(Λݟ͚ͭͨΒ
    ʮ͜ͷ(ΛϓϦΤϯϓτ͍ͯͩ͘͠͞ʯͱ͍͏ϑϥάΛཱͯΔ
    l ϓϦΤϯϓτϑϥάཱ͕ͬͨ(Λ࣮ࡍʹ.͔Β੾Γ཭͢࡞ۀ͸γεςϜϞχ
    λͱ͸ผͷλΠϛϯά λΠϛϯά͸༷ʑ

    View Slide

  61. アジェンダ
    ϥϯλΠϜͱ͸
    (PϥϯλΠϜͷίϯϙʔωϯτ
    εέδϡʔϦϯάͱϓϦΤϯϓγϣϯ
    ᶃ ϓϦΤϯϓγϣϯͷ࢓૊Έ
    ᶄ εέδϡʔϥͷ࣮૷
    ϥϯλΠϜ͕བྷΉॲཧ
    ϥϯλΠϜΛֶͿʹ͸

    View Slide

  62. スケジューラの大枠
    3. スケジューリングとプリエンプション
    (Pͷεέδϡʔϥ͕ߦͳ͍ͬͯΔ͜ͱ͸ɺʮ࣮ߦ͢Δ(ΛબఆʯˠʮׂΓ౰
    ͯʯͰ͢ɻ
    // 実行するGを探して、gpに入れる
    ग़యSVOUJNFQSPDHP
    // 割り当て

    View Slide

  63. 実行可能なGを探索(1/9) 〜 グローバルキューの確認
    3. スケジューリングとプリエンプション
    ग़యSVOUJNFQSPDHP
    1
    .
    (

    ( (
    TDIFE SVOR ( ( (
    ͨ·ʹνΣοΫ
    ·ͣ͸ɺʮάϩʔόϧΩϡʔʹ࣮ߦՄೳͳ(͕͋Δ͔ʯΛ֬ೝ͠·͢ɻ

    View Slide

  64. 実行可能なGを探索(2/9) 〜 グローバルキューの確認
    3. スケジューリングとプリエンプション
    ग़యSVOUJNFQSPDHP
    1
    .
    (

    ( (
    ·ͣ͸ɺʮάϩʔόϧΩϡʔʹ࣮ߦՄೳͳ(͕͋Δ͔ʯΛ֬ೝ͠·͢ɻ
    εέδϡʔϥ

    ࣍͸͜ΕΛ࣮ߦ͠Α͏
    TDIFE SVOR ( (
    (

    View Slide

  65. 実行可能なGを探索(3/9) 〜 ローカルキューの確認
    3. スケジューリングとプリエンプション
    ࣍ʹɺʮεέδϡʔϥ͕ಈ͍͍ͯΔ1ͷϩʔΧϧΩϡʔʹ࣮ߦՄೳͳ(͕͋Δ
    ͔ʯΛ֬ೝ͠·͢ɻ
    1
    .
    (

    ( (
    νΣοΫ
    ग़యSVOUJNFQSPDHP

    View Slide

  66. 実行可能なGを探索(4/9) 〜 ローカルキューの確認
    3. スケジューリングとプリエンプション
    ࣍ʹɺʮεέδϡʔϥ͕ಈ͍͍ͯΔ1ͷϩʔΧϧΩϡʔʹ࣮ߦՄೳͳ(͕͋Δ
    ͔ʯΛ֬ೝ͠·͢ɻ
    1
    .
    (

    (
    (
    εέδϡʔϥ

    ࣍͸͜ΕΛ࣮ߦ͠Α͏
    ग़యSVOUJNFQSPDHP

    View Slide

  67. 実行可能なGを探索(5/9) 〜 キューになかった場合
    3. スケジューリングとプリエンプション
    Ωϡʔதʹ࣮ߦՄೳͳ(͕ͳ͔ͬͨ৔߹͸ɺGJOESVOBCMFؔ਺Λ࣮ߦͯ͠ଞͰݟ
    ͚ͭʹ͍͘͜ͱʹͳΓ·͢ɻ
    1
    .
    (

    ۭ
    ۭ PSະνΣοΫ
    TDIFE SVOR
    ग़యSVOUJNFQSPDHP

    View Slide

  68. 実行可能なGを探索(6/9) 〜 キューを再確認
    3. スケジューリングとプリエンプション
    GJOESVOBCMFؔ਺ͷதͰ͸ɺ·ͣ͸άϩʔόϧΩϡʔͱϩʔΧϧΩϡʔͷνΣο
    Ϋ΋ߦ͍·͢ɻ
    ग़యSVOUJNFQSPDHP

    View Slide

  69. 実行可能なGを探索(7/9) 〜 ネットワークI/O待ちの確認
    3. スケジューリングとプリエンプション
    ͦͷ࣍ʹɺOFUQPMMʹͯʮ*0଴͕ͪऴΘ࣮ͬͯߦՄೳʹͳͬͨ(ʯ͕ͳ͍͔Ͳ͏
    ͔ΛνΣοΫ͠·͢ɻ
    1
    .
    (

    ۭ
    FQPMM
    Πϯ
    ελ
    ϯε
    *0ऴΘͬͨ(͕ͳ͍͔
    ໰͍߹Θͤ
    ग़యSVOUJNFQSPDHP

    View Slide

  70. 実行可能なGを探索(8/9) 〜 work-steal
    3. スケジューリングとプリエンプション
    ͦΕͰ΋ͳ͚Ε͹XPSLTUFBMͱݺ͹ΕΔڍಈΛ࣮ߦ͠·͢ɻ
    1
    .
    (

    ۭ
    1
    .
    (

    (
    ( ( ( (
    ग़యSVOUJNFQSPDHP

    View Slide

  71. 実行可能なGを探索(9/9) 〜 work-steal
    3. スケジューリングとプリエンプション
    ͦΕͰ΋ͳ͚Ε͹XPSLTUFBMͱݺ͹ΕΔڍಈΛ࣮ߦ͠·͢ɻ
    1
    .
    (

    (
    ( (
    1
    .
    (

    ( (
    εέδϡʔϥ

    ๩͍͠1͔Β(ΛԣऔΓ͢Δ
    ग़యSVOUJNFQSPDHP

    View Slide

  72. スケジューラの大枠(再掲)
    3. スケジューリングとプリエンプション
    ࣮ߦ͢Δ(ΛܾΊͨͱ͜ΖͰɺࠓ౓͸ͦΕΛ࣮ࡍʹFYFDVUF͢Δͱ͜ΖΛ֬ೝ͠
    ͯΈ·͢ɻ
    // 実行するGを探して、gpに入れる
    ग़యSVOUJNFQSPDHP

    View Slide

  73. 選んだGを実行させる(1/2)
    3. スケジューリングとプリエンプション
    1
    .
    (

    (
    ( (
    (
    (ͱ.Λ݁߹
    ग़యSVOUJNFQSPDHP

    View Slide

  74. 選んだGを実行させる(2/2)
    3. スケジューリングとプリエンプション
    1
    .
    (

    (
    ( (
    (ͷεςʔλεΛ
    (SVOOBCMF͔Β(SVOOJOH΁
    ग़యSVOUJNFQSPDHP

    View Slide

  75. スケジューリングまとめ
    3. スケジューリングとプリエンプション
    l εέδϡʔϦϯάʹख͖͢ͷ.ʹ৽ͨͳ(Λ͕͋ͯ͏
    l TDIFEVMFؔ਺ʹΑΔ৽͍͠(ͷ୳͠ํ͸ҎԼ
    ○ άϩʔόϧΩϡʔ ˠ ϩʔΧϧΩϡʔ
    ˠ ωοτϫʔΫ*0଴ͪ ˠ XPSLTUFBM
    l (Λ୳͖ͯͨ͠ޙʹɺFYFDVUFؔ਺ʹ࣮ͯࡍʹ(.Λ݁߹ͤ͞Δ࡞ۀΛߦ͏

    View Slide

  76. アジェンダ
    ϥϯλΠϜͱ͸
    (PϥϯλΠϜͷίϯϙʔωϯτ
    εέδϡʔϦϯάͱϓϦΤϯϓγϣϯ
    ϥϯλΠϜ͕བྷΉॲཧ
    ϥϯλΠϜΛֶͿʹ͸
    ষ ষ
    1 . (
    SVOUJNFύοέʔδ
    1 . (
    SVOUJNFύοέʔδ
    ར༻

    View Slide

  77. G,M,Pが絡む処理
    4. ランタイムが絡む処理
    ࣮ߦޮ཰Λ্͛ΔͨΊʹɺҎԼͷॲཧ͸( . 1͕བྷΉ͜ͱ͕ଟ͍ɻ
    SVOUJNFʹΑΔ( . 1ૢ࡞͕ൃੜ͢Δॲཧ
    γεςϜίʔϧͷݺͼग़͠ ωοτϫʔΫ*0
    PT0QFOؔ਺ʹΑͬͯ
    γεςϜίʔϧPQFO͕
    ཪͰݺ͹ΕΔ DPOO3FBEϝιουͷ࣮ߦͰ
    ड৴଴ػঢ়ଶʹͳΔ

    View Slide

  78. G,M,Pが絡む処理
    4. ランタイムが絡む処理
    ࣮ߦޮ཰Λ্͛ΔͨΊʹɺҎԼͷॲཧ͸( . 1͕བྷΉ͜ͱ͕ଟ͍ɻ
    SVOUJNFʹΑΔ( . 1ૢ࡞͕ൃੜ͢Δॲཧ
    γεςϜίʔϧͷݺͼग़͠ ωοτϫʔΫ*0
    PT0QFOؔ਺ʹΑͬͯ
    γεςϜίʔϧPQFO͕
    ཪͰݺ͹ΕΔ DPOO3FBEϝιουͷ࣮ߦͰ
    ड৴଴ػঢ়ଶʹͳΔ

    View Slide

  79. G,M,Pの付け替えイメージ(1/2)
    4. ランタイムが絡む処理
    γεςϜίʔϧݺͼग़͠ʹ͸͕͔͔࣌ؒΔͨΊɺݺͼग़͠தʹผͷ࣮ߦՄೳͷ(
    Λಈ͔ͨ͠ํ͕ޮ཰͕͍͍ͷͰ͢ɻ
    1
    .
    (

    (
    ( (
    γεςϜίʔϧͷݺͼग़͠

    View Slide

  80. G,M,Pの付け替えイメージ(2/2)
    4. ランタイムが絡む処理
    γεςϜίʔϧݺͼग़͠ʹ͸͕͔͔࣌ؒΔͨΊɺݺͼग़͠தʹผͷ࣮ߦՄೳͷ(
    Λಈ͔ͨ͠ํ͕ޮ཰͕͍͍ͷͰ͢ɻ
    1
    .
    (

    (
    ( (
    ݺͼग़͠தͷ( .Λ
    ੾Γ཭͠
    .
    ผͷ.Λ͚ͭΔ

    View Slide

  81. システムコールの呼び出し 〜 Mの切り離し(1/6)
    4. ランタイムが絡む処理
    γεςϜίʔϧݺͼग़࣌͠ʹݺ͹ΕΔTZTDBMM4ZTDBMMͷ࣮ଶ͸ɺSVOUJNFύοέ
    ʔδ಺ʹ͋Γ·͢ɻ
    ग़య[email protected]

    View Slide

  82. システムコールの呼び出し〜 Mの切り離し(2/6)
    4. ランタイムが絡む処理
    [email protected]ͷޙ͸ɺFOUFSTZTDBMMˠSFFOUFSTZTDBMMͷॱʹؔ਺͕ݺͼग़͞Ε
    ·͢ɻ
    ग़యSVOUJNFQSPDHP

    View Slide

  83. システムコールの呼び出し〜 Mの切り離し(3/6)
    4. ランタイムが絡む処理
    1
    .
    (

    (
    ( (
    SFFOUFSTZTDBMMؔ਺தͰɺ( .ͷ੾Γ཭͕͠ߦΘΕ·͢ɻ
    .ͱ1Λ੾Γ཭͢
    γεςϜίʔϧͷݺͼग़͠
    ग़యSVOUJNFQSPDHP

    View Slide

  84. システムコールの呼び出し 〜 新規Mの割り当て(4/6)
    4. ランタイムが絡む処理
    ৗ࣌Քಇ͍ͯ͠ΔTZTNPOͷதͰɺSFUBLFؔ਺͕ݺ͹Ε͍ͯ·͢ɻ ࠶ܝ

    .
    TZTNPO

    (
    1
    .
    (

    (
    ( (
    ग़యSVOUJNFQSPDHP

    View Slide

  85. システムコールの呼び出し 〜 新規Mの割り当て(5/6)
    4. ランタイムが絡む処理
    SFUBLFؔ਺ͷதͰ͸ɺϓϦΤϯϓτؔ਺ͷଞʹ΋IBOEPGGQؔ਺ͱ͍͏΋ͷ͕ݺ
    ͹Ε͍ͯͯɺ͔ͦ͜Β࠷ऴతʹTUBSUN͕ݺ͹Ε͍ͯ·͢ɻ
    ग़యSVOUJNFQSPDHP

    View Slide

  86. システムコールの呼び出し 〜 新規Mの割り当て(6/6)
    4. ランタイムが絡む処理
    ͦͷTUBSUNؔ਺ͷதͰɺ1ʹ৽͍͠.Λ͕͍͋ͯͬͯ·͢ɻ
    1
    .
    (

    (
    ( (
    .
    ֎͞Εͨ.ͷ୅ΘΓʹ
    ৽͍͠.͕͕͋ͯ͏
    .
    TZTNPO

    (
    ग़యSVOUJNFQSPDHP

    View Slide

  87. アジェンダ
    ϥϯλΠϜͱ͸
    (PϥϯλΠϜͷίϯϙʔωϯτ
    εέδϡʔϦϯάͱϓϦΤϯϓγϣϯ
    ϥϯλΠϜ͕བྷΉॲཧ
    ϥϯλΠϜΛֶͿʹ͸

    View Slide

  88. Goランタイムの要素はGとMとP – by 公式Doc
    5. ランタイムを学ぶには
    SVOUJNFύοέʔδ಺ʹ)"$,*/(NEʹ͸ɺ͔֬ʹʮ( . 1Λίϯτϩʔϧ͢
    Δͷ͕(PϥϯλΠϜͷ࢓ࣄͩʯͱॻ͔Ε͍ͯ·͢ɻ
    5IFTDIFEVMFSNBOBHFTUISFFUZQFTPGSFTPVSDFTUIBUQFSWBEFUIFSVOUJNF
    (T .T BOE1T

    εέδϡʔϥͷ໾ׂ͸(PϥϯλΠϜΛࢧ͑ΔҎԼͭͷϦιʔεΛ؅ཧ͢Δ͜ͱͰ͋Δɻ
    Ұͭ͸( ΋͏Ұͭ͸. ͦͯ͠࠷ޙʹ1Ͱ͋Δɻ
    SVOUJNF)"$,*/(NE
    ϥϯλΠϜΛཧղ͢Δʹ͸ɺ( . 1ͭΛཧղ͍ͯ͠Ε͹े෼ʁ

    View Slide

  89. G,M,Pで行う動きはたくさんある
    5. ランタイムを学ぶには
    ͔֬ʹɺ(PϥϯλΠϜͷதͰߦΘΕΔॲཧ͸ɺ΄ͱΜͲ( . 1͕བྷΉ΋ͷ͹͔
    ΓͰ͢ɻ
    γεςϜίʔϧͷݺͼग़͠
    ( . 1ૢ࡞ͷ۩ମྫ
    ϓϦΤϯϓγϣϯ εέδϡʔϦϯά
    1
    . (
    ( (
    .
    1
    . (
    ( (
    1
    . (
    ( (

    View Slide

  90. つまずきポイント1: だけどそのG,M,Pを動かしているのは誰
    5. ランタイムを学ぶには
    ͕ͨΑ͘Α͘ߟ͑ͯΈΔͱɺ͜ΕΒͭͷಈ͖Λ( . 1͚ͩͰ੾ΓऔͬͯΈͯΈ
    Δͱɺ৭ʑͱٙ໰఺͕ଟ͔ͬͨͷͰ͢ɻ
    γεςϜίʔϧͷݺͼग़͠
    ( . 1ૢ࡞ͷ۩ମྫ
    ϓϦΤϯϓγϣϯ εέδϡʔϦϯά
    1
    . (
    ( (
    .
    1
    . (
    ( (
    1
    . (
    ( (
    (ͷ੾Γ཭͠͸୭͕΍Δͷʁ
    ͜ͷ(.ඥ෇͚Λ΍͍ͬͯ
    ͏ͷ͸Ͳ͜ͷ୭ʁ
    ( . 1Λಈ͔͢ओମ͕Կͳͷ͔ʹ͍ͭͯԿ΋આ໌͕ͳ͍ʂ

    View Slide

  91. Goランタイム勉強して散々苦しんだ人の心の叫び
    5. ランタイムを学ぶには
    ( . 1ͷཁૉ͚ͩͰ
    આ໌Λࡁ·ͤΑ͏ͱ͢Δͷ͸΍Ίͯ͘Εʂʂ

    View Slide

  92. 苦労した上で得た感想
    5. ランタイムを学ぶには
    ( . 1ΛͲ͔͜Βௐୡ͖ͯͯ͠Ͳ͜ʹ֨ೲ͢Δͷ͔ɺͦΕΛ΍Δͷ͸୭ͳͷ͔ɺ
    ͱ͍͏࿩͸͜ͷཁૉ͚ͩͰ͸ऩ·Βͳ͍ͷͰ͸ʁͱ͍͏ײ૝Λ๊͖·ͨ͠ɻ
    γεςϜίʔϧͷݺͼग़͠
    ( . 1ૢ࡞ͷ۩ମྫ
    ϓϦΤϯϓγϣϯ εέδϡʔϦϯά
    1
    . (
    ( (
    .
    1
    . (
    ( (
    1
    . (
    ( (
    (ͷ੾Γ཭͠͸୭͕΍Δͷʁ
    ͜ͷ(.ඥ෇͚Λ΍͍ͬͯ
    ͏ͷ͸Ͳ͜ͷ୭ʁ
    TZTNPO͕΍Δ
    ˠ͜ͷޙ
    άϩʔόϧΩϡʔʹೖΔ
    (͕΍Δ
    άϩʔόϧΩϡʔ౳͔Β
    ୳ͯ͘͠Δ

    View Slide

  93. 提言1: Goランタイムの部品は6つ
    5. ランタイムを学ぶには
    ϥϯλΠϜͷڍಈΛޠΔ্Ͱ܁Γฦ͠ొ৔͢Δ֓೦͸ɺ( . 1͚ͩʹݶΒͳ͍ɻ
    ໾ׂ
    ΰʔϧʔνϯ
    (
    .
    1
    04εϨου
    ࣮ߦϦιʔεɺԾ૝$16
    ུশ ໾ׂ
    ϥϯλΠϜશମͷঢ়ଶ؅ཧ
    TDIFE
    TZTNPO
    (
    γεςϜϞχλ
    εέδϡʔϥͷ࣮ଶ
    ུশ
    (
    .
    1
    ( ( (
    .
    TZTNPO

    (
    (

    View Slide

  94. つまずきポイント2: 似たような動きがいっぱい出てくる
    5. ランタイムを学ぶには
    ( . 1Λ෇͚ͨΓ֎ͨ͠Γ͢Δಈ͖͕ࢁͷΑ͏ʹग़͖ͯͯɺͻͨ͢Βࠞཚ͠·͠
    ͨɻ
    γεςϜίʔϧͷݺͼग़͠
    ( . 1ૢ࡞ͷ۩ମྫ
    ϓϦΤϯϓγϣϯ εέδϡʔϦϯά
    1
    . (
    ( (
    .
    1
    . (
    ( (
    1
    . (
    ( (
    ͔͠΋͜Ε͸(ͷબͼํ·Ͱ
    ߟ͑ͳ͖Ό͍͚ͳ͍

    View Slide

  95. 何でこんなことになってるのか
    5. ランタイムを学ぶには
    (P౰࣌ͷεέδϡʔϥEFTJHO%PDͷఏҊ͕ʮ1Λಋೖˠͦ͏͢Δͱγες
    Ϝίʔϧݺͼग़͠͸͜͏ͳΔʯͱ͍͏࿦ௐͩͬͨͩͬͨͷͰɺͦΕ͕࢒͍ͬͯΔɻ
    l (P4DBMBCMF(P4DIFEVMFS%FTJHO%PD
    ○ ҙ༁ͦͷ

    ϥϯλΠϜʹ1Λ৽͘͠࡞Ζ͏ͥ
    ○ ҙ༁ͦͷ

    1ಋೖͨ͠Βɺྫ͑͹γεςϜίʔϧݺͼग़͠͸͜͏࣮૷͞ΕΔΑ
    l .PSTJOHbT#MPHd5IF(PTDIFEVMFS ༗໊ͳ(.1ਤΛࡌͤͨϒϩά

    ○ γεςϜίʔϧ࣌ͷਤΛࡌͤΔ
    ○ TUFBMXPSL࣌ͷਤΛࡌͤΔ

    View Slide

  96. 提言2: ランタイムの機能と挙動は分けて考えませんか
    5. ランタイムを学ぶには
    ʮ෦඼ͦͷ΋ͷͷಈ͖ʯͳͷ͔ʮ෦඼Λ࢖ͬͨಈ͖ʯͳͷ͔ͱ͍͏໨ઢͰΈΔͱɺ
    ࣅͨ֓೦͕੔ཧ͞Ε͍͍ͯΜ͡Όͳ͍Ͱ͠ΐ͏͔ɻ
    γεςϜίʔϧͷݺͼग़͠ ϓϦΤϯϓγϣϯ εέδϡʔϦϯά
    (Λ࣮ߦ͍ͯ͠ͳ͍.ʹ
    ৽͍͠(ׂ͕Γ౰ͯΒΕΔ
    γεςϜίʔϧʹ൐͍
    .ͷ෇͚ସ͕͑ߦΘΕΔ
    TZTNPOͰϑϥάΛ͚ͭͯ
    ͋ΔλΠϛϯάͰ
    .͔Βͷ੾Γ཭͕͠ߦΘΕΔ
    1
    .
    (
    (
    ( (
    . 1
    .
    (
    (
    ( (
    1
    .
    (
    (
    ( (
    ϥϯλΠϜͷػೳ
    ϥϯλΠϜͷڍಈ

    View Slide

  97. ຊηογϣϯͷ·ͱΊ

    View Slide

  98. 1章 ランタイムとは
    l (PϥϯλΠϜϓϩάϥϜΛಈ͔͢ͷʹඞཁͳࡉʑͱͨ͠ॲཧΛɺਓͷ୅Θ
    ΓʹҾ͖ड͚ͯ͘ΕΔՕॴ
    ϝϞϦͷׂΓ౰ͯ
    intܕͭΛ֨ೲ͢ΔϝϞϦ͸
    ࣗಈͰ֬อ͞ΕΔ
    ஫$ݴޠͩͱmallocͳͲͰ
    ໌ࣔతʹ֬อ͢Δඞཁ͋Γ
    (PϥϯλΠϜͷ໾ׂ
    ΨϕʔδίϨΫτ εέδϡʔϦϯά
    ࢖͍ऴΘͬͨม਺arrayͷ
    ϝϞϦղ์͸ࣗಈͰߦΘΕΔ
    ஫$ݴޠͩͱfreeͰ
    ໌ࣔతʹղ์͢Δඞཁ͋Γ
    ฒߦͳؔ਺Λ࣮ࡍʹͲͷλΠ
    ϛϯάͰಈ͔͢ͷ͔͸ࣗಈͰ
    ௐ੔͞ΕΔ

    View Slide

  99. 2章 Goランタイムのコンポーネント
    l (PϥϯλΠϜʹ͸ͭͷίϯϙʔωϯτ͕͋Γ·͢ɻ
    ໾ׂ
    ΰʔϧʔνϯ
    (
    .
    1
    04εϨου
    ࣮ߦϦιʔεɺԾ૝$16
    ུশ ໾ׂ
    ϥϯλΠϜશମͷঢ়ଶ؅ཧ
    TDIFE
    TZTNPO
    (
    γεςϜϞχλ
    εέδϡʔϥͷ࣮ଶ
    ུশ
    (
    .
    1
    ( ( (
    .
    TZTNPO

    (
    (

    View Slide

  100. 3章 スケジューリングとプリエンプション
    l εέδϡʔϦϯά(ͱ.Λͭͳ͛Δ
    l ϓϦΤϯϓγϣϯ(ͱ.Λ੾Γ཭͢
    l ͲͪΒ΋(PϥϯλΠϜ͕ߦ͏ػೳͰ͢
    γεςϜίʔϧͷݺͼग़͠
    ( . 1ૢ࡞ͷ۩ମྫ
    ϓϦΤϯϓγϣϯ εέδϡʔϦϯά
    1
    . (
    ( (
    .
    1
    . (
    ( (
    1
    . (
    ( (

    View Slide

  101. 4章 ランタイムが絡む処理
    l ( . 1ͷ੾Γ཭͢ɾͭͳ͛Δ࡞ۀ͸ɺϓϩάϥϜ࣮ߦޮ཰Λ্͛ΔͨΊʹߦ
    ΘΕΔ͜ͱ͕͋Δ
    l ͜ͷૢ࡞ʹ͸(PϥϯλΠϜ͕ີ઀ʹབྷΜͰ͍Δ
    γεςϜίʔϧͷݺͼग़͠
    ( . 1ૢ࡞ͷ۩ମྫ
    ϓϦΤϯϓγϣϯ εέδϡʔϦϯά
    1
    . (
    ( (
    .
    1
    . (
    ( (
    1
    . (
    ( (

    View Slide

  102. ΈΜͳSVOUJNFύοέʔδΛಡ΋͏ ɾТɾ
    ϊγ
    ࢲͷ͜ͱ͸ݏ͍Ͱ΋(PϥϯλΠϜ͚ͩ͸ݏ͍ʹͳΒͳ͍Ͱ͍ͩ͘͞ খ੠

    View Slide

  103. 5IBOLZPVGPSMJTUFOJOH

    View Slide