임베디드 리눅스 커널은 공개 소스 기반으로 다수의 개발자들이 참여하여 개발되어온 역사에 따라 실시간성을 높이기 위한 응답성을 중시하기 보다는 안정성과 처리량을 중시하는 것은 이미 알려진 사실입니다. 이에 따라 개발자들이 개발 당시의 커널 곳곳의 코드에 안정성을 높이기 위한 긴 락 구간(longheldlocked region)이 많이 있는 편이라 할 수 있습니다. 이러한 긴 락 구간은 커널이 선점형 커널이라 할지라도 긴 락 구간 내의 태스크들은 선점할 수가 없고 시스템의 응답성이 현저히 줄어들 수 밖에 없으므로, 이러한 코드 구간을 실험을 통하여 찾아내어가능한 경우에 짧은 응답시간을 갖도록 락 구조를변경하도록 해야합니다. 이 방법은 임베디드 리눅스 커널의 응답성을 높이는 데 공헌을 많이 하고는 있으나, 이 구간을 실험적으로 찾아내기가 어렵고 찾아낸다 하더라도 때에 따라서는 락 구조를 변경할 수 없는경우가 있어 쉽지 않은 실시간 지원 방법이기도 합니다. 일반적으로 실험적으로 이러한 긴 락 구간을 찾아본 결과 비교적 가상 파일 시스템 관련 코드가 주 수정 대상입니다. 다음은 수정된 의사코드의 한 예 입니다.
void prune_dcache(int count)
{
DEFINE_RESCHED_COUNT;
redo:
spin_lock();
for(;;) {
…
if (TEST_RESCHED_COUNT(100 )) {
RESET_RESCHED_COUNT ();
if (conditional_schedule_needed ()){
spin_unlock ();
unconditional_schedule ();
goto redo;
}
}
}
…..
spin_unlock();
}
이 코드는 dcache.c라는 데이터 캐시 제어 부분으로, 사용되지 않는 데이터 블록을 디스크로 보내는 역할을 합니다. 이때, 코드 내에서 데이터 블록을 다 보낼 때까지 무한루프를 수행하는데, 계속 수행하지 않고, 루프를 돌다 특정 횟수가 되면 선점될 필요가 있는지의 여부를 자체적으로 검사하여 필요한 경우 선점이 이루어지도록 하고 있습니다. 이렇게 커널내부를 전체적으로 선점형으로 하지 않아도, CPU를 많이 소모하는 커널 코드를 수정해줌으로써 실질적인 빠른 응답성의 효과를 얻도록 하고 있는 것 입니다.