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

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

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

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

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 • インターネット上の多くの記事