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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Satoru Takeuchi
PRO
April 13, 2025
Technology
480
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
Rook: Intro and Deep Dive with Ceph
sat
PRO
1
57
Machine Check Exception
sat
PRO
2
53
バイナリダンプの模様を読む
sat
PRO
0
72
cpコマンドはディスク上でデータを コピーしないことがある
sat
PRO
3
60
114-ファイルのshallow_copy.pdf
sat
PRO
2
45
113-Btrfsのスナップショット.pdf
sat
PRO
0
24
システム強制終了時にファイルシステムの整合性を保つ~ コピーオンライト編 ~
sat
PRO
0
66
システム強制終了時に ファイルシステムの整合性を保つ ~ ジャーナリング編 ~
sat
PRO
2
71
ファイルシステムの整合性を回復するfsck
sat
PRO
1
77
Other Decks in Technology
See All in Technology
老害フォレンジッカーはAI羊の夢を見るか?
tadmaddad
0
350
同じWAFが、攻撃の“形”は弾く── 正当な“形”の不正は通す
kuroneko13
0
230
攻撃と防御で学ぶAI時代のプロダクトセキュリティ演習
recruitengineers
PRO
9
3k
Digitization部 紹介資料
sansan33
PRO
2
7.7k
少人数チームで実現する、大規模AWSサーバーレス基盤における"揺らがない"信頼性運用
maimyyym
1
110
ホームラボ紹介
y_sera15
0
200
会社紹介資料 / Sansan Company Profile
sansan33
PRO
24
430k
[ChatGPT Work LT]事務作業が苦手な人のための バックオフィスの「半」自動化
chimaki_iot
0
310
カートの信頼性を担保するWireMockを使ったe2eテスト
ykagano
0
400
Software Supply Chain Attackからクラウド環境を守るためにできること
lhazy
2
280
AIコーディングの次。コードレビューと理解負荷を解消して組織の開発生産性を高める
moongift
PRO
2
2.6k
Genie Codeハンズオン基礎編
taka_aki
1
130
Featured
See All Featured
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Building the Perfect Custom Keyboard
takai
2
840
Google's AI Overviews - The New Search
badams
0
1.1k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
250
We Have a Design System, Now What?
morganepeng
55
8.3k
The SEO Collaboration Effect
kristinabergwall1
1
520
Git: the NoSQL Database
bkeepers
PRO
432
67k
How to Think Like a Performance Engineer
csswizardry
28
2.7k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
400
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
Optimizing for Happiness
mojombo
378
71k
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