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
自作OSへの排他制御の実装
Search
Totsugekitai
June 16, 2020
Programming
650
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
自作OSへの排他制御の実装
サイボウズラボユースの発表会でのスライドです。
Totsugekitai
June 16, 2020
More Decks by Totsugekitai
See All by Totsugekitai
AHCIに対応したい
totsugekitai
0
670
x86_64での自作OS - サイボウズ・ラボユース 成果発表会
totsugekitai
0
780
フルスクラッチOS格闘記 〜タイマ割り込みをメインに〜
totsugekitai
0
880
自作OSのその手前 UEFI OSローダの作成
totsugekitai
0
190
Other Decks in Programming
See All in Programming
Webの地図
yosuke_furukawa
PRO
6
4.7k
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
4
12k
選挙速報を多くのユーザーへ 届ける Live Activities 設計
hamayokokuririn
0
160
手動確認はもう限界 〜XCUITestでCustom URL Schemeの遷移を起動種別ごとに自動テストする〜 / Testing Custom URL Schemes with XCUITest
otouto
0
330
ゲームコントローラやキーボードのファームウェアをSwiftで書く
kishikawakatsumi
1
250
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
5
8.3k
難しいけど、読めた。- OSSの入口に立った話。
sts11142
0
120
そのリトライ、死んだコネクションを使い回していませんか ── GoのHTTPクライアントとHTTP/2を実プロダクト障害から学び直す
myus4a
0
230
スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜
atsuki_seo
0
180
MVNOの申込からeSIM開通までをiOSアプリでつなぐ- 本人確認・MNP・通信事業者基盤をまたぐ実装
satotakeshi
0
470
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
130
Vue Fes Japan 2026 タイムテーブル徹底解説
448jp
1
510
Featured
See All Featured
Documentation Writing (for coders)
carmenintech
77
5.5k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
HDC tutorial
michielstock
2
900
Skip the Path - Find Your Career Trail
mkilby
1
240
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.1k
From π to Pie charts
rasagy
1
380
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
300
Designing Powerful Visuals for Engaging Learning
tmiket
1
580
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
3
4.3k
Into the Great Unknown - MozCon
thekraken
41
2.7k
Transcript
自作OSへの排他制御の実装 サイボウズ・ラボユース 発表会&自己紹介 広瀬 智之 2020.6.16
自己紹介 • 名前:広瀬智之 • 所属:筑波大学情報科学類 3 年 • サイボウズ・ラボユース 第
9 期 • 光成さんに指導してもらって自作 OS をしています(も うすぐ修了) 1
minOS(私の自作 OS)の概観 • CPU は 64bit モードを前提に作成 • UEFI 対応
• ページングでメモリを初期化 • AHCI(SATA コントローラ)のドライバを実装 • SATA 接続されたストレージへの(原始的な)読み書き ができます • スレッド機能を実装し並行処理を実現 • セマフォを実装し共有バッファを実現 • スレッドに fork() 相当のものを実装(途中) 以下のリポジトリで公開しています https://github.com/Totsugekitai/minOSv2 2
minOS(私の自作 OS)の概観 • CPU は 64bit モードを前提に作成 • UEFI 対応
• ページングでメモリを初期化 • AHCI(SATA コントローラ)のドライバを実装 • SATA 接続されたストレージへの(原始的な)読み書き ができます • スレッド機能を実装し並行処理を実現 • セマフォを実装し共有バッファを実現 • スレッドに fork() 相当のものを実装(途中) 以下のリポジトリで公開しています https://github.com/Totsugekitai/minOSv2 3
共有バッファを扱う上での問題点 • データの読み書きの最中に別の読み書きが入ったら 大変!!! • 読み込みの最中に書き込み -> 破壊されたデータの読み 込み •
書き込みの最中に読み込み -> 不完全なデータの読み 込み 4
セマフォでの解決 セマフォ (semaphore) を導入する • 排他制御の一種 • セマフォカウンタの値でアクセス可能かどうか判別 • 単純だが強力
5
P 操作と V 操作 P 操作 • セマフォカウンタの値 を引く •
資源獲得をしたいとき に発する • wait などの関数名が使 われる V 操作 • セマフォカウンタの値 を足す • 資源解放をしたときに 発する • signal などの関数名が 使われる
セマフォの使い方 ʮ෩ؒ→ - 1 7
セマフォの使い方 ͕ ҋɻ 䚶 8
セマフォの使い方 ത 㦨 ɾ ळ ባ 9
セマフォの使い方 ത ͕ _ ɻ ʯ ṩ 10
セマフォの使い方 ത ii. ʮ \ ϚΠφε ͳ ͷͰ . .
. 11
セマフォの使い方 ѱ͍ॴ͕ i.ɺ ࡿ ʮ \ ϚΠφε ͳ ͷͰ .
. . 12
セマフォの使い方 തવ Ͱ ※㰏 ۚ՟Ͱ 䡦 ʮ \ ϚΠφε ͳ
ͷͰ . . . 13
セマフォの使い方 㨐͖ ii 14
実装する 1 int wait(sid_t sem) 2 { 3 io_cli(); 4
STI_RET0_IF_ERR(!isbadsem(sem)); 5 STI_RET0_IF_ERR(semtable[sem].semstate == S_USED); 6 semtable[sem].semcount--; 7 if (semtable[sem].semcount < 0) { 8 tid_t tid = get_cur_thread_tid(); 9 STI_RET0_IF_ERR(change_state(tid, WAIT)); 10 thread *t = get_thread_ptr(tid); 11 *t->sid_ptr = sem; 12 STI_RET0_IF_ERR(enqueue_sem(tid, sem)); 13 putsn_serial("enqueue tid: ", tid); 14 thread_scheduler(); 15 } 16 io_sti(); 17 return 1; 18 } 15
実装する 1 int signal(sid_t sem) 2 { 3 io_cli(); 4
STI_RET0_IF_ERR(!isbadsem(sem)); 5 STI_RET0_IF_ERR(semtable[sem].semstate == S_USED); 6 if (semtable[sem].semcount < 0) { 7 semtable[sem].semcount++; 8 tid_t tid; 9 STI_RET0_IF_ERR(dequeue_sem(&tid, sem)); 10 putsn_serial("dequeue tid: ", tid); 11 STI_RET0_IF_ERR(change_state(tid, RUNNABLE)); 12 thread_scheduler(); 13 } 14 io_sti(); 15 return 1; 16 } 16
使い方 雰囲気としてはこんな感じで使う。 1 pipe_t buf; 2 sid_t sem = BADSEM;
3 void consumer(void) 4 { 5 sem = create_sem(0); 6 if (wait(sem) != 1) { 7 return err; 8 } 9 char output[100]; 10 read(buf, output); 11 printf(output); 12 } 1 void producer(void) 2 { 3 while (sem == BADSEM) {} 4 write(buf, hoge); 5 if (signal(sem) != 1) { 6 return err; 7 } 8 } 17
参考文献リスト • Xinu オペレーティングシステムデザイン 改訂 2 版 • モダンオペレーティングシステム •
はじめての OS コードリーディング • Linux Kernel Development • インターネット上の多くの記事