오늘 아침에 일어나 곰곰히 생각하다 인터럽트 파트와 타이머 파트가 겹쳐지면서 또 다시 엄청난? 난관에
봉착하게 되었습니다.
현재 저는 local_irq_disable()이 이를 호출한 프로세서의 모든 인터럽트를 금지한다고 이해하고 있습니다.
그리고 시스템 타이머 인터럽트에의해 지피값이 갱신 되고 이 지피 값을 이용해 시스템 구동시간, 타임 아웃이
계산 된다고 합니다.
SMP 시스템에서 특정 프로세서의 모든 인터럽트를 금지 시켰을 때 이 프로세서에서는 더 이상 시스템 타이머
인터럽트가 발생하지는 않겠지만 다른 프로세서가 시스템 타이머 인터럽트를 핸들링 할테니 문제는 없어보입니다.
하지만 UP 시스템에서 local_irq_disable()을 호출 하면 시스템 타이머 인터럽트도 금지 될테고 구동시간, 타임 아웃
등등... 시스템 타이머 인터럽트에 기반한 모든 동작들이 잘못된 동작을 하게 되지 않을까 생각합니다.
물론 local_irq_disable()이 아주 짧은 구간동안 매우 적은 회수로 호출이 된다면 오차가 심각한 문제가 되지 않을지도
모르겠지만 local_irq_disable()이 빈번하게 호출되며 호출 기간이 상당히 긴 경우 오차는 매우 심각한 문제가
될것으로 생각됩니다.
그래서 내린 결론이 UP 시스템에서 local_irq_disable()은 최소한 시스템 타이머 인터럽트는 금지 할 수 없으며
대신에 시스템 타이머 인터럽트 핸들러의 동작이 달라지지(예를들어 스케줄러는 동작하지 않아도 시스템 시간은
갱신 되는)않을까 합니다.
시원한 답변 부탁 드립니다.
댓글 6
-
김윤기
2011.04.25 10:25
-
홍문화
2011.04.25 13:13
ARM 기반에서는 time tick 간격이 10ms 이니 무슨일이 있어도 이 시간안에 처리를 해야겠네요.
이거 local_irq_disable() 구간 마다 시간을 잴수도 없고 켘
-
김윤기
2011.04.25 13:55
10ms면 인터럽트 핸들러 처리하기엔 충분히 긴 시간입니다 ㅋㅋㅋ
-
이종인
2011.04.25 14:23
제 생각으로는 모든 프로세서의 인터럽트를 비활성화 하는 함수는 비효율적이라서 쓰지 않는 추세로 갈 것 같습니다...(그렇겠죠?)
만약 UP에서 local_irq_disable()함수를 호출 하여서 모든 인터럽트(타이머 인터럽트 포함)를 막고 커널 개발자가 실수로 local_irq_disable()함수를 호출 할 경우 시스템이 전체적으로 오작동 하지 않나? 라는 말씀 이신 것 같은데요, 제 생각으로는 타이머 인터럽트 시 마다 jiffies에 값을 지속적으로 저장하기 때문에 늦게 타이머 인터럽트가 걸린다면 전체적인 시스템이 늦게 반응 하지 않을까 라는 생각이 듭니다. (물론 타임 크리티컬한 작업일 경우는 오작동 할 것 같습니다.)
-
이종인
2011.04.26 00:46
아 그렇군요; 책 보니까 헷갈리게 번역 하셨네요 ㅠ.. 특정 프로세서 하나의 모든 인터럽트를 비활성화 네요 ㅋ
-
홍문화
2011.04.25 21:19
"특정 프로세서의 모든 인터럽트를 비활성화"를 "모든 프로세서의 인터럽트를 비활성화"로 잘못 쓰신걸로 판단 됩니다. ^^;
.
그래서 인터럽트를 top과 bottom으로 나뉘어서 top 쪽에는 정말 간단한 처리를 해야 되는걸로 생각되네요
인터럽트 핸들러에서 많은 처리를 하게 되면 그만큼 시간이 지연되거든요 ㅋㅋㅋ
그리고 local_irq_disable() 이 빈번하게 호출되도 time tick 안에 인터럽트의 top half 부분이 끝나버리면 시스템에 그다지
큰 무리가 될지 않을 것으로 생각됩니다.