CPU 정책 학습: interactive 분석, 결합 코드

CPU      ,      performance powersave ondemand consertive interactive

다음은 inteactive 코드 를 바탕 으로 상세 하 게 분석 한 견해 입 니 다.
인터넷 에서 검색 한 것 은 비교적 상세 한 것 은:
http://bbs.gfan.com/android-976301-2-1.html
Advantages: + significantly more responsive to ramp cpu up when required (UI interaction) + more consistent ramping, existing governors do their cpu load sampling in a workqueue context, the 'interactive' governor does this in a timer context, which gives more consistent cpu load sampling. + higher priority for cpu frequency increase, rt_workqueue is used for scaling up, giving the remaining tasks the cpu performance benefit, unlike existing governors which schedule rampup work to occur after your performance starved tasks have completed. 장점: 이 모델 은 사용자 와 상호작용 을 할 때 반응 속도 가 빠르다 (즉, 주파수 조절 속도 가 빠 르 고 수시로 프로세서 의 부합 에 반응 할 수 있다). 이로써 더욱 좋 은 사용자 체험 을 제공 할 수 있다 (conservative 모델 반응 속도 가 이보다 느 리 기 때문에 가끔 은 약간 끊 기 는 체험 이 나타난다). 물론 이 를 달성 하기 위해 서 는inteactive 는 더 높 은 프로세서 부하 샘플링 율 을 가지 고 상기 두 가지 조절 방식 을 지양 하 였 으 며, 높 은 부하 시 프로세서 의 주파수 가 수 요 를 만족 시 키 지 못 한 후에 야 주파 수 를 조절 하 였 으 며, inteactive 는 더욱 빠 른 반응 을 보장 하 였 으 며, 주파수 조절기 의 높 은 우선 순 위 를 유지 하여 프로세서 부하 가 높 아 질 때 주파 수 를 빠르게 높 였 다.
그럼 다음 과 같은 의문 이 있 습 니 다.
반응 속도 가 어떻게 빠 릅 니까?
왜 더 높 은 샘플링 율 이 필요 합 니까?더 높 은 것 은 얼마나 많은 샘플링 율 을 말 합 니까?
예 를 들 어 어떻게 주파 수 를 올 리 고 어떻게 주파 수 를 내 리 는 지 설명 합 니까?
결합 코드 분석 전략
cpufreq_interactive_init
5 개의 전역 변 수 를 초기 화 합 니 다.
세 개의 인자:
go_hispeed_load = DEFAULT_GO_HISPEED_LOAD;
min_sample_time = DEFAULT_MIN_SAMPLE_TIME;
timer_rate = DEFAULT_TIMER_RATE;
하나의 대기 열:
/* No rescuer thread, bind to CPU queuing the work for possibly
   warm cache (probably doesn't matter much). */
down_wq = alloc_workqueue("knteractive_down", 0, 1);
작업 스 택:
up_task = kthread_create(cpufreq_interactive_up_task, NULL,
 "kinteractiveup");
go_hispeed_load: 고주파 한도 값 입 니 다.시스템 의 부하 가 이 값 을 초과 하면 주파 수 를 올 리 고 그렇지 않 으 면 주파 수 를 낮 춘 다.구체 적 으로 어떻게 주파 수 를 올 리 고 어떻게 주파 수 를 내 리 는 지 뒤에 소개 합 니 다.
min_sample_time: 최소 샘플링 시간.매번 주파수 변조 결 과 는 적어도 이 시간 을 유지 해 야 한다.
timer_rate: 샘플링 타이머 의 샘플링 율.
down_wq :주파수 강하 대열.주파 수 를 낮 추 는 것 은 대기 열 방식 으로 이 루어 지 며 실시 간 으로 높 지 않 거나 우선 순위 가 낮다.
up_task: 주파수 상승 작업 창고.주파 수 를 올 리 는 것 은 스 레 드 방식 으로 이 루어 지 는 것 으로 주파수 상승 수요 가 있 으 면 즉시 효력 이 발생 하고 실시 성 이 높 으 며 우선 순위 가 매우 높다.
여기까지 인터넷 에서 설명 하 는 '반응 속도 가 빠르다', '주파수 조절기 의 높 은 우선 순 위 를 유지 했다' 는 것 을 이해 할 수 있다.
다음은 어떻게 주파 수 를 올 리 고 어떻게 주파 수 를 내 리 는 지 소개 한다.
주파수 변조 타이머, 타이머 시간 이 고정 되 어 있 으 며, 타이머 주기 마다 다음 과 같은 일 을 완성 합 니 다.
현재 정책 이 상 태 를 유지 할 수 있 는 지 정책 의 유효성 을 검사 합 니 다.
시스템 은 최근 샘플링 주기 내 부하 계산 으로 승강 주파 수 를 결정 하 는 데 사용 된다.
부하 에 근거 하여 승강 주파수 의 판정 을 얻어 내다
주파수 상승 / 하강 의 실시
다음은 이 전략의 정수 입 니 다. 승강 주파 수 를 어떻게 판정 합 니까?
if (cpu_load >= go_hispeed_load) {
	if (pcpu->policy->cur == pcpu->policy->min)
		new_freq = hispeed_freq;
	else
		new_freq = pcpu->policy->max * cpu_load / 100;
} else {
	new_freq = pcpu->policy->cur * cpu_load / 100;
}

여기, 이곳
go_hispeed_load = 816MHz
pcpu->policy->min = 252MHz
pcpu->policy->max = 1416MHz
코드 를 언어 설명 으로 바 꾸 면
1. 시스템 부하 가 부하 한도 값 을 초과 하고 시스템 의 현재 주파수 가 시스템 의 최저 주파수 라면 816 MHz 로 올 라 갑 니 다.
2. 시스템 부하 가 부하 한도 값 을 초과 하지만 시스템 의 현재 주파수 가 최저 주파수 가 아니라면 1416 MHz * 시스템 부하 로 올 라 갑 니 다.
3. 시스템 부하 가 부하 한도 값 을 초과 하지 않 으 면 주파수 가 내 려 갑 니 다. 시스템 현재 주파수 * 시스템 부하, 주파수 감소 여부 또는 현재 주파수 유지 후 자 연 스 럽 게 처리
이에 따라 인터넷 에 서 는 "주파수 조절 속도 가 빠 르 고 수시로 프로세서 의 부합 에 반응 할 수 있다" 고 설명 하면 이해 할 수 있다.
그 다음 에 주파수 상승 이나 주파수 하락 에 대해 새로운 주파수 값 의 확정 은 전략의 다른 부분 이 고 아래 를 본다.
#define CPUFREQ_RELATION_L 0  /* lowest frequency at or above target */
#define CPUFREQ_RELATION_H 1  /* highest frequency below or at target */
이 두 성명 의 역할 은 우리 가 위의 부하 곱 하기 주파수 로 얻 은 주파수 값 을 주파수 목록 에서 해당 하 는 주파수 점 을 찾 을 때 CPU FREQRELATION_L 상한 치 를 취 하 는 것 입 니 다, CPU FREQRELATION_H 하한 치 빼 는 거 야.
위 에서 상한 치 를 제거 하 는 지 하한 치 를 이해 하지 못 하거나 의문 이 있 으 면 코드 를 보 세 요.
struct cpufreq_frequency_table optimal = {
	.index = ~0,
	.frequency = 0,
};
struct cpufreq_frequency_table suboptimal = {
	.index = ~0,
	.frequency = 0,
};

첫 번 째 단계: 두 구조 체 를 초기 화하 고 색인 번호 가 크 며 빈 도 는 0 입 니 다.
switch (relation) {
case CPUFREQ_RELATION_H:
	suboptimal.frequency = ~0;
	break;
case CPUFREQ_RELATION_L:
	optimal.frequency = ~0;
	break;
}

STEP 2: 이 단 계 는 아래 와 결합 하여 함께 봐 야 한다.
for (i = 0; (table[i].frequency != CPUFREQ_TABLE_END); i++) {
	//      ,        
	unsigned int freq = table[i].frequency;
	if (freq == CPUFREQ_ENTRY_INVALID)
		continue;
	if ((freq < policy->min) || (freq > policy->max))
		continue;
	//       
	switch (relation) {
	case CPUFREQ_RELATION_H:
	//   H,     suboptimal.frequency = ~0,optimal.frequency = 0
		if (freq <= target_freq) {
		//          ,          
			if (freq >= optimal.frequency) {
				optimal.frequency = freq;
				optimal.index = i;
			}
		} else {//          ,          
			if (freq <= suboptimal.frequency) {
				suboptimal.frequency = freq;
				suboptimal.index = i;
			}
		}
	break;
	case CPUFREQ_RELATION_L:
		if (freq >= target_freq) {
			if (freq <= optimal.frequency) {
				optimal.frequency = freq;
				optimal.index = i;
			}
		} else {
			if (freq >= suboptimal.frequency) {
				suboptimal.frequency = freq;
				suboptimal.index = i;
			}
		}
	break;
}

세 번 째 단계: 목표 주파수 가 그 주파수 구간 에 대응 하 는 것 을 찾 았 고 상하 한 주파수 값 을 알 았 다.
if (optimal.index > i) {//          
	if (suboptimal.index > i)
	return -EINVAL;
	*index = suboptimal.index;//            ,    
} else
	*index = optimal.index;//    ,     

예 를 들 어:
현재 시스템 주파수 504 MHz, 시스템 부하 한도 값 80, 현재 시스템 부하 90
색인 목록 
252 504 816 1008 1200 1272 1416
시스템 부하 에서 새로운 주파수 (목표 주파수) 를 계산 하 는 것 은?
1416 * 90% , 1272 와 1416 사이 에 1272 MHz 를 취하 다.
Interactive 전략 은 비교적 세밀 하 게 고려 되 었 습 니 다. 시스템 이 최저 주파수, 예 를 들 어 252 MHz 에 있 을 때 약간의 작업 이 시작 되면 시스템 부하 시 100% 가 되 기 때 문 입 니 다. 상기 알고리즘 에 따라 반드시 시스템 의 최고 주파수 로 달 려 가 야 합 니 다.
예 를 들 어 1416 MHz.
그래서 시스템 의 최저 주파수 에 대해 서 는 특별한 처리 가 있 습 니 다.
시스템 이 최저 주파수 에 있 을 때 부하 가 부하 한도 값 을 초과 하여 지정 한 go 로 직접 올 라 갑 니 다.hispeed_load ,예 를 들 어 816 MHz.
이상 은 주파수 상승 알고리즘 입 니 다. 다음은 주파수 하강 값 을 어떻게 결정 하 는 지 보 겠 습 니 다.
시스템 부하 가 부하 한도 값 에 이 르 지 못 하면 주파 수 를 낮 추기 로 결정 합 니 다. 주파수 상승 과 달리 주파 수 는 시스템 의 현재 주파수, 즉 시스템 자체 의 주파수 값 을 사용 하고 부하 백분율 을 곱 하여 새로운 주파 수 를 얻 습 니 다. 즉, 목표 주파수 입 니 다. 마찬가지 로 주파수 색인 목록 에서 적당 한 주파수 값 을 찾 는 것 도 하한 주파수 입 니 다.
예 를 들 어:
현재 시스템 주파수 504 MHz, 시스템 부하 한도 값 80, 현재 시스템 부하 60
색인 목록 
252 504 816 1008 1200 1272 1416
시스템 부하 에서 새로운 주파수 (목표 주파수) 를 계산 하 는 것 은?
504* 60% ,252 와 504 사이 에 252 MHz 를 취하 다.
주파수 변조 와 압력 조절 은 동적 압력 변조 DVFS 입 니 다.
주파수 가 확정 되면 대응 하 는 arm 과 logic 전압 도 확정 된다.
만약 주파 수 를 올 리 는 것 이 라면, 먼저 압력 을 올 리 고, 후에 주파 수 를 올 린 다.
만약 주파 수 를 낮 추 는 것 이 라면, 먼저 주파 수 를 낮 추고, 후에 압력 을 낮 추 는 것 이다.

좋은 웹페이지 즐겨찾기