Upgrade to Pro — share decks privately, control downloads, hide ads and more …

自作OSへの排他制御の実装

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

 自作OSへの排他制御の実装

サイボウズラボユースの発表会でのスライドです。

Avatar for Totsugekitai

Totsugekitai

June 16, 2020
Tweet

More Decks by Totsugekitai

Other Decks in Programming

Transcript

  1. 自己紹介 • 名前:広瀬智之 • 所属:筑波大学情報科学類 3 年 • サイボウズ・ラボユース 第

    9 期 • 光成さんに指導してもらって自作 OS をしています(も うすぐ修了) 1
  2. minOS(私の自作 OS)の概観 • CPU は 64bit モードを前提に作成 • UEFI 対応

    • ページングでメモリを初期化 • AHCI(SATA コントローラ)のドライバを実装 • SATA 接続されたストレージへの(原始的な)読み書き ができます • スレッド機能を実装し並行処理を実現 • セマフォを実装し共有バッファを実現 • スレッドに fork() 相当のものを実装(途中) 以下のリポジトリで公開しています https://github.com/Totsugekitai/minOSv2 2
  3. minOS(私の自作 OS)の概観 • CPU は 64bit モードを前提に作成 • UEFI 対応

    • ページングでメモリを初期化 • AHCI(SATA コントローラ)のドライバを実装 • SATA 接続されたストレージへの(原始的な)読み書き ができます • スレッド機能を実装し並行処理を実現 • セマフォを実装し共有バッファを実現 • スレッドに fork() 相当のものを実装(途中) 以下のリポジトリで公開しています https://github.com/Totsugekitai/minOSv2 3
  4. P 操作と V 操作 P 操作 • セマフォカウンタの値 を引く •

    資源獲得をしたいとき に発する • wait などの関数名が使 われる V 操作 • セマフォカウンタの値 を足す • 資源解放をしたときに 発する • signal などの関数名が 使われる
  5. 実装する 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
  6. 実装する 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
  7. 使い方 雰囲気としてはこんな感じで使う。 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
  8. 参考文献リスト • Xinu オペレーティングシステムデザイン 改訂 2 版 • モダンオペレーティングシステム •

    はじめての OS コードリーディング • Linux Kernel Development • インターネット上の多くの記事