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
自作OSへの排他制御の実装
Search
Totsugekitai
June 16, 2020
Programming
630
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
660
x86_64での自作OS - サイボウズ・ラボユース 成果発表会
totsugekitai
0
770
フルスクラッチOS格闘記 〜タイマ割り込みをメインに〜
totsugekitai
0
860
自作OSのその手前 UEFI OSローダの作成
totsugekitai
0
190
Other Decks in Programming
See All in Programming
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
550
OSもどきOS
arkw
0
570
技術記事、 専門家としてのプログラマ、 言語化
mizchi
13
6.1k
C# and C++ Interoperability - cho-dotnetnew
harukasao
0
150
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
13k
Strategic Design in the Frontend: Moduliths & Micro Frontends @DDDEurope
manfredsteyer
PRO
0
110
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.3k
肥大化するレガシーコードに立ち向かうためのインターフェース分離と依存の逆転 / JJUG CCC 2026 Spring
hirokunimaeta
0
570
3Dシーンの圧縮
fadis
1
780
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
150
Webフレームワークの ベンチマークについて
yusukebe
0
170
スマートグラスで並列バイブコーディング
hyshu
0
150
Featured
See All Featured
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
Designing for humans not robots
tammielis
254
26k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
140
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
200
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
200
Music & Morning Musume
bryan
47
7.2k
Building AI with AI
inesmontani
PRO
1
1.1k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
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 • インターネット上の多くの記事