オペレーティングシステムの理解]プロセスとLinuxスケジューリング(CFS)
# Intro
Linuxの
CFS 스케쥴러
と프로세스
の特性(I/O, CPU burst bound
など)を理解するために、私が学部プロジェクトでやった仕事を紹介します.プロセスの
vruntime
が重み付けされ、normal, low, high
の優先度がプロセスに与えられる.プロジェクトの目的は、このプロセスの累積値vruntime
と累積値CPU Burst
をグラフィック形式で表示し、結果を分析することである.このため,課題チュートリアルやリストなどを学習し,bootlinとカーネルコードにより
task_struct
およびその他の必要な関数やコードを学習し,sched.h
,fair.c
,stats.h
,make
3種類のカーネルファイルのコードを修正した.カーネルコードを変更した後、
firefox
コマンドを使用してコンパイルとカーネル構築を行い、再起動後、ThunderBird
と프로세스
プログラムを実行し、2つの任意のプロセスを作成します.次に,課題の説明に従って流れの優先度を変更し,約30分間のログを収集し,X線上でグラフィックを計算し解析した.#プロセスとLinux CFSスケジューラの概念
-プロセス
메인 메모리
とは、디스크
に割り当てられて実行中のプログラムを指す.application
のプログラムを実行すると、メモリが割り当てられて実行され、バイナリコードが割り当てられたメモリ領域にアップロードされます.この時点からプロセスと呼ばれます.オペレーティングシステムカーネルを起動する準備ができている場合、ユーザレベルは、ディスクから
자원
をロードすることによって、다중 프로그램 시스템
(メモリ、ファイル、ページング、信号、スタック、...)を割り当てることによって、動作を実行する最小単位を割り当てることができる.OSカーネルは、ユーザー・レベルの要件に応じて準備および作成されます.CPUリソースと効率を最大限に利用するために、
스케쥴링
はCPU burst
フローを採用する.つまり、I/O操作によってCPUが無効になった場合、CPUが何もしないように別のプロセスが割り当てられます.プロセスの実行は、
I/O burst
(CPUが命令を実行する時間、ステップ)、CFS(Completely Fiar Scheduler)
(I/O処理を待つステップ、時間)からなる.-Linux CFSスケジューラ
2007年に発表されたLinuxカーネルスケジューラ
RSDL(Rotating Staircase Deadline)
は、RB-트리
スケジューラのO(logN)
構造に基づく<linux/sched.h>
性能を有するスケジューラである.struct sched_entity
に定義された스케쥴러
というスケジューラユニット構造を用いて情報を格納する.CFSの基本概念は,タスクにプロセッサ時間を提供する際のバランス(公平)を保つことである.これは、プロセスに公平なプロセッサ数を提供することを目標としています.1つ以上のタスクが他のタスクに比べて公平な時間量を持たない場合は、指定したタスクの実行時間が指定したタスクより少なくなければなりません.
CFS
は、パフォーマンスと公平性のバランスを重視します.가상 런타임
は、バランスを決定するために指定されたタスク(가상 런타임
と呼ばれる)で提供される時間量を管理する.タスクのCFS
が小さいほど、すなわちプロセッサへのアクセスが許可される時間が小さいほど、プロセッサに必要な時間が長くなる.また、CFS
には「待機公平」という概念も含まれている.このコンセプトは、現在実行できないタスクが後でプロセッサを必要とする場合に、必要な時間内に対応するプロセッサ時間を取得することを保証します.vruntime(Virtula runtime)
のうちvruntime
は、仮想CPUの使用時間、すなわち優先度(重み付け)のCPU時間を表す.ここで、優先度が高いほどウェイト値が高くなります.最終的に、vruntime
は、実行可能なすべてのプロセスの中で最小のプロセスである.したがって、長時間稼働しないプロセスは比較的小さい(starvation
)ため、vruntime += execution time x (default weight/process weight)
は発生しない.ready queue
すなわち、プロセスの優先度はruntime
に直接並べ替えられないが、vruntime
はスケジューリング演算を考慮するため、(1) /usr/src/linux-4.20.11/include/linux/sched.h
はスケジューリングに影響を及ぼす.#変更されたカーネルソースの説明
sched.h
struct sched_entity {
/* For load-balancing: */
struct load_weight load;
unsigned long runnable_weight;
struct rb_node run_node;
struct list_head group_node;
unsigned int on_rq;
u64 delta_virtualruntime;
u64 exec_start;
u64 sum_exec_runtime;
u64 vruntime;
u64 prev_sum_exec_runtime;
u64 nr_migrations;
struct sched_statistics statistics;
sched_entity struct
のvruntime
からプロセスのdelta_virtualruntime
値を出力するために、fair.c
という新しい変数を宣言し、vruntime
ファイルのstats.h
値を更新するか、delta vruntime
ファイルの(2) /usr/src/linux-4.20.11/kernel/sched/stats.h
値を出力するために使用します.stats.h
#define SAMPLING_VALUE 1000 //#[////////][////////]
static inline void sched_info_depart(struct rq *rq, struct task_struct *t)
{
unsigned long long delta = rq_clock(rq) - t->sched_info.last_arrival;
//#[////////][////////]
if ( (t->nivcsw) % SAMPLING_VALUE == 0 )
{
printk(KERN_INFO "tgid, %d / delta_vruntime, %lld / delta_rrun(CPU_burst), %lld / priority, %d \n",t->tgid, t->se.delta_virtualruntime, delta, t->prio);
}
rq_sched_info_depart(rq, delta);
if (t->state == TASK_RUNNING)
sched_info_queued(rq, t);
}
sched_info_depart
のSAMPLING_VALUE
関数では、define
を1000としてtask_struct
を解析し、bootlinを用いてCPU burst
を解析した.vruntime
およびtask_struct
の値は、プロセススケジューリング1000回で1回だけサンプリングして記録する必要があり、if文が追加された場合、nivcsw
の커널 로그 (tgid / delta_vruntime / delta_rrun(CPU_burst) / priority )
変数(コンテキスト切替回数を格納)を使用して1000回ごとにサンプリングし、sched_info_depart
を出力する.周知のように、
task_struct
関数は、プロセスがCPU占有を完了したときに呼び出され、task_struct
構造ポインタが入力として受信される.식별자(tgid)
構造体の調査により、우선순위(prio)
とsched_entity(se)
、およびdelta_virtualruntime
構造体が以前に私が定義したdelta
値と課題説明で与えられた宣言された「CPU_burst
」値は、(3) /usr/src/linux-4.20.11/kernel/sched/fair.c
値を出力できることがわかる.fair.c
static void update_curr(struct cfs_rq *cfs_rq)
{
struct sched_entity *curr = cfs_rq->curr;
u64 delta_vruntime; //#[////////][////////]
u64 now = rq_clock_task(rq_of(cfs_rq));
u64 delta_exec;
if (unlikely(!curr))
return;
delta_exec = now - curr->exec_start;
if (unlikely((s64)delta_exec <= 0))
return;
curr->exec_start = now;
delta_vruntime = calc_delta_fair(delta_exec, curr);
curr->delta_virtualruntime = delta_vruntime;
curr->vruntime += delta_vruntime;
//curr->vruntime += calc_delta_fair(delta_exec, curr);
schedstat_set(curr->statistics.exec_max,
max(delta_exec, curr->statistics.exec_max));
curr->sum_exec_runtime += delta_exec;
schedstat_add(cfs_rq->exec_clock, delta_exec);
vruntime
ファイルにおいてupdate_curr
のvruntime
関数が更新される.delta vruntime
(累計sched_entity struct
ではなく)を出力および使用できるようにするには、既存のコードを注釈し、delta_virtualruntime
でdelta_vruntime
という変数を使用し、calc_delta_fair
で予め定義したvruntime
、現在の関数で定義したdelta_vruntime
の変数でvruntime
の関数を使用します.結果値(Not累積値)を保存し、先に定義したfirefox
変数(累積vruntime値)を使用して累積保存し、累積値(+=)ThunderBird
を更新します.#CPU burst、vruntimeのグラフィックと結果分析
-駆動プロセスの分析
私が駆動するプロセスには、
CPU-bound
でYouTubeとThunderBird
プログラムを再生し、ユーザーが一定時間内に電子メールの状態を自由に更新できるようにすることが含まれています.Webブラウザによるビデオ再生は、典型的なCPU密集型、CPUバースト型のfirefox
プロセスである.I/O bound
プロセスの主なプロセスは通信のためのI/O動作であり、top
で油管を再生するプロセスと比較してCPU utilization
プロセスに対応する.これはLinuxコマンドCPU burst
を実行し、各プロセスのfirefox
およびNormal
ヒストグラムによって説明される.私が実行しているプロジェクトは、renice
プロセスの優先度を変更することです.-結果グラフィックと実行プロセス
Low
の優先度については、nice
コマンドは単独で実行されなかった(優先度=120).High
の場合、nice
の値は、優先度が130になるように10に変更され、firefox
の場合、Total CPU-burst
の値は、優先度が110になるように-10に変更された.いずれの場合も約30分、log 000を記録した.ログtxtファイルをxlsxファイルに移動し、EXCELのSUM関数とフィルタを使用して206,890,887 / 202,201,824 / 234,100,441
プロセス(PID=3822)の値を取得し、EXCEL上でグラフィックを生成します.Normal priorityLow priorityHigh priorityTotal CPU-burst206,890,887202,201,824234,100,441Total vruntime112,783,692920,048,60110,206,662
(1) Normal priority
(2) Low priority
(3) High priority
-結果分析
Low < Normal < High
の値はnormal priority
であり、vruntime
の順に並べられており、CPU burst
では図形の形状は似ているが、値は異なり、予想値であれば似ているはずだが、そうではない.CFS 스케쥴러
の特性を考慮すると、優先度が高いほどprocess weight
の値が高くなり、最終的にはvruntime
の減少(vruntime += execution time x (default weight/process weight)
)を招き、CFS 스케쥴러
は最小のプロセスを選択する.その結果,優先度(低<正常<高)の順にCPUを用いて演算を行う時間が増加することが分かった.これは,そのプロセスがリソースを割り当てられ,CPUがそのプロセスを実行する命令,すなわちスケジューラがCPUに時間を割り当てることを意味する.vruntime
の値はTotal vruntime
です.112,783,692 / 920,048,601 / 10,206,662
の値とは対照的に,我々が解析したように優先度が高いほどCPU-burst
は小さくなるLow > Normal > High
の順序を見ることができる.図の個数と値から、vruntime
の増分優先度が高いほど増分が遅くなることがわかる.Reference
この問題について(オペレーティングシステムの理解]プロセスとLinuxスケジューリング(CFS)), 我々は、より多くの情報をここで見つけました https://velog.io/@ba159sal/OS-리눅스-새로운-System-Call-추가-vpw772m0テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol