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
680
x86_64での自作OS - サイボウズ・ラボユース 成果発表会
totsugekitai
0
790
フルスクラッチOS格闘記 〜タイマ割り込みをメインに〜
totsugekitai
0
880
自作OSのその手前 UEFI OSローダの作成
totsugekitai
0
200
Other Decks in Programming
See All in Programming
Railsバージョンを4倍にした話
optim
0
450
IBM Bob でAI駆動開発『QC-Playbook』
ichirokano2
0
110
[Dev Group Paris Octobre 26] Agentforce, SIforce, Claudeforce, Slackbot… on s'y retrouve ?
nabondance
0
110
AI主導のプログラミング学習アプリを作ってみた
econanringo
0
180
AWS CDKのカスタムリソースでContinuum(旧Security Agent)を実装した話 | Implementing Continuum (formerly Security Agent) via AWS CDK Custom Resource
akihisaikeda
2
150
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
380
[JA] Domain Modeling with Vanilla Rails: 「操作」から再考するRailsの設計論
yasaichi
3
440
コードで差別化できない時代の ソフトウェアエンジニアリング / Software Engineering in an Era Where Code Doesn’t Differentiate
kishida
2
180
気持ちぃ〜角丸 Squircle
ryu1013
0
310
re:Inventに行く前に知っておきたい現地参加のノウハウ
nokomoro3
0
440
なぜCTOを降りてFDEを選んだのか?〜なぜプロダクト企業がFDEで顧客の現場に踏み込むのか〜
gonta
1
220
Long Living Tokens, Die, Die, Die! (or: The One Ring is Banned in Modern)
sylph01
0
320
Featured
See All Featured
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
460
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
A designer walks into a library…
pauljervisheath
211
25k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
330
Building Adaptive Systems
keathley
44
3.3k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
540
Joys of Absence: A Defence of Solitary Play
codingconduct
1
550
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
760
The agentic SEO stack - context over prompts
schlessera
0
970
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
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 • インターネット上の多くの記事