Slide 1

Slide 1 text

Boost.Asio ೖ໳ @syu_cream

Slide 2

Slide 2 text

ΞδΣϯμ Boost.Asio ͷ঺հ جຊతͳಛ௃ ΠϕϯτۦಈͱBoost.Asio εϨουͱBoost.Asio ίϧʔνϯͱBoost.Asio (༨༟͕͋Ε͹)αϯϓϧίʔυಡΈ (ߋʹ༨༟͕͋Ε͹)झຯͰॻ͍͍ͯΔ HTTP/2 ؆қ࣮૷ʹ͍ͭͯ

Slide 3

Slide 3 text

Boost.Asio ͱ͸ Boost ͷඇಉظωοτϫʔΫ௨৴ϥΠϒϥϦ ΠϕϯτۦಈI/Oͷαϙʔτ ϓϥοτϑΥʔϜͷࠩҟΛٵऩͯ͘͠ΕΔ ಉظ௨৴΋αϙʔτ

Slide 4

Slide 4 text

Asio Ͱαϙʔτ͢Δ௨৴ αϙʔτ͢Δϓϩτίϧͷछྨ TCP/UDP/ICMP ιέοτ γϦΞϧϙʔτ UNIX Domain Socket

Slide 5

Slide 5 text

Πϕϯτۦಈͱ Boost.Asio

Slide 6

Slide 6 text

Πϕϯτۦಈ I/O ಉ࣌ʹෳ਺ͷ I/O Λॲཧ͢ΔϞσϧ I/Oͷ׬ྃΛݕग़͢ΔΠϕϯτϧʔϓΛ࣋ͭ I/O׬ྃ࣌ʹΠϕϯτϋϯυϥΛ࣮ߦ͢Δ ! " !! !! !! ①"I/O" ! ! " ②"I/O"" !! ③!! "

Slide 7

Slide 7 text

Proactor pattern ΠϕϯτۦಈI/OΛ࣮ݱ͢ΔσβΠϯύλʔϯͷҰछ Πϕϯτϧʔϓͱϋϯυϥͷ࣮૷Λ෼཭ લऀ͸OSͷػೳ(select, poll, epoll/kqueueͳͲ)Λར༻ ޙऀ͸ࣗલͰ࣮૷ɻඞཁͳΒεϨουͰฒྻॲཧɻ

Slide 8

Slide 8 text

Boost.Asio ʹ͓͚Δ Proactor io_service ΦϒδΣΫτΛհͯ͠ I/O Λॲཧ͢Δ $:@.>< 8A7> I/O$+91*-6$ (:$3/46) io_service +;?B5)A.025< ①$I/O+9 1*-6 ② 8A7> " ③io_service$(run() !( ④$I/O$ ( ⑤$I/O % ,=B#'& io_service$'( ⑥I/O$( 8A7>#&$

Slide 9

Slide 9 text

io_service Boost.Asio ͷ௨৴ͷཁͱͳΔΦϒδΣΫτ Πϕϯτϧʔϓͷ࣮ߦ εϨουϓʔϧͷ؅ཧ OS ͷΠϕϯτ௨஌ػߏΛݺͼग़͠ ׬ྃϋϯυϥͷݺͼग़͠

Slide 10

Slide 10 text

io_service ͷૢ࡞ io_service::run() ΠϕϯτॲཧϧʔϓΛϒϩοΩϯά࣮ͯ͠ߦ io_service::poll() ΠϕϯτॲཧϧʔϓΛϒϩοΩϯάͤͣʹ࣮ߦ io_service::post() Ωϡʔʹॲཧ͢΂͖ϋϯυϥΛ௥Ճ io_service::dispatch() ʢՄೳͰ͋Ε͹ʣ౉ͨ͠ϋϯυϥΛଈ࠲ʹ࣮ߦ

Slide 11

Slide 11 text

Asio ʹΑΔඇಉظTCP௨৴ boost::asio::ip::tcp::socket TCPιέοτΛදݱ͢Δ I/O ΦϒδΣΫτ boost::asio::async_connect ඇಉظʹ connect ͢Δ boost::asio::ip::tcp::socket::async_accept ඇಉظʹ accept ͢Δ boost::asio::async_(read | write) ඇಉظʹ read/write ͢Δ

Slide 12

Slide 12 text

εϨουͱ Boost.Asio

Slide 13

Slide 13 text

εϨουͱͷؔ܎ εϨουϓʔϧ ׬ྃϋϯυϥͷॲཧΛ؆୯ʹϚϧνεϨουԽՄೳ io_service::run() Λෳ਺εϨου͔Βݺͼग़͢ͱε Ϩουϓʔϧ͕ߏங͞ΕΔ ಺෦εϨου ϗετ໊ղܾͳͲϥΠϒϥϦ಺ͰฒྻԽ͞ΕΔ

Slide 14

Slide 14 text

ίϧʔνϯͱ Boost.Asio

Slide 15

Slide 15 text

׬ྃϋϯυϥͷ࣮૷1: ී௨ʹίʔϧόοΫؔ਺Λఆٛ ఆ൪ͷ׬ྃϋϯυϥͷॻ͖ํ ͨͩ͠ίʔυͷݟ௨͠͸ѱ͘ͳΔɻ

Slide 16

Slide 16 text

׬ྃϋϯυϥͷ࣮૷2: ແ໊ؔ਺Λ࢖͏ ؔ࿈͢Δॲཧͷهड़Λू໿Ͱ͖Δ ͔͠͠ɺωετ͕ਂ͘ͳΔɻ

Slide 17

Slide 17 text

׬ྃॲཧͱίϧʔνϯ ௨৴ॲཧ͸ஞ࣍తʹهड़ग़དྷͨํ͕௚ײత ෳ਺ճͷର࿩Λཁ͢Δϓϩτίϧ͠Ό΂Δ৔߹ͳͲ ॲཧ͕ෳࡶʹͳΔͱίʔϧόοΫ஍ࠈʹؕΔ ! Boost 1.53 ͔ΒBoost.Coroutine Λαϙʔτʂ ஞ࣍ॲཧͬΆ͘ඇಉظ௨৴ॲཧ͕هड़Ͱ͖Δ

Slide 18

Slide 18 text

׬ྃϋϯυϥͷ࣮૷3: ελοΫϨείϧʔνϯ Boost.Coroutine Λ࢖ͬͯஞ࣍ॲཧతʹهड़ reenter() ʹίϧʔνϯͰ࣮ߦ͢ΔॲཧΛهड़ I/O ͢Δࡍ͸ yield ͰίϯςΩετΛ”ৡΔ” reenter() ֎ʢؔ਺ݺͼग़͠ઌͳͲʣͰ͸ yield Ͱ͖ͳ͍͜ͱʹ஫ҙ

Slide 19

Slide 19 text

׬ྃϋϯυϥͷ࣮૷4: ελοΫϑϧίϧʔνϯ boost::asio::spawn() ʹίϧʔνϯΛ౉͚ͩ͢ Boost.Coroutine ͷهड़Λҙࣝ͠ͳͯ͘ྑ͘ͳΔ ελοΫϨείϧʔνϯͱҧ͍ɺݺͼग़͠ઌͷؔ਺಺Ͱ yield Մೳ yield_context Λ఻ൖ͢Δඞཁ͸͋Δ

Slide 20

Slide 20 text

·ͱΊ Boost.Asio ͸ඇಉظ I/O ॲཧͷهड़ʹศར ΠϕϯτۦಈɺϓϥοτϑΥʔϜඇґଘͷ هड़ΛӅṭՄೳ ඇಉظॲཧͷهड़΋ൺֱత༰қ