-
Timer대학/시스템소프트웨어 2022. 10. 22. 22:57
- RTC (Real-Timer Clocks)
컴퓨터 시스템의 시간, 날짜 등을 추적하는 장치로, 1초에 한 번 실행하여 시간을 추적한다.
1초에 한 번 실행되는 이유는, 메인보드에 있는 베터리 전력을 아껴쓰기 위해서이다.
(전원이 꺼져있어도 수행되어야 하기에 보조 베터리를 쓰는데, 이게 크기가 작음)
- System Clock
System Clock는 시스템의 전원이 공급되는 순간 RTC에 저장된 시간 정보를 가져와 초기화된다.
그 후, PIT(Programmable Interval Timers)가 일정 주기마다 Timer interrupt(tick)를 발생키시는데,
이를 CPU가 캐치하여 System Clock의 값을 증가시킨다.
즉, PIT가 발생시키는 Timer interrupt는 가장 중요한 interrupt인 셈이다.
(참고로 PIT은 timer interrupt를 발생시키기 위해 고안된 별도로 동작하는 timer chip이다)
- Timer service
gettimeofday()와 같은 시스템 콜 함수는 micro second 단위까지 현재 시간을 가져오는데,
이런 함수들은 kernel이 메모리 상에서 관리하는 system clock에서 그 값을 읽어온다.
사실 모든 프로세스들이 PIT에서 직접적으로 시간을 받을 수 있으면 좋겠지만, 모든 프로세스가 동시에 PIT에 접근할 수 없으므로,
kernel이 system clock을 관리하고 프로세스는 system clock에서 timeout 형태로 받도록 구현되어 있는데,
이런 구현방식을 soft-timer 라고 부른다.
여담이지만, SIGALRM 시그널은 default action이 프로세스를 종료하는 것이다.
따라서 시그널 핸들러를 걸어주는 것이 바람직하다.
- Timer
struct sigaction action; struct itimerspec value; timer_t timerid; action.sa_flags = SA_SIGINFO // to use sa_sigaction actiom.sa_sigaction = sigHandler; sigemptyset(&action.sa_mask); sigaction(SIGALRM, &action, NULL); timer_create(CLOCK_REALTIME, NULL, &timerid); value.it_interval.tv_sec = 1; // 1초에 한 번 SIGALRM 시그널 발생되게끔 설정 value.it_interval.tv_nsec = 0; // it_valur 값이 설정 안되어 있으므로 0으로 설정된 것과 동일 = 대기 없이 바로 실행 timer_settime(timerid, 0, &value, NULL); while (1) pause();
위 코드는 1초에 한 번 SIGALRM 시그널이 발생하게 하고, SIGALRM 시그널을 sigHandler가 캐치하도록 구현한 코드이다.
여기서 sa_flags를 SA_SIGINFO로 설정했는데,
Timer를 사용할 때 핸들러를 등록하려면, sa_handler 가 아닌 sa_sigaction에 등록해야 하는데, sa_sigaction을 사용하기 위해
SA_SIGINFO 플래그를 걸어준 것이다.
itimerspec 구조체 안에 it_interval, it_value 멤버가 있는데,
각각 timer를 주기적으로 발생시킬 시간과 처음 expired되는 시간을 적어주는 것이다.
만약 it_interval 이 0이라면, SIGALRM이 처음만 발생하고 이후에는 발생하지 않게 된다.
timer_create 함수 안에 NULL을 집어넣은 자리에는 사실 sigevent 구조체가 들어가야 한다.
다만, 이 부분이 NULL일 경우에는 Timer가 생성하는 기본 시그널이 SIGALRM이 된다.
만약 이 구조체(evp 라고 하자)의 멤버 sigev_signo에 다른 시그널 번호를 넣어준다면,
Timer expire시에 SIGALRM 대신 그 시그널이 발생한다.
(e.g. evp->sigev_signo = SIGINT: SIGALRM 대신 SIGINT 발생)'대학 > 시스템소프트웨어' 카테고리의 다른 글
Threads (0) 2022.12.11 Inter-Process Communication (2) 2022.10.23 Exceptional Control Flow 2 - Signal (0) 2022.10.22 Exceptional Control Flow 1 - Process (0) 2022.10.22 System-Level I/O (0) 2022.10.22