아래 인터벌 타이머에 대한 이야기가 나와서 하는 말인데,
인터벌 타이머는 시스템 프로그래밍 영역이야, 적절한 시스템 콜로 구현되어있어,
이건 사용자 영역에서 해결할 수 있는 사항이 아냐,
예를 들어 2초마다 콜백으로 aaa 라는 기능을 실행한다고 치자
초보들은 이렇게 구현하는 경우가 있어(의사코드로 적으면)
while (true) {
callback_aaa();
sleep(2초);
}
제대로 작동하는거 같지만 이렇게 하면 내가 교수면 0점 준다,
왜냐하면 callback_aaa를 실행하는동안 block이 발생하거나 컨텍스트스위칭이 발생하거나 혹은 preemption가 발생하거나, 혹은 정상처리하는데 1ms가 발생한다면?
루프가 1천번만 돌아도 결국에는 오차가 상당한 수준으로 벌어진다,
그래서 저렇게 프로그래밍을 하면 안돼
그래서 운영체제는 항상 일정 시간마다 작동시킬 수 있는 인터벌 타이머 기능을 제공하지
만일 callback_aaa에서 재수가 없어서 0.5초가 걸렸다고 해도 인터벌 타이머는 상관없이 무조건 2초마다 실행될 수 있도록 보장해주는거야
물론 정밀도란 개념이 등장하는데, 정밀도가 10us라면, 인터벌 타이머의 간격에 10us이상의 오차가 발생하지 않도록 보장해줘
결론은 인터벌 기능을 사용하고 싶으면 사용자가 구현할 생각은 버려, 인터럽트 발생은 유저 레벨에서는 구현할 수도 없을뿐더러
아무리 쌩쑈를 해도 정밀도를 보장받지 못해
아는데 테트리스에서 굳이;; - return 0;
SIGALAM인가 쓰셈 ㅋ
시그널 핸들러 박으시구요~
시그널 알람을 쓰면 100점 만점에 50점 정도는 줄수 있지, 하지만 이것도 정상적인 방법은 아니야
정상적인 방법은 뭐에요? 몰라요
사실 응용프로그래머면 언어가 제공하는 라이브러리 쓰는게 답인데 그게 아니고 직접 구현해야하면?
위에 써놨듯이 정상적인 방법은 운영체제에서 제공하는 시스템콜을 쓰는게 정답이지, 시스템콜을 안쓰고는 구현할 수 없는 기능이니까