타이머. [165] DATE : 2015-05

Download Report

Transcript 타이머. [165] DATE : 2015-05

Timer
15.03.03
CSLAB
Park, Jin hui
Contents
1. 커널의 Timer
2. Hz
3. 지피
4. 하드웨어 시계와 타이머
5. 타이머 인터럽트 핸들러
6. 날짜와 시간
7. 타이머
8. 실행지연
2
커널의 Timer
커널의 Timer
• 커널 함수는 시간 기반 동작
• 시스템 하드웨어
- 커널이 시간을 이해하고 관리하는 데 필요한 도움을 줌
- System timer 제공
- Tick 값을 사용해 현재 시간과 가동시간 기록
진동수(미리 설정 된 주
파수 마다 울림)가 울림
Time Interrupt
발생
진동수(미리 설정 된 주
파수 마다 울림)가 울림
Time Interrupt
발생
Tick
• Wall time
- 사용자 공간 어플리케이션에 제공하는 시간정보
• 시스템 가동시간
- 시스템 시작 이후의 상대적인 경과시간
3
커널의 Timer
Timer Interrupt
• Timer Interrupt를 통해 주기적으로 실행되는 작업들
- 시스템 가동시간 갱신
- 현재 시간 갱신
- 대칭형 다중 프로세서 시스템은 스케줄러 실행 큐 간의 균형을 조절
- 설정 시간에 다다른 동적 타이머를 실행
- 자원 사용 현황과 프로세스 시간 통계 갱신
4
진동수 : Hz
Hz
• 시스템 시작 시 Hz의 값에 의해 타이머의 빈도수가 정해짐
• 지원 아키텍처 별로 다른 값을 가짐
- 일부 아키텍처는 장비 유형에 따라 다름
• 주기 : 1/Hz,
- 예 ) x86, Hz : 100, 타이머 인터럽트의 주파수는 100Hz
- 초당 100회 발생(1/100초이므로 10밀리초마다 발생)
• Timer interrupt 주파수(p.321 표 11.1)
• 코드 구현 시 특정 Hz 값으로 고정해 구현하면 안됨
5
진동수 : Hz
이상적인 Hz 값
• 1000Hz 였던 2.5 개발 버전에서 논쟁거리가 되었음
• 사용자가 Hz를 지정해 컴파일 가능
- 그러나 시스템 전체에 영향을 끼침
큰 Hz의 장점
• 정교한 해상도와 향상 된 높은 정확도로 커널 타이머 실행
• Poll(), select() 등 타임아웃 값을 사용하는 시스템 호출을 정밀히
사용
- 타임 아웃 시간 후에도 타이머 인터럽트를 기다림 -> 오차 발생
• 자원 사용률, 시스템 가동시간 등 측정값을 세밀히 기록
• 프로세스 선점의 보다 더 정확한 처리
- 프로세스의 타임 슬라이스 값이 타이머 인터럽트로 처리
- 인터럽트를 기다릴 시 지연 시간 발생
6
진동수 : Hz
큰 Hz의 단점
큰 Hz 값,
타이머 인터럽트 발생
빈도 증가
타이머 인터럽트 핸들러
실행 시간 증가
다른 작업 시간 감소
프로세서 캐쉬 정보의 잦
은 소실, 전력 소모증가
• 1000Hz까지는 성능을 크게 해치지 않는 것으로 결론
7
지피(Jiffies)
지피(Jiffies)
• 전역변수
• 시스템 시작 후 발생한 tick(진동수=타이머 인터럽트 발생 수)가
저장 됨
• 시스템 시작 시 0으로 초기화
• 이후 tick 발생 시 +1
• Jiffies/Hz 로 시스템 가동시간을 구함
- 예 ) 100Hz일 경우 초당 Hz회 타이머 인터럽트 발생
- Jiffies = 1000000일 경우 1000000/100
- 10000초 실행 되고 있음을 알 수 있음
8
지피(Jiffies)
지피(Jiffies)
• 지피 변수 선언
• 다른 초로 바꿀 때
9
지피(Jiffies)
지피의 내부 표현
• Unsigned long 형이므로 32bit 아키텍처에선 32bit, 64bit
아키텍처에서는 64bit
• 기존 커널 코드와 호환성을 위해 고안해낸 내부 표현 방식
- Jiffies = jiffies_64;
Jiffies_64(64비트의 jiffies)
32비트의 jiffies
- 이 때 jiffies 변수를 사용한 코드는 하위 32비트만 사용함
10
지피(Jiffies)
지피 값 되돌아감
• 최대 저장 한계를 초과할 경우 자릿수 넘침 현상 발생
• 32bit unsigned 경우 최대 2^32-1(4294967295)
• 카운터 값이 최대가 되면 0으로 돌아감
11
하드웨어 시계와 타이머
하드웨어 시계와 타이머
• 시간 기록을 위해 두 가지 하드웨어 장치를 제공
• 실시간 시계(RTC)
- 시스템 시간을 저장하는 비 휘발성 장치
- 시스템 기판에 붙어있는 작은 배터리를 통해 시간 기록
· RTC와 CMOS통합
· 실시간 시계 동작 및 BIOS 설정도 보존
- 시스템 시작 시 RTC를 읽고 현재 시간 초기화
• 시스템 타이머
- 주기적으로 인터럽트 발생시키는 체계 제공
- X86의 경우 설정 가능한 인터럽트 타이머(PIT)가 주 시스템 타이머
- APIC타이머와 프로세서의 타임스탬프 카운터도 있음
12
타이머 인터럽트 핸들러
타이머 인터럽트 핸들러
• 아키텍처 종속적 부분
- 시스템 타이머의 인터럽트 핸들러 형태로 되어있음
· Jiffies_64 및 현재 시간을 저장하는 xtime변수에 안전하게 접근하기 위해
xtime_lick을 얻음
· 필요에 따라 시스템 타이머의 확인 및 재설정
· 갱신 된 현재시간을 주기적 반영
· 아키텍처 종속적 타이머 함수인 tick_periodic() 호출
통계 값 갱신
Jiffes_64값을 증가시킴
Update_Wall_time() 진동수에 맞춰 현재 시간 갱신
Calc_global_load() 시스템의 평균 로드 통계 계산
13
날짜와 시간
날짜와 시간
• 현재 날짜와 시간은 kernel/time/timekeeping.c 파일에 저장
• Timespec 구조체
선언(<linux/time.h>,<kernle/time/timekeeping.c>
• Xtime 변수를 갱신하기 위해서 xtime_lock 사용
• Xtime의 값을 읽을땐 read_seqbegin(), read_seqretry()사용
14
타이머
타이머
•
•
•
•
동적 타이머 또는 커널 타이머라고 불림
커널 코드상에서 시간의 흐름을 관리하는 데 필수
작업을 지정된 시간만큼 미룰 때 사용
타이머의 사용
- 초기화 작업
- 만료 시간 및 만료 시 실행할 함수를 지정 후 타이머 활성화
- 만료 후 지정 된 함수 실행
15
타이머
타이머의 사용
• 타이머는 <linux/timer.h>에 정의 된 구조체로 표현
타이머 연결 리스트 항목
Jiffies 단위로 표시된 만료 시간
타이머 핸들러 함수
핸들러 함수에 넘어가는 인자
타이머 내부 처리용 항목, 사용x
• 타이머의 만료시간을 지정함(진동수의 절대값)
• 타이머 활성화 및 만료 시간 수정 삭제
16
타이머
타이머 경쟁조건
• 경쟁조건이 발생할 수 있는 상황
- 작업을 단순한 mod_timer() 함수로 처리하는 것은 다중 프로세스
장비에선 안전하지 않음
- 대부분의 경우에 del_timer()보다는 del_timer_sync() 함수 사용
- 사용하는 공유 데이터의 보호가 필요
· 커널은 타이머 함수를 비동기적으로 실행함
타이머의 구현
• 타이머 인터럽트가 끝난 후반부 처리 컨텍스트에서 타이머 핸들러
실행
여기서 부른다는 run_local_timer() 는 어디..?
•
run_local_timer()에서
run_time_softirq()함수 호출
-> 프로세스의 만료된 타이머 모두 실행
17
실행지연
실행지연
• 타이머나 후반부 처리를 사용하지 않고 일정시간 실행을 지연시킬
경우
• 이런 상황에서 지연 작업에 따른 해결책이 따로 있음
• 루프 반복
- 가장 간단한 해결책
- 필요 지연시간이 짧거나 정밀도가 그다지 중요하지 않을 때 사용
- 원하는 클럭 진동수가 지날 때까지 루프 반복
Unsigned long timeout = jiffies + 10;
While(time_before( jiffies, timeout))
;
- 예를 들어서 이렇게 할 수 있음
- 지연시간 동안 무의미한 루프를 도므로 다른 작업을 수행하지 못 함
18
실행지연
• 현재 프로세스를 재스케줄링하는 방법
• 작은 지연
- 짧지만 정확한 지연 시간이 필요할 경우
- 하드웨어와의 동기를 위해 1ms 이하의 지연시간을 가질 경우
- Udelay() : 지정한 마이크로초만큼 루프 반복
19
실행지연
•
Schedule_timeout()
- 해당 작업을 지정한 시간이
지날 때까지 휴면상태로 전환
- 타이머가 만료 시
Process_timeout()호출
- 현재 테스크의 상태 :
TASK_INTERRUPTIBLE
TASK_UNINTERRUPTIBLE
다른 테스크를 선택함
- 이후 process_timeout실행
-
해당 task를 TASK_RUNNING
으로 변경
- TASK가 깨면 타이머 제거
•
만료시간을 가지고 대기열
휴면
- 자신을 휴면 대기열에 추가
- 원하는 조건 발생시
Wake_up()함수 호출
20