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