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 전압 도 확정 된다.
만약 주파 수 를 올 리 는 것 이 라면, 먼저 압력 을 올 리 고, 후에 주파 수 를 올 린 다.
만약 주파 수 를 낮 추 는 것 이 라면, 먼저 주파 수 를 낮 추고, 후에 압력 을 낮 추 는 것 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바스크립트로 타이머 만들기JavaScript와 HTML만 사용하여 간단한 타이머를 만들어 보겠습니다. 먼저 인터페이스를 만들고 HTML만 사용하여 간단한 작업을 수행합니다. HTML 구조에서 시간 정보를 표시하기 위해 일부span가 생성되었...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.