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
Satoru Takeuchi
PRO
April 13, 2025
Technology
540
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
マルチスレッドの実現方法 ~カーネルスレッドとユーザスレッド~
以下動画のテキストです
https://youtu.be/3FzWDsJlB-8
Satoru Takeuchi
PRO
April 13, 2025
More Decks by Satoru Takeuchi
See All by Satoru Takeuchi
119-多機能ファイルシステムBtrfs_のコピー.pdf
sat
PRO
1
78
Linuxカーネルの インタフェースは変わりうる?
sat
PRO
1
110
あなたの知らないバージョン命名規則
sat
PRO
3
920
Rook: Intro and Deep Dive with Ceph
sat
PRO
1
73
Machine Check Exception
sat
PRO
2
69
バイナリダンプの模様を読む
sat
PRO
0
110
cpコマンドはディスク上でデータを コピーしないことがある
sat
PRO
3
110
114-ファイルのshallow_copy.pdf
sat
PRO
2
62
113-Btrfsのスナップショット.pdf
sat
PRO
0
46
Other Decks in Technology
See All in Technology
OSC2026on_the-world-is-waiting-for-your-voice.pdf
naruoga
0
370
AgentCoreで実践するハーネスエンジニアリング
yakumo
1
300
実践! SRE × AI - ABEMA における AIOps -
tetsuya28
7
2.9k
初対面のメンバーがチームを組み、Claude Codeでゼロからサービスをリリース
mkdev10
1
120
大型犬好きによるPugの紹介
yamanoku
1
150
自作バイナリを動かす「入口」8選
puhitaku
2
1.3k
組み立てて楽しむ AWS Blocks 入門
kmiya84377
0
230
More Freedom on the Same Shared GPU Cluster: A Small Team’s Experience with vCluster
nttcom
0
160
実践!Cloud Run ハンズオン!! / Cloud Run handson
y0hgi
0
230
触りたくないデータに、どう触るか AI時代のRBACアクセスガバナンス
ivry_presentationmaterials
0
130
今さら理解するウェブフォントver.2026
takanorip
3
680
AIは爆速なのに、私が詰まっていた話 ― 音声入力と鳴くマスコットでボトルネックを削る
yama3133
0
610
Featured
See All Featured
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
77k
Ruling the World: When Life Gets Gamed
codingconduct
0
400
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
880
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
400
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Tell your own story through comics
letsgokoyo
1
1.1k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
530
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
270
We Are The Robots
honzajavorek
0
400
Product Roadmaps are Hard
iamctodd
55
13k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
550
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