본문 바로가기
잡동사니

CPU 프로세스 우선순위 변경에 따른 CPU 실제사용시간 비교

by L3m0n S0ju 2021. 11. 3.

 

 

과제 목표

 

이번 과제의 목표는 CPU 스케줄링에서 프로세스의 우선순위를 변경함에 따라 CPU burst vruntime이 어떻게 변하는지 알아보는 것이다. CPU 스케줄링이란 프로세스에게 CPU 사용시간을 분배하는 방식이다. CPU 스케줄링에서 CPU burstCPU 실제사용시간을 나타내는 것이고 vruntime은 지정된 우선순위를 CPU burst에 적용한 유사CPU 실제사용시간이다. CPU스케줄링은 각 장비의 용도에 따라 다른데 리눅스는 CFS(Completely fair scheduler)라는 방식을 사용한다. 해당 스케줄링 방식은 프로세스의 CPU 할당 시간에 대한 공평성을 중요시하는 방식인데 우선순위 기준으로 vruntime을 사용한다. 사용자가 지정하는 Priority를 생각하지 않는다면 vruntimeCPU 사용시간 누적 합이고 스케줄러는 vruntime이 작은 프로세스에게 우선순위를 부여한다고 간단히 말할 수 있다. 사용자가 Priority를 지정한다면 vruntime을 계산할 때 아래와 같은 식을 사용한다. execution time CPU burst를 나타낸다.

 

vruntime += execution time * (default weight/process weight)

 

예를 들어 사용자가 Priority를 높게 지정하면 vruntime은 낮아지게 되고 낮을수록 우선순위가 높아지므로 CPU를 우선적으로 사용할 수 있게 된다.

 

 

 

 

 

 

그래프 및 결과 분석

 

아래 그래프는 firefox – new-window라는 프로세스에 대해서 분석한 결과이다. 각각 30분 정도 측정하였고 firefox를 이용해 유튜브에서 동영상을 실행하면서 cpu burstvruntime을 측정하였다.

 

Priority를 지정하지 않은 CPU burst(execution time) vruntime 분석 결과는 위 그래프와 같다. Priority를 지정하지 않았지만 CPU burst 시간이 vruntime 보다 많으므로 프로세스가 생성될 때 Priority가 이미 기본 Priority 보다 높게 설정되었음을 추측할 수 있다.

 

 

두 그래프를 보면 결과가 반대로 되어있다. Priority를 높게 지정하면 vruntime이 낮아져야 하는데 오히려 vruntime 높아지고 Priority를 낮게 지정하면 vruntime이 높아지는 현상이 발생하고 있다. 해당 현상을 설명할 수 있는 원인은 CPU 자원에 여유가 있어 프로세스 간에 경쟁이 없었다고 추측할 수 있다.

 

 

 

 

 

코드분석

 

 

update_curr()

해당 함수는 curr을 업데이트하는 함수이다. vruntime 누적 합은 계산할 수 있지만 delta_vruntime을 계산하기 위해서 아래와 같은 코드를 추가한다. delta_vruntime은 이후 해당 구조체에 추가할 예정이다.

 

curr->delta_vruntime = calc_delta_fair(delta_exec,curr);

 

sched_entity

해당 구조체에 u64 delta_vruntime을 추가한다.

 

sched_info_depart()

해당 함수에 아래와 같은 코드를 추가한다.

 

if((t->sched_info.pcount) % 1000 == 0)

           printk(“tgid”, %lu, delta_vrun, %llu, delta_rrun, %llu, prio, %d”,t->tgid, t->se.delta_vruntime, delta, t->prio);)

 

t task_struct 구조체를 가르킨다. 따라서 t에 저장되어 있는 프로세스가 cpu에 올라간 횟수 t->sched_info.pcount1000 단위로 if문 안의 printk함수를 출력한다. printk 함수는 여러가지 변수들을 출력하는데 task_struct에 있는 tgid, task_structse안에 있는 delta_vruntime, delta real runtime을 나타내는 delta, 우선순위를 나타내는 t->prio를 출력한다.

 

 

 

 

 

과제수행 시 문제점

 

1.     우선순위를 적용하지 않았으므로 CPU_burst vruntime이 같은 것이라 예상했는데 CPU_burst가 더 높게 측정됨.

 

2.     Priority를 높이면 vruntime이 낮게 측정되어야하는데 오히려 높게 측정되고 반대로 Priority를 낮추면 vruntime 낮게 측정되는 현상이 발생함.

댓글