2009년 04월 03일
선점형/비선점형 멀티태스킹...그리고 Synchronize
윈도우즈95 이후 현재의 비스타까지의 윈도우즈는 선점형 멀티태스킹을 지원한다.
선점형은 비선점형에 비해 여러가지 장점이 있다고 알려져 있다.
그런데 일반 사람들은 이 둘의 차이를 잘 모르고 '아~ 좋은 거구나' 하고 넘어가는 경우가 많다.
그리고...심지어는 프로그래머조차도 이 둘의 차이를 잘 모르는 경우가 있다.
손전등 한개만 가지고 어두운 곳에서의 야간 공사를 할 경우, 한사람이 손전등을 가지고 작업을 하는 동안 다른 사람들은 작업을 할 수 없을 것이다.
누군가가 작업을 하고 있는데 다른 사람이 손전등 좀 달라고 할 때 '좀 기다려봐 나 아직 안 끝났어' 하고 손전등을 넘기지 않으면 손전등을 가지고 있지 않은 사람은 답답해도 그냥 기다릴 수 밖에 없는 경우가 선점형이다.
누구든 손전등을 먼저 잡은 사람이 장땡인 것이다.
그런데 만약 손전등을 달라고 하는 사람이 사장님이면 어쩔 것인가? 손전등을 줄 수 밖에 없을 것이다. 이것이 비선점형이다. 먼저 손전등을 집었어도 사장님이 달라고 하면 넘겨줘야 하는 것이다.
단일 쓰레드 환경에 익숙한 사람들은 비선점형 멀티태스킹까지는 쉽게 이해한다.
비선점형 멀티태스킹에서 태스크를 어떤 특정 이벤트가 발생했을 때 처리되는 독립적인 함수라는 식으로 생각을 확장하기도 한다. 일단 함수가 호출되면 다른 함수들은 그 함수가 처리되기 전까지는 기다려야 하고 호출된 함수는 다른 함수들을 고려할 필요가 없는 것이다. 비선점형에서의 태스크와 비슷하지 않는가?
그렇지만 선점형 멀티태스킹은 이런 식으로 생각 할 수가 없다.
태스크를 수행하고 있다가도 자신보다 우선순위가 큰 태스크가 제어권을 요청하면 제어권을 넘겨야하는 것이다.
제어권 요청 순서는 동일 우선순위 태스크일 경우에만 중요할 뿐 우선순위가 다르다면 아무런 의미가 없다.
그림을 그리는 태스크와 그림을 액자에 넣어 벽에 거는 태스크가 있다.
직감적으로 알 수 있듯이 그림을 그리는 태스크가 그림을 액자에 넣어 벽에 거는 태스크보다 시간이 더 오래 걸린다.
그런데 만약 그림을 액자에 넣어 벽에 거는 태스크가 우선 순위가 높다면 어떤 일이 벌어질까?
완성되지 않을 그림이 액자에 넣어져 벽에 걸리 수 있을 것이다.
멀티 태스킹에서 이런 문제를 공유자원에 대한 동기화 문제라고 한다.
...어려운 말이다.
일반적으로 델파이의 TComponent는 쓰레드에 대해 안전하지 않다. 델파이의 VCL 중 이 클래스의 후손들도 쓰레드에 대해 안전하지 않다. 쓰레드 내부에서 VCL의 시각적인 요소들을 사용하려고 시도한다면 문제가 발생할 것이다.
이런 문제를 막기 위해서는 쓰레드 동기화를 위해 Critical section 혹은 뮤텍스 등을 이용해 VCL 코드의 일정 부분을 wrapping 해야만 하는데 이런 부분이 있으면 VCL은 눈에 띄게 더 커지고 느려진다.
이런 상황을 피하는 방법으로 TThread 객체의 Synchronize 함수가 제공된다.
이 함수는 쓰레드 내부에서 VCL을 호출할 수 있게 해주는 것으로 쓰레드 local storage에 대해 10배 정도 더 빠른 대안을 제공한다.
'Synchronize는 쓰레드가 일시적으로 애플리케이션의 메인 쓰레드의 일부가 되도록 해준다. synchronize가 호출될 때 메인 쓰레드가 실행되지 않는다. VCL은 다른 어떤 메시지들도 받을 수 없고 그래서 Synchronize가 실행되는 시간 동안 VCL의 속성과 메쏘드에 안전하게 접근하거나 호출할 수 있다.'
...머리가 나쁜 나로써는 이 문장을 그냥 이렇게 이해하는 수밖에 없다.
Synchronize를 호출하면 일시적으로 비선점형처럼 동작한다.
이것이 맞는지는 실험을 해봐야 할 것이다.
.........아직 확신하는 것은 아니라는 소리다.
그런데 여기 글을 쓰는 것은 머리가 나쁜 나로써는 일과 생활에 치여 까먹기 일쑤이기 때문에 기록을 남기는 것이다.
시간나면 확인할 수 있는 프로그램을 짜봐야할 듯...
2009.05.05. 선점형과 비선점형을 반대로 써놓는 큰 실수를 저질렀다...왜 이런 부분은 한글보다 영어가 더 안 헷갈리는지 모르겠다.
이 글과 관련있는 글을 자동검색한 결과입니다 [?]
- Semphore 구현 하기. by coffeejava
- Ready LIST 최적화 by coffeejava
- Semaphore 구현하기 2. by coffeejava
- Ready LIST 실습 by coffeejava
- Semaphore 시그널 by coffeejava
# by | 2009/04/03 09:59 | 델파이 | 트랙백 | 덧글(2)




☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
http://kldp.org/node/55621
토론의 처음에 인터럽트에 대한 모호한 개념때문에 혼동이 있을 수 있으니 필터링을 하시면서 보셔야 하겠습니다^^;;
수정했습니다