Skip to content

Instantly share code, notes, and snippets.

@tawashichan
Last active December 9, 2019 04:38
Show Gist options
  • Save tawashichan/d59e7338da06a11d2bf20636f2e77e46 to your computer and use it in GitHub Desktop.
Save tawashichan/d59e7338da06a11d2bf20636f2e77e46 to your computer and use it in GitHub Desktop.
tokio_memo
  • tokioにはsingle thread schedulerとmulti thread schedulerがある

    • single thread scheduler
      • 中にSchedulerPrivというものが入っていて、これが実質的なスケジューリングをしているっぽい。

      • MpscQueueで管理(Multi-Provider-Single-Consumer-Queue)

      • parkとunparkってなんなんだ〜〜〜

        • tokio_executor曰く,現在のスレッドのブロッキングやアンプロッキングの抽象化らしい。
          • blocked parkはunparkによってunblockされるらしい。すなわちparkするとThreadはsleepする。
            • Tokio Reactorはmio::Pollを呼んでいるらしい。
        • ParkerとUnParkerが存在し、それぞれArcという定義になっている。
          • InnerにはMutexやShared,CondVarなどが入っている。
            • SharedはsharedDriverやhandleが入っている。handleはunparkするためにあるらしい。
        • util内部で定義されているTryLockを使っている。
      • 起動

        • newでparkをunparkしている(これなんぞ?)(スレッド間の同期に関する処理?)
          • ParkerとUnParkerが存在し、それぞれArcという定義になっている。
            • InnerにはMutexやShared,CondVarなどが入っている。
              • SharedはsharedDriver(?)やhandleが入っている(これ何するためのものだ?)
          • unparkしたものをBasicSchedulerに詰めて返している。
            • LocalStateにparkを,schedulerにunparkを入れている。
              • tickってなんぞ?
              • この動作の意味は?
            • queueの初期化もここ
        • spawnでtask::joinHandleを生成(生成時taskとhandleが返ってくる),scheduler.scheduleにtaskを渡してからhandleを返している。
          • joinHandleの役割とは?
        • block_onでFutureを受け取り、pollする。
          • thread_local変数のACTIVEって何しているんだろう。
          • wakerのdata部分にschedulerを突っ込んでraw_wakerを生成、contextに突っ込んでpoll。
          • 実行後にtickする(これなんだろう)
            • localのtickをwrapping_add(1)している(桁あふれすると0に戻る?タスク増えても死なないように?)
              • queueからnext_taskでtaskを確認。
                • next_taskでは、remote_queueかlocal_queueからtaskを取得している(remote_queueってなんだ?)
                  • 基本的にlocal_queueを確認するようになっているが、定期的にremote_queueも見るようになっている。
              • taskを取得後、taskがあるか確認。あればtask変数に詰める。なければlocalのparkにpark()を適用。
              • 取得したtaskをrunする。runした後、戻り値のtaskが存在すればを再びqueueに詰める。
                • 終了したtaskはNoneを返す?
            • tickはremote_taskを定期的に確認しにいくためのカウンタとして機能している。
            • これをMAX_TASK_PER_TICK(61)回繰り返す。
            • その後でlocal.parkを実行。
          • その後pending taskを粛清?
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment