Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
マルチスレッドの実現方法 ~カーネルスレッドとユーザスレッド~
Search
Satoru Takeuchi
PRO
April 13, 2025
Technology
2
320
マルチスレッドの実現方法 ~カーネルスレッドとユーザスレッド~
以下動画のテキストです
https://youtu.be/3FzWDsJlB-8
Satoru Takeuchi
PRO
April 13, 2025
Tweet
Share
More Decks by Satoru Takeuchi
See All by Satoru Takeuchi
eBPF
sat
PRO
1
91
waruiBPF
sat
PRO
0
84
eBPFとwaruiBPF
sat
PRO
4
2.6k
Pythonのコードの気になる行でスタックトレースを出す
sat
PRO
0
86
ソースコードを読むときの思考プロセスの例 ~markdownのレンダリング方法を知りたかった2 markdownパッケージ~
sat
PRO
0
170
様々なファイルシステム
sat
PRO
0
310
ソースを読む時の思考プロセスの例-MkDocs
sat
PRO
1
410
ソースを読むプロセスの例
sat
PRO
22
17k
メモリマップトファイル
sat
PRO
1
160
Other Decks in Technology
See All in Technology
モダンデータスタック (MDS) の話とデータ分析が起こすビジネス変革
sutotakeshi
0
500
[デモです] NotebookLM で作ったスライドの例
kongmingstrap
0
150
「図面」から「法則」へ 〜メタ視点で読み解く現代のソフトウェアアーキテクチャ〜
scova0731
0
180
第4回 「メタデータ通り」 リアル開催
datayokocho
0
130
MLflowダイエット大作戦
lycorptech_jp
PRO
1
120
Database イノベーショントークを振り返る/reinvent-2025-database-innovation-talk-recap
emiki
0
180
生成AI時代におけるグローバル戦略思考
taka_aki
0
190
「Managed Instances」と「durable functions」で広がるAWS Lambdaのユースケース
lamaglama39
0
320
2025年 開発生産「可能」性向上報告 サイロ解消からチームが能動性を獲得するまで/ 20251216 Naoki Takahashi
shift_evolve
PRO
1
160
Challenging Hardware Contests with Zephyr and Lessons Learned
iotengineer22
0
220
因果AIへの招待
sshimizu2006
0
980
ガバメントクラウド利用システムのライフサイクルについて
techniczna
0
190
Featured
See All Featured
Building Flexible Design Systems
yeseniaperezcruz
330
39k
How GitHub (no longer) Works
holman
316
140k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.1k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Making the Leap to Tech Lead
cromwellryan
135
9.7k
Faster Mobile Websites
deanohume
310
31k
Side Projects
sachag
455
43k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
970
Fireside Chat
paigeccino
41
3.7k
The Pragmatic Product Professional
lauravandoore
37
7.1k
Building Applications with DynamoDB
mza
96
6.8k
Optimising Largest Contentful Paint
csswizardry
37
3.5k
Transcript
マルチスレッドの実現方法 ~カーネルスレッドとユーザスレッド~ Apr. 13rd, 2025 Satoru Takeuchi X: satoru_takeuchi 1
はじめに • マルチスレッドを実現する方法は複数ある • 基本となるのは以下2つ ◦ カーネルスレッド: カーネル空間で実現 ◦ ユーザスレッド:
ユーザ空間で実現 • 📝 ここでいう「カーネルスレッド」は「カーネルの処理をするスレッド (psで”[kthreadd]”のように名前が”[” と”]”に囲まれているもの )」という意味でのカーネルスレッドとは別の概念 2
カーネルスレッド • スレッドごとにカーネルのスケジューリング単位が存在する ◦ このスケジューリング単位のことを LWP(Light Weight Process)と呼ぶ ▪ シングルスレッドプロセスは
LWPが1つだけ存在 ▪ マルチスレッドプロセスは LWPが2つ以上存在 • カーネルが提供する機能なのでシステムコールを発行して作成 ◦ glibcが提供するpthreadライブラリ(NPTL)で生成するスレッドはカーネルスレッド ◦ スレッドを作成するpthread_create()関数を呼ぶと、内部で clone()システムコールを呼び出して LWPを生成する ◦ スレッドの管理情報はカーネル内に存在 3
システムに存在するカーネルスレッドの一覧表示 4 $ ps -eL PID LWP TTY TIME CMD
… 756 756 ? 00:00:07 dbus-daemon 767 767 ? 00:00:03 systemd-logind 768 768 ? 00:00:00 containerd 768 802 ? 00:01:42 containerd 768 803 ? 00:00:00 containerd … カーネルのスケジューリング単位 LWP(Light Weight Process)のID
スケジューリングの様子 • システムに2つのプロセスP0,P1が存在 ◦ P0はシングルプロセス。 LWPはP0_0のみ存在 ◦ P1は2スレッドから成るマルチスレッド。 LWPはP1_0とP1_1の2つ存在 •
カーネルは3つのLWP(P0_0,P1_0,P1_1)に平等にCPU時間を与える 5 P0_0 時間 CPU上で 動作中のLWP P1_0 P1_1 P0_0 P1_0 P1_1 P0_0 …
ユーザスレッド • ライブラリレベルでスレッドを実装する ◦ スレッドを管理する情報はすべてユーザ空間に存在する • カーネルからはユーザスレッドが何個あるかは検出できない ◦ プロセス内に何個ユーザスレッドがあろうと ps
-eLではLWPは1つ • 📝 大昔のglibcのpthreadライブラリはユーザスレッドを使っていた ◦ pthread_create()を呼んでもLWPを作成するclone()システムコールは発行しない • スレッドライブラリがプロセス内のどのスレッドを動かすかを決める ◦ 例: 所定の関数を呼ぶとスレッドが切り替わる 6
スケジューリングの様子 • システムに2つのプロセスP0,P1が存在 ◦ P0はシングルプロセス。 LWPはP0_0のみ存在 ◦ P1は2スレッドから成るマルチスレッド。 LWPはP1_0のみ存在 •
カーネルは2つのLWP(P0_0,P1_0)に平等にCPU時間を与える • スレッドライブラリがP1_0内の2つのスレッドの実行を切り替える 7 P0_0 時間 CPU上で 動作中のLWP P1_0 P0_0 P1_0 P0_0 … P0_0 P1_0 • スレッドライブラリがP1_0内の2つのスレッドの実行を切り替える • カーネルはユーザ空間スレッドが2つあることを知らない
どっちがいいか • どっちも善し悪しあるので好きなほうを使うとよい • カーネルスレッドと比較したユーザスレッドの特徴 ◦ 生成コストが低い ◦ スレッド間のコンテキストスイッチが高速 ◦
一部スレッドがCPUを独占して動き続けてしまうリスクが高い ◦ スレッドがスリープすると全スレッドがスリープすることになる ◦ 複数スレッドがあっても 1つのCPU上でしか動作できない • カーネルスレッドとユーザスレッドのハイブリッドの実現方法もある! 8
プログラミング言語レベルのサポート • プログラミング言語レベルでスレッド機構を用意していることがある • 例: Go言語のgoroutine ◦ カーネルスレッドとユーザスレッドのハイブリッド ◦ 以下のようにすると関数を非同期的に呼び出せる
◦ ユーザはgoroutineが具体的にどう動かされるかは気にしなくてよい ◦ pthreadライブラリのようなものを直接動かすよりも楽 9 go func() { … }()
📝 スレッドの用語はめんどくさい! • 同じ概念を指す似たような用語がある ◦ カーネルスレッド ▪ カーネル空間スレッド ▪ カーネルレベルスレッド
▪ Light Weight Process(LWP) ◦ ユーザスレッド ▪ ユーザ空間スレッド ▪ ユーザレベルスレッド ▪ グリーンスレッド • ハードウェアの文脈でプロセスの文脈とは別の意味の「スレッド」がある ◦ SMT(Simultaneous Multi-Threading) ▪ 1つのCPUコアを論理的に2つ以上に見せる ◦ 📝 ハイパースレッディングは Intel社のCPUでSMTを実現したもの 10
まとめ • マルチスレッドの実現方法にはカーネルスレッドとユーザスレッドがある ◦ 両方使う場合もある • プログラミング言語レベルでマルチスレッドプログラムの難しさを隠蔽しているもの もある 11