Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
マルチスレッドの実現方法 ~カーネルスレッドとユーザスレッド~
Search
Satoru Takeuchi
PRO
April 13, 2025
Technology
2
120
マルチスレッドの実現方法 ~カーネルスレッドとユーザスレッド~
以下動画のテキストです
https://youtu.be/3FzWDsJlB-8
Satoru Takeuchi
PRO
April 13, 2025
Tweet
Share
More Decks by Satoru Takeuchi
See All by Satoru Takeuchi
Rook: Intro and Deep Dive With Ceph
sat
PRO
1
110
会社員しながら本を書いてきた知見の共有
sat
PRO
3
790
デバイスにアクセスするデバイスファイル
sat
PRO
1
38
ファイルシステムのデータを ブロックデバイスへの操作で変更
sat
PRO
1
32
デバイスドライバ
sat
PRO
0
49
共有メモリ
sat
PRO
3
70
マルチスレッドプログラム
sat
PRO
3
59
Linuxのブートプロセス initramfs編
sat
PRO
2
88
Linuxのブートプロセス
sat
PRO
6
190
Other Decks in Technology
See All in Technology
american airlines®️ USA Contact Numbers: Complete 2025 Support Guide
supportflight
1
110
fukabori.fm 出張版: 売上高617億円と高稼働率を陰で支えた社内ツール開発のあれこれ話 / 20250704 Yoshimasa Iwase & Tomoo Morikawa
shift_evolve
PRO
2
7.6k
さくらのIaaS基盤のモニタリングとOpenTelemetry/OSC Hokkaido 2025
fujiwara3
3
440
無意味な開発生産性の議論から抜け出すための予兆検知とお金とAI
i35_267
4
13k
ビズリーチにおけるリアーキテクティング実践事例 / JJUG CCC 2025 Spring
visional_engineering_and_design
1
120
Zephyr RTOSを使った開発コンペに参加した件
iotengineer22
1
220
Should Our Project Join the CNCF? (Japanese Recap)
whywaita
PRO
0
340
SEQUENCE object comparison - db tech showcase 2025 LT2
nori_shinoda
0
140
開発生産性を測る前にやるべきこと - 組織改善の実践 / Before Measuring Dev Productivity
kaonavi
9
4.3k
改めてAWS WAFを振り返る~業務で使うためのポイント~
masakiokuda
2
250
IPA&AWSダブル全冠が明かす、人生を変えた勉強法のすべて
iwamot
PRO
2
130
Core Audio tapを使ったリアルタイム音声処理のお話
yuta0306
0
190
Featured
See All Featured
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.9k
The World Runs on Bad Software
bkeepers
PRO
69
11k
Code Review Best Practice
trishagee
69
18k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Producing Creativity
orderedlist
PRO
346
40k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.3k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.8k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
8
690
Into the Great Unknown - MozCon
thekraken
40
1.9k
Rebuilding a faster, lazier Slack
samanthasiow
82
9.1k
It's Worth the Effort
3n
185
28k
Testing 201, or: Great Expectations
jmmastey
43
7.6k
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