SlideShare ist ein Scribd-Unternehmen logo
1 von 16
Downloaden Sie, um offline zu lesen
xv6 scheduler
                 Part 1
                ( 修正版 )


                @noztos

2012.9.2    カーネル VM 勉強会 第二回 OS 基礎 (xv6)
Scheduling

  ●   ひとつの物理プロセッサを多重化する
      複数の ( 仮想 ) プロ セッ サが存在する かのよ う に動作
  ●   ユーザープロセスに錯ーさせる
           –   専用のメモリ空間
           –   専用プロセッサ




12/09/02                 xv6 scheduler part1   2
Multiplexing

  ●   タイマ割込み 100ms( 固定 )
  ●   多重化の実装
           1.コンテキスト切り替え:標準的機構
           2.透過的コンテキスト切り替え方法 :
              タイ ー割ーみハンド ( プリエンプティブ )
                マ       ラ
           3.複数 CPU × マルチプロセスの同時実行 :
              競合回避のための lock
           4.プロセス終了時 : メモリ、リソースの解放
12/09/02            xv6 scheduler part1   3
Context Switching




12/09/02         xv6 scheduler part1   4
Context Switching

  ●   Scheduler thread を必ず経由
                    プロセスから system call or interrupt
                               ↓
                          scheduler
                               ↓
                       他プロセスへ trap return
  ●   Scheduler thread は CPU 毎
  ●   旧スレッドの register をセーブ
      保存し て いた新スレ ッ ド の register をリストア
      cf. swtch.S
12/09/02                     xv6 scheduler part1      5
Context Switching - swtch()

  ●     Thread について は知ら ず、 "contexts” を管理
        す る のみ
  ●     void swtch(struct context **old, struct context *new);
      # Save old registers      # Load new registers
      movl 4(%esp), %eax        movl 4(%esp), %eax # not 8(%esp) - popped return
                               address above
      popl 0(%eax) # %eip
      movl %esp, 4(%eax)        movl 28(%eax), %ebp
      movl %ebx, 8(%eax)        movl 24(%eax), %edi
      movl %ecx, 12(%eax)       movl 20(%eax), %esi
      movl %edx, 16(%eax)       movl 16(%eax), %edx
      movl %esi, 20(%eax)       movl 12(%eax), %ecx
      movl %edi, 24(%eax)       movl 8(%eax), %ebx
      movl %ebp, 28(%eax)       movl 4(%eax), %esp
                                pushl 0(%eax) # %eip
12/09/02                         xv6 scheduler part1                           6
Scheduling – sched()

  ●   CPU を解放するには
           –   ptable.lock を取得
           –   取得している他の lock の解放
           –   自身の proc->state の更新
           –   sched() の呼出
                   proc.c: yield(), sleep(), exit() からのみ
  ●   sched() 内でもチェック + 割込み禁止確認


12/09/02                      xv6 scheduler part1          7
Scheduling – sched()                              を抜けるとそこは

  ●   sched() において
      swtch() を呼ぶことにより
      proc->context(=current context) から
      cpu->scheduler(=scheduler context) へー身
  ●   “Scheduler context へ変身” ... ということは
      swtch() から戻るのは
      proc.c:scheduler()
      そして何事もなかったかのように RUNNABLE プロセスを探す
      proc.c: scheduler() 内 l.214 – l.231


12/09/02                          xv6 scheduler part1              8
Scheduling – ptable.lock

  ●   swtch() を呼ぶ前に ptable.lock を取得
      lock の取得、解放は thread の責任
           –   Unusual
                swtch() 中の proc->state, cpu->context の
                整合性保持をシンプルに
  ●   おまけ情報
      カーネル空間で使用する sleep() は、引数で lock を指定
      void        sleep(void*, struct spinlock*);
      ptable.lock で sleep() 呼ぶのは wait() のみ


12/09/02                       xv6 scheduler part1       9
Scheduling − ptable.lock
                       acquire() 〜 release()

           process(kernel space)                                scheduler

  yield() {                 sched() {                     scheduler() {
    acquire(ptable.lock);     ...                           …
    sched();                  swtch();                      for(p = ptable.proc; …) {
    ...                       ...             ここに             ….
                                                 戻る
  }                         }                                 swtch();
                                                              …
                                                            }
                                                            release(ptable.lock);
                                                          }




12/09/02                            xv6 scheduler part1                                 10
Scheduling ー scheduler thread

  ●   swtch() による CPU 解放
      Kernel thread: scheculer() から
      process:       sched() から
  ●   forkret() のみ swtch() によらないスケジューリング
      cf. Chapter 1 プロセス生成
      forkret() → forkret1() → trapret()



12/09/02                 xv6 scheduler part1   11
Scheduling - scheduler()

     For(;;) {
           割込み許可
           ptable.lock 取得
           実行するプロセスを探す (proc[] の探索 )
           プロセスが止まるまで走らせる
           ptable.lock 解放
     }

12/09/02               xv6 scheduler part1   12
Scheduling – scheduler()
                    実行可能プロセス探索

  1.p->state == RUNNABLE を探す
  2.見つかったら (CPU 毎に )
           –   proc にプロセス情報をセット
           –   switchuvm() - プロセスページ切替
           –   p->state = RUNNNING
           –   swtch()



12/09/02                   xv6 scheduler part1   13
Scheduling – scheduler()
                    lock について

  ●   Schesuler() が ptable.lock を保持することは、 RUNNABLE プ
      ロセスが見つからない場合のように CPU アイ リ          ド ングの特殊な
      ケースで重要である
  ●   もし、アイドリング CPU のスケジュ ラが lock を継続的に保
                          ー
      持してループしていれば、プロセスが動作している他の CPU
      ではコンテキスト切替やプロセス関連のシステムコールを実
      行できない。つまり 他 CPU がプロセス状態を RUNNABLE に変
               、
      更することはできない。
  ●   周期的に割り み許可するのは、
            ー        プロセスが IO を待っているた
      め

12/09/02                xv6 scheduler part1        14
Scheduling ー プロセス状態の保持と lock
  ●   プロセス状態の一貫性
           –   プロ セスページテーブ ル
           –   プロ セスカ ーネルスタ ッ ク
           –   cpu->curproc が正しく proc[] を指している
      これを維持するため
           –   ユーザースレッドで lock を取得
           –   スケジューラー又はカーネルスレッドで解放
  ●   あと  プロセステーブルへの配置と  解放もあるよ
      wait→wakeup については注意な !( つづく ! かも )
12/09/02                 xv6 scheduler part1     15
“lost wake up” problem




12/09/02           xv6 scheduler part1   16

Weitere ähnliche Inhalte

Was ist angesagt?

HandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLHandlerSocket plugin for MySQL
HandlerSocket plugin for MySQL
akirahiguchi
 
initとプロセス再起動
initとプロセス再起動initとプロセス再起動
initとプロセス再起動
Takashi Takizawa
 
serverspecみんなで集めて(゚Д゚)ウマー?
serverspecみんなで集めて(゚Д゚)ウマー?serverspecみんなで集めて(゚Д゚)ウマー?
serverspecみんなで集めて(゚Д゚)ウマー?
Sho Hashimoto
 
Gluster fs and_swiftapi_20120429
Gluster fs and_swiftapi_20120429Gluster fs and_swiftapi_20120429
Gluster fs and_swiftapi_20120429
Etsuji Nakai
 

Was ist angesagt? (20)

デバドラを書いてみよう!
デバドラを書いてみよう!デバドラを書いてみよう!
デバドラを書いてみよう!
 
OpenvswitchでVPS
OpenvswitchでVPSOpenvswitchでVPS
OpenvswitchでVPS
 
動的ネットワークパス構築と連携したエッジオーバレイ帯域制御
動的ネットワークパス構築と連携したエッジオーバレイ帯域制御動的ネットワークパス構築と連携したエッジオーバレイ帯域制御
動的ネットワークパス構築と連携したエッジオーバレイ帯域制御
 
リアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズリアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズ
 
Lagopus 0.2
Lagopus 0.2Lagopus 0.2
Lagopus 0.2
 
[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理
[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理
[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理
 
Linux女子会 - お仕事メリハリ術♪(プロセススケジューラ編)
Linux女子会 - お仕事メリハリ術♪(プロセススケジューラ編)Linux女子会 - お仕事メリハリ術♪(プロセススケジューラ編)
Linux女子会 - お仕事メリハリ術♪(プロセススケジューラ編)
 
HandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLHandlerSocket plugin for MySQL
HandlerSocket plugin for MySQL
 
Memory sanitizer
Memory sanitizerMemory sanitizer
Memory sanitizer
 
Varnish 4.0 Release Party in Tokyo発表資料
Varnish 4.0 Release Party in Tokyo発表資料Varnish 4.0 Release Party in Tokyo発表資料
Varnish 4.0 Release Party in Tokyo発表資料
 
MINCS – containers in the shell script
MINCS – containers in the shell scriptMINCS – containers in the shell script
MINCS – containers in the shell script
 
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
 
SystemV IPC
SystemV IPCSystemV IPC
SystemV IPC
 
initとプロセス再起動
initとプロセス再起動initとプロセス再起動
initとプロセス再起動
 
Varnishのログの眺め方
Varnishのログの眺め方Varnishのログの眺め方
Varnishのログの眺め方
 
Hello, systemd
Hello, systemdHello, systemd
Hello, systemd
 
Kernel fcache-bug
Kernel fcache-bugKernel fcache-bug
Kernel fcache-bug
 
serverspecみんなで集めて(゚Д゚)ウマー?
serverspecみんなで集めて(゚Д゚)ウマー?serverspecみんなで集めて(゚Д゚)ウマー?
serverspecみんなで集めて(゚Д゚)ウマー?
 
パケットジェネレータipgenから見るnetmap
パケットジェネレータipgenから見るnetmapパケットジェネレータipgenから見るnetmap
パケットジェネレータipgenから見るnetmap
 
Gluster fs and_swiftapi_20120429
Gluster fs and_swiftapi_20120429Gluster fs and_swiftapi_20120429
Gluster fs and_swiftapi_20120429
 

Ähnlich wie Kernel vm study_2_xv6_scheduler_part1_revised

Dive into RTS - another side
Dive into RTS - another sideDive into RTS - another side
Dive into RTS - another side
Kiwamu Okabe
 
Apache cloudstack4.0インストール
Apache cloudstack4.0インストールApache cloudstack4.0インストール
Apache cloudstack4.0インストール
Yasuhiro Arai
 
仮想記憶入門 BSD-4.3を例題に
仮想記憶入門 BSD-4.3を例題に仮想記憶入門 BSD-4.3を例題に
仮想記憶入門 BSD-4.3を例題に
magoroku Yamamoto
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 session
freedom404
 
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワーク
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワークSeastar:高スループットなサーバアプリケーションの為の新しいフレームワーク
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワーク
Takuya ASADA
 

Ähnlich wie Kernel vm study_2_xv6_scheduler_part1_revised (20)

【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門 【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門
 
KVM+cgroup
KVM+cgroupKVM+cgroup
KVM+cgroup
 
Openstack+Ceph設定ガイド
Openstack+Ceph設定ガイドOpenstack+Ceph設定ガイド
Openstack+Ceph設定ガイド
 
Lxc cf201207-presen
Lxc cf201207-presenLxc cf201207-presen
Lxc cf201207-presen
 
Openresty
OpenrestyOpenresty
Openresty
 
コンテナ情報交換会2
コンテナ情報交換会2コンテナ情報交換会2
コンテナ情報交換会2
 
OpenStackでも重要な役割を果たすPacemakerを知ろう!
OpenStackでも重要な役割を果たすPacemakerを知ろう!OpenStackでも重要な役割を果たすPacemakerを知ろう!
OpenStackでも重要な役割を果たすPacemakerを知ろう!
 
Dive into RTS - another side
Dive into RTS - another sideDive into RTS - another side
Dive into RTS - another side
 
Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド - Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド -
 
Ubuntuで始めるコンテナ技術入門
Ubuntuで始めるコンテナ技術入門Ubuntuで始めるコンテナ技術入門
Ubuntuで始めるコンテナ技術入門
 
Ethernetの受信処理
Ethernetの受信処理Ethernetの受信処理
Ethernetの受信処理
 
Apache CloudStack 4.0 インストール(ver0.5)
Apache CloudStack 4.0 インストール(ver0.5)Apache CloudStack 4.0 インストール(ver0.5)
Apache CloudStack 4.0 インストール(ver0.5)
 
Apache cloudstack4.0インストール
Apache cloudstack4.0インストールApache cloudstack4.0インストール
Apache cloudstack4.0インストール
 
仮想記憶入門 BSD-4.3を例題に
仮想記憶入門 BSD-4.3を例題に仮想記憶入門 BSD-4.3を例題に
仮想記憶入門 BSD-4.3を例題に
 
本当にわかる Spectre と Meltdown
本当にわかる Spectre と Meltdown本当にわかる Spectre と Meltdown
本当にわかる Spectre と Meltdown
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 session
 
第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西
 
2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ
 
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワーク
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワークSeastar:高スループットなサーバアプリケーションの為の新しいフレームワーク
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワーク
 
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!
 

Kernel vm study_2_xv6_scheduler_part1_revised

  • 1. xv6 scheduler Part 1 ( 修正版 ) @noztos 2012.9.2 カーネル VM 勉強会 第二回 OS 基礎 (xv6)
  • 2. Scheduling ● ひとつの物理プロセッサを多重化する 複数の ( 仮想 ) プロ セッ サが存在する かのよ う に動作 ● ユーザープロセスに錯ーさせる – 専用のメモリ空間 – 専用プロセッサ 12/09/02 xv6 scheduler part1 2
  • 3. Multiplexing ● タイマ割込み 100ms( 固定 ) ● 多重化の実装 1.コンテキスト切り替え:標準的機構 2.透過的コンテキスト切り替え方法 : タイ ー割ーみハンド ( プリエンプティブ ) マ ラ 3.複数 CPU × マルチプロセスの同時実行 : 競合回避のための lock 4.プロセス終了時 : メモリ、リソースの解放 12/09/02 xv6 scheduler part1 3
  • 4. Context Switching 12/09/02 xv6 scheduler part1 4
  • 5. Context Switching ● Scheduler thread を必ず経由 プロセスから system call or interrupt ↓ scheduler ↓ 他プロセスへ trap return ● Scheduler thread は CPU 毎 ● 旧スレッドの register をセーブ 保存し て いた新スレ ッ ド の register をリストア cf. swtch.S 12/09/02 xv6 scheduler part1 5
  • 6. Context Switching - swtch() ● Thread について は知ら ず、 "contexts” を管理 す る のみ ● void swtch(struct context **old, struct context *new); # Save old registers # Load new registers movl 4(%esp), %eax movl 4(%esp), %eax # not 8(%esp) - popped return address above popl 0(%eax) # %eip movl %esp, 4(%eax) movl 28(%eax), %ebp movl %ebx, 8(%eax) movl 24(%eax), %edi movl %ecx, 12(%eax) movl 20(%eax), %esi movl %edx, 16(%eax) movl 16(%eax), %edx movl %esi, 20(%eax) movl 12(%eax), %ecx movl %edi, 24(%eax) movl 8(%eax), %ebx movl %ebp, 28(%eax) movl 4(%eax), %esp pushl 0(%eax) # %eip 12/09/02 xv6 scheduler part1 6
  • 7. Scheduling – sched() ● CPU を解放するには – ptable.lock を取得 – 取得している他の lock の解放 – 自身の proc->state の更新 – sched() の呼出 proc.c: yield(), sleep(), exit() からのみ ● sched() 内でもチェック + 割込み禁止確認 12/09/02 xv6 scheduler part1 7
  • 8. Scheduling – sched() を抜けるとそこは ● sched() において swtch() を呼ぶことにより proc->context(=current context) から cpu->scheduler(=scheduler context) へー身 ● “Scheduler context へ変身” ... ということは swtch() から戻るのは proc.c:scheduler() そして何事もなかったかのように RUNNABLE プロセスを探す proc.c: scheduler() 内 l.214 – l.231 12/09/02 xv6 scheduler part1 8
  • 9. Scheduling – ptable.lock ● swtch() を呼ぶ前に ptable.lock を取得 lock の取得、解放は thread の責任 – Unusual swtch() 中の proc->state, cpu->context の 整合性保持をシンプルに ● おまけ情報 カーネル空間で使用する sleep() は、引数で lock を指定 void sleep(void*, struct spinlock*); ptable.lock で sleep() 呼ぶのは wait() のみ 12/09/02 xv6 scheduler part1 9
  • 10. Scheduling − ptable.lock acquire() 〜 release() process(kernel space) scheduler yield() { sched() { scheduler() { acquire(ptable.lock); ... … sched(); swtch(); for(p = ptable.proc; …) { ... ... ここに …. 戻る } } swtch(); … } release(ptable.lock); } 12/09/02 xv6 scheduler part1 10
  • 11. Scheduling ー scheduler thread ● swtch() による CPU 解放 Kernel thread: scheculer() から process: sched() から ● forkret() のみ swtch() によらないスケジューリング cf. Chapter 1 プロセス生成 forkret() → forkret1() → trapret() 12/09/02 xv6 scheduler part1 11
  • 12. Scheduling - scheduler() For(;;) { 割込み許可 ptable.lock 取得 実行するプロセスを探す (proc[] の探索 ) プロセスが止まるまで走らせる ptable.lock 解放 } 12/09/02 xv6 scheduler part1 12
  • 13. Scheduling – scheduler() 実行可能プロセス探索 1.p->state == RUNNABLE を探す 2.見つかったら (CPU 毎に ) – proc にプロセス情報をセット – switchuvm() - プロセスページ切替 – p->state = RUNNNING – swtch() 12/09/02 xv6 scheduler part1 13
  • 14. Scheduling – scheduler() lock について ● Schesuler() が ptable.lock を保持することは、 RUNNABLE プ ロセスが見つからない場合のように CPU アイ リ ド ングの特殊な ケースで重要である ● もし、アイドリング CPU のスケジュ ラが lock を継続的に保 ー 持してループしていれば、プロセスが動作している他の CPU ではコンテキスト切替やプロセス関連のシステムコールを実 行できない。つまり 他 CPU がプロセス状態を RUNNABLE に変 、 更することはできない。 ● 周期的に割り み許可するのは、 ー プロセスが IO を待っているた め 12/09/02 xv6 scheduler part1 14
  • 15. Scheduling ー プロセス状態の保持と lock ● プロセス状態の一貫性 – プロ セスページテーブ ル – プロ セスカ ーネルスタ ッ ク – cpu->curproc が正しく proc[] を指している これを維持するため – ユーザースレッドで lock を取得 – スケジューラー又はカーネルスレッドで解放 ● あと プロセステーブルへの配置と 解放もあるよ wait→wakeup については注意な !( つづく ! かも ) 12/09/02 xv6 scheduler part1 15
  • 16. “lost wake up” problem 12/09/02 xv6 scheduler part1 16