최소양 2020. 5. 8. 16:46

참조

https://ja.osdn.net/projects/linux-kernel-docs/wiki/FrontPage [리눅스 커널 해독실]

http://acornpub.co.kr/book/linux-kernel-3rd [리눅스 커널 심층분석]

 

 

1. 리눅스에서 타이머의 역할

리눅스 커널의 타이머는 크게 2가지 목적을 위해 사용됩니다.

(1) 정확한 시간을 기록하기 위해

(2) 일정 시간이 지난 후 지정한 처리를 실행하기 위해

 

리눅스 커널은 일정한 간격으로 하드웨어 인터럽트(타이머 인터럽트)를 발생시키는 하드웨어 장치(시스템 타이머)를 이용하여 위에서 말한 2가지 작업을 수행합니다.

 

위에서 언급한 일정 시간이 지난 후 지정한 처리를 하는 것은 여러 가지 용도로 사용됩니다. 예를 들면, 네트워크에서 통신에 문제가 생겼을 때에, 어느정도 시간이 지난 후, 재전송을 할 것인가의 처리, 응답이 없는 장치에 대한 재실행처리, 인터럽트를 발생시키는 것이 불가능한 장치에 대하여 어느 정도의 간격으로 폴링처리(일정 간격으로 해당 장치에 접근하여 상태를 확인하거나 데이터를 받는 작업)를 이용할 것인가 등으로 이용됩니다.

 

 

 

2. 리눅스에서의 타이머의 종류

리눅스에서의 타이머는 크게 2종류가 있습니다.

(1) 글로벌 타이머

(2) CPU 로컬 타이머(동적 타이머 또는 커널 타이머라고도 부릅니다)

 

글로벌 타이머는 시스템 전체에 관련된 처리를 합니다. 글로벌 타이머 인터럽트는 시스템 타이머에 의하여 주기적으로 발생되며, 시스템상에 있는 CPU 중 하나에 의해서 인터럽트가 발생했다는 것이 통지됩니다.

 

반면 CPU 로컬 타이머는 특정 CPU에 관련된 처리를 합니다. 또한, CPU 로컬 타이머는 2단계로 처리됩니다.

1단계 : 하드웨어 인터럽트 핸들러에 의한 동작 부분(Top half) 처리

2단계 : 소프트웨어 인터럽트 핸들러에 의한 동작 부분(Bottom half) 처리

응답성이 중요한 부분은 1단계에서, 나머지 부분은 2단계에서 처리합니다.

 

 

 

2-1. 글로벌 타이머

글로벌 타이머인 인터럽트 핸들러(do_timer함수), 시스템의 시간의 흐름을 기록하는 것이 목적입니다. 시스템 타이머에 의하여 글로벌 타이머 인터럽트가 발생되면, 이를 받은 CPU에 의하여 글로벌 타이머 인터럽트 핸들러(do_timer함수)가 불려집니다.

do_timer함수는 지피 값(시스템 시작 이후 발생한 글로벌 타이머 인터럽트의 횟수)을 증가 시키고, 현재 시간은 갱신(update_wall_time함수)시키고, 시스템의 평균 부하를 계산(calc_global_load함수) 한다.

위의 설명에 연관된 지피(jiffies), HZ, tick(연속해서 발생한 글로벌 타이머 인터럽트 사이의 경과시간) 에 대한 설명은 나중에 다른 글에서 다루기로 하겠습니다만... 지금 궁금하신 분들은 아래의 링크에서 설명을 읽어보시면 좋을 듯 합니다.

http://rousalome.egloos.com/9998132

 

https://elixir.bootlin.com/linux/v2.6.39.4/source/kernel/time/timekeeping.c#L1024

/*
 * The 64-bit jiffies value is not atomic - you MUST NOT read it
 * without sampling the sequence number in xtime_lock.
 * jiffies is defined in the linker script...
 */
void do_timer(unsigned long ticks)
{
	jiffies_64 += ticks;
	update_wall_time();
	calc_global_load(ticks);
}

 

 

2-2. CPU 로컬 타이머

동적 타이머 또는 커널 타이머라고 부르기도 하는 이 타이머는 커널 코드상에서 시간의 흐름을 관리하는 데 필수적인 요소입니다. 커널 코드에서는 특정 함수의 실행을 얼마 이후로 미뤄야 하는 경우가 많습니다. 이때 사용되는 것이 CPU 로컬 타이머입니다. 이 타이머의 사용은 초기화 작업을 한 다음, 만료 시간과 만료되었을 때에 실행될 함수를 지정하고 타이머를 활성화 시키는 것으로 가능합니다. 이 타이머는 반복되지 않으며, 만료된 이후 소멸됩니다. 이름이 동적이라는 말이 붙는 이유는 이 때문입니다. 이 타이머는 수시로 생성되고, 소멸되며, 타이머 개수의 제한은 없습니다.

 

http://rousalome.egloos.com/10001942