Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
軽量なスレッドとは?
Search
ryo takaya
October 12, 2023
150
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
軽量なスレッドとは?
ryo takaya
October 12, 2023
More Decks by ryo takaya
See All by ryo takaya
並行処理(超入門)
ryotakaya
0
18
PHP8.0へのバージョンアップ始めました
ryotakaya
0
780
Featured
See All Featured
Crafting Experiences
bethany
1
310
The Curious Case for Waylosing
cassininazir
1
500
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Faster Mobile Websites
deanohume
310
32k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.5k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Mind Mapping
helmedeiros
1
350
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
440
Transcript
軽量なスレッドとは?
• バックエンドエンジニア • 普段はPHPを書くことが多いです • 最近はチーム(スクラム)について考える事も多し 高谷 遼
今回話す事 goroutineが軽量なスレッドと言われる所以 今回話さない事 goroutineの使用方法
A goroutine is a lightweight thread managed by the Go
runtime. 出典:https://go.dev/tour/concurrency/1
軽量なスレッド? 何がスレッドより軽いの?
そもそもスレッドとgoroutineとは - スレッド(thread) - コンピュータプログラムにおいて特定の処理を行うための一貫性のある命令の流れのことであり、プロセッサ利用の最小単位 (引 用:https://en.wikipedia.org/wiki/Thread_(computing)) - goroutine -
goroutineはGoのプログラムでの最も基本的な構成単位。 - Goのプログラムでは最低でも必ず一つの goroutineが動作している - OSのスレッドでは無いけど必ずしもグリーンスレッド (ユーザー空間で動くスレッド )でも無い。コルーチンの一 種。(出典: go言語による並行処理 ) - サブルーチンがエントリーからリターンまでを一つの処理単位とするのに対し、コルーチンはいったん処理を中断し た後、続きから処理を再開できる。 (引用 : https://en.wikipedia.org/wiki/Coroutine)
軽量なスレッドと呼ばれる要因は主に二つ - メモリの消費量の違い - コンテキストスイッチのオーバーヘッドが抑えられる
メモリの消費量の違い スレッド - スタックサイズは数MB(固定長) - スレッドが発生する度にガードページが発生する - メモリ領域の隣接部分に配置され、その領域を実際のデータ保存には使用しません。代わりに、アプリケーションがその領 域をアクセスしようとした際に、アクセス違反例外を発生させてプログラムの実行を停止させることで、バッファーオーバーフ ローやスタックオーバーフローを検出する役割を果たします。(by
chatGPT) - スレッドはどれくらいのスタックサイズが必要か予測するのが難しいので大きめに確保し てガードページにアクセスしないようにする
メモリの消費量の違い goroutine - 初期のスタックサイズは2KB(可変長) - ガードページを使用しない - Goのランタイムが適切なスタックサイズかいい感じにチェックしてくれる - もし十分なサイズがあるならそのまま関数が実行される
- スタックが足りないならより大きいサイズをヒープ領域から確保してその 領域に現在の内容をコピーして関数を実行。古い内容は破棄される。
コンテキストスイッチのオーバーヘッドが抑えられる コンテキストスイッチとは - 複数のプロセス(or スレッド)が1つのCPUを共有できるように、CPUの状態(コンテキスト (情報工学))を保存したり復元したりする過程のことである。 - コンテキストスイッチが発生するタイミング - マルチタスキング
- 割り込みの発生 - ユーザーモードとカーネルモードの切り替え (出典: https://en.wikipedia.org/wiki/Context_switch) - コンテキストスイッチのオーバーヘッドを抑えられるとよさそうな気がする...
コンテキストスイッチのオーバーヘッドが抑えられる Goのアプローチ - スレッドのモデルには3種類のモデルがある - 1:1 - N:1 - M:N
- Goが採用しているのはM:Nモデル - メリット : スレッドの切り替えによるコンテキストスイッチが抑えられる - デメリット : スケジューリングが複雑になる - Goランタイムのgoroutineのスケジューリングについては以下が詳しいのでご興味があれ ば! - https://rakyll.org/scheduler/
None