Advertisement
Guest User

Untitled

a guest
Aug 21st, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.77 KB | None | 0 0
  1. # Chapter 4 (Process Scheduling) / The Linux Scheduling Algorithm
  2.  
  3. ## Scheduler Classes
  4. - Linuxのスケジューラは異なる種類のプロセスに対して異なるアルゴリズムを用いてスケジューリングすることが出来るようになっている
  5. - この構造を scheduler classes という
  6. - 各scheduler classは優先度を持っている
  7. - 実行可能状態のプロセスが存在するようなscheduler classのうち、最も優先度の大きいものが採用される
  8. - そのscheduler classが次に実行するプロセスを決定する
  9. - CFSは`kernel/sched_fair.c`に実装されていて、Linuxの`SCHED_NORMAL`とPOSIXの`SCHED_OTHER`に登録されている
  10.  
  11. ## Process Scheduling in Unix Systems
  12. - Unixのスケジューラはナイス値を優先度として使う
  13. - これはシンプルに見えるが、いくつかの病的な問題を引き起こす
  14.  
  15. ### 1. 各nice値にどれくらいのtimesliceを割り当てるかを決める必要がある
  16. - 割り当ての決め方によって、スケジューラとして好ましくない挙動になりうる
  17. - 具体例1
  18. - プロセスA(nice:0)とプロセスB(nice:+20)を考える
  19. - nice値0に対応するtimesliceを100msとして、nice値+20に対応するtimesliceを5msとする
  20. - するとプロセスAは20/21、プロセスBは1/21の時間が割り当てられる
  21. - nice値にいくらのtimesliceを割り当てるのが最適なのかを考える必要が出てきてしまう
  22. - 具体例2
  23. - プロセスA(nice:+20)とプロセスB(nice:+20)
  24. - 5ms毎にコンテキストスイッチが起こり、非効率的
  25. - 具体例3
  26. - プロセスA(nice:0)とプロセスB(nice:0)
  27. - 切り替えまで100msかかってしまう
  28. - たとえCPUをたくさん使うタスクであったとしてもnice値が大きいプロセスはバックグラウンドに行きがちだし、nice値が小さいプロセスはフォアグラウンドにいきやすくなる
  29. - これは理想からは大きく離れている
  30.  
  31. ### 2. nice値の差に対応するtimesliceの差が、nice値の絶対値によって変わってしまう
  32. - 本来nice値は普通は相対的な値として扱われるもの
  33. - nice値の絶対値によって、nice値の一定の差に対応するtimesliceの差が変わるのは好ましくない
  34. - 具体例
  35. - 以下のようにtimesliceを割り当てたとする
  36. - nice値0: 100ms
  37. - nice値1: 95ms
  38. - nice値18: 10ms
  39. - nice値19: 5ms
  40. - nice値0と1の間の差は0.95倍であり、理想に近い
  41. - nice値18と19の間の差は0.5倍であり差が大きい
  42.  
  43. ### 3. カーネルが測れる単位である必要がある
  44. - nice値にtimesliceを割り当てるときに、カーネルが計測可能な時間である必要がある
  45. - timesliceは多くのOSではタイマーの1単位の整数倍になる
  46. - これはいくつかの問題を引きおこす
  47. 1. 最小のtimesliceがタイマーの精度によって制限される
  48. 2. timesliceの差がタイマーの精度によって制限される
  49. 3. timesliceの絶対的な長さがタイマーの1単位の長さによって変わる
  50.  
  51. ### 4. インタラクティブ性能を向上するためにプロセスの起動をどのように扱うか
  52. - 新しく起動したタスクはすぐ動き初めて欲しいので優先度を高くしたい
  53. - インタラクティブ性能を向上させる
  54. - 一方で、残りのタスクを犠牲にして1つのプロセスに多くの処理時間を与えることになりうる
  55.  
  56. ---
  57.  
  58. - CFSはこれらの問題の多くを解決出来る
  59. - timesliceの代わりに、CPUの割合を割り当てる
  60. - スイッチングレートが変わる代わりに、CFSは一定の公平性を保つことが出来る
  61.  
  62. ## Fair Scheduling
  63. - 理想的で完全なマルチスレッディングを考える
  64. - 時間を無限小に区切ってN個のプロセスに割り当てる
  65. - ある(時間の)区間においてN個のプロセス全てが実行されている状態
  66. - 各プロセスが1/NのCPUパワーで同時に実行されるイメージ
  67. - もちろんこれをそのまま実現するのは非効率的である
  68. - コンテキストスイッチのコスト
  69. - キャッシュが無駄になる
  70. - なるべく細かい時間単位で区切りたいが、オーバーヘッドがあることに注意する
  71. - そこでCFSでは一定の時間をいくらかずつの時間に分割して、各プロセスをラウンドロビン式に実行する
  72. - 次のプロセスを選ぶとき、今まで実行した時間が最も少ないものから選ぶ
  73. - あるプロセスに割り当てる時間を、runnableなプロセスの個数の関数として計算する
  74. - このときnice値をそのまま計算に使うのではなく、*weight*の計算に使う
  75. - *weight*はあるプロセスに割り当てられる時間の割合を表す
  76. - 優先度の大きいプロセスほど大きい*weight*
  77. - *weight*はnice値の相対的な差によって計算される
  78. - 各プロセスには*targeted latency*(デフォルトでは20ms)に、そのプロセスの*weight*の全体に占める割合を掛けた分だけのtimesliceが与えられる
  79. - *targeted latency*は小さいほど理想に近づくが、小さすぎるとコンテキストスイッチのコストが大きくなる
  80. - 具体例
  81. - *targeted latency*を20msとする
  82. - 2つの優先度の等しいタスクを考える
  83. - このとき、優先度の絶対値によらずそれぞれのプロセスが10msずつ実行される
  84. - 優先度の等しいプロセスが4つなら、5msずつ実行される
  85. - 優先度の等しいプロセスが20個なら、1msずつ実行される
  86. - プロセスの個数が無限だとすると
  87. - 各プロセスのtimesliceは0になる
  88. - スイッチングコストが爆発
  89. - そこで、timesliceに下限を設ける
  90. - この下限を*minimum granularity*という(デフォルトでは1ms)
  91. - これにより、プロセスが無限にあったとしても少なくとも*minimum granularity*ずつは実行される
  92. - プロセスが多くなりすぎると公平でなくなるが、実際のケースでプロセスが少ない場合は完全に公平になる
  93. - 具体例再び
  94. - nice値0のプロセスAとnice値5のプロセスBの2つが実行される状況
  95. - プロセスBのweightが全体の1/3だとする
  96. - targeted latencyを20msとする
  97. - プロセスAには15ms、プロセスBには5msが割り当てられる
  98. - プロセスAのnice値が10で、プロセスBのnice値が15だったとしても同じ結果になる!
  99. - nice値の絶対値は関係ない
  100. - CFSはプロセッサの処理時間の割合を割り当てるので*fiar scheduler*と呼ばれる(完全にfairなわけではないが)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement