Search
moon
sun
๐Ÿ‘๏ธ

COM Architecture : Threading models

Category
as S/W ์—”์ง€๋‹ˆ์–ด
Tags
COM
threading model
apartment
Created time
2008/01/18

COM Threading Model์˜ ํ•„์š”์„ฑ

โ€ข
in-process server๋ฅผ ์ œ์™ธํ•œ COM ์„œ๋ฒ„๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹จ์ผ COM ๊ฐœ์ฒด์— ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ ์Šค๋ž˜๋“œ๊ฐ€ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๋‹ค์ค‘์Šค๋ž˜๋“œ ํ™˜๊ฒฝ์— ๋…ธ์ถœ๋˜์–ด ์žˆ๋‹ค. ๋ฐ”๋กœ ์ด ํด๋ผ์ด์–ธํŠธ์˜ ์ ‘๊ทผ ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•ด COM threading model์ด ์กด์žฌํ•œ๋‹ค.

COM Threading Models

โ€ข
single-threading model,ย apartment-threading model,ย free-threading(multi-threaded) model,ย mixed-threading(apartment ๋ฐ free-threading ์ง€์›) model, neutral model์˜ ์ด 5๊ฐ€์ง€ ๋ชจ๋ธ์ด ์กด์žฌํ•œ๋‹ค(๋ช…์นญ์ด ํ˜ผ๋ž€์Šค๋Ÿฝ๋‹ค. free-threading, mixed-threading model, neutral model ์—ญ์‹œ apartment๋ฅผ ํ†ตํ•œ threading ๋ชจ๋ธ์ด๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” apartment-threading model๊นŒ์ง€ ํฌํ•จํ•œ ์ด๋“ค์„ ๊ฐ€๋ฆฌ์ผœ Apartment ์—ฐ๊ด€ ๋ชจ๋ธ์ด๋ผ ์ง€์นญํ•˜๊ฒ ๋‹ค).
โ€ข
COM ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋Š” CoInitializeEx()์ด ๋ฐ”๋กœ ์ด ๋ชจ๋ธ ์ง€์ •์— ์‚ฌ์šฉ๋œ๋‹ค.
โ€ข
ํด๋ผ์ด์–ธํŠธ์™€ COM ์„œ๋ฒ„์˜ threading model์ด ์„œ๋กœ ๋‹ค๋ฅด๋”๋ผ๋„ COM run-time ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ด๋“ค ๊ฐ„ ํ†ต์‹ ์„ thread-safeํ•˜๊ฒŒ ์กฐ์ ˆํ•˜์ง€๋งŒ, ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

Single-Threading Model

๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด ๋‹จ์ผ ์Šค๋ž˜๋“œ ํ์— ์Œ“์ธ๋‹ค. ์˜ค์ง ๋‹จ์ผ ์Šค๋ž˜๋“œ application์—๋งŒ ์ ํ•ฉํ•œ๋ฐ, ํ•ด๋‹น COM ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•œ ์Šค๋ž˜๋“œ ์ด์™ธ์˜ ์Šค๋ž˜๋“œ์—์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ํฌ์ธํ„ฐ์— ์ง์ ‘์ ์ธ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋“ค ํƒ€ ์Šค๋ž˜๋“œ์—์„œ์˜ ํ˜ธ์ถœ, ์ฆ‰ proxy/stub์„ ๊ฒฝ์œ ํ•œ ํ˜ธ์ถœ์€ ๋ฉ”์‹œ์ง€ ํ์— ์Œ“์ด๊ณ , ์–ธ์ œ๋‚˜ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋’ค๋กœ ๋ฐ€๋ฆฐ๋‹ค(ํ•ด๋‹น COM ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•œ ์Šค๋ž˜๋“œ์— ๋น„ํ•ด).

Apartment ์—ฐ๊ด€ ๋ชจ๋ธ

โ€ข
๋ณธ ๋ชจ๋ธ์—์„œ์˜ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋Š” proxy/stub ๊ฒฝ์œ ์—†์ด ์ง์ ‘์ ์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค ํฌ์ธํ„ฐ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. apartment๋ž€ ์Šค๋ž˜๋“œ ๋ณ‘ํ–‰์„ฑ(concurrency)์„ ์œ„ํ•œ ๋…ผ๋ฆฌ์  ๊ตฌ์กฐ๋ฌผ์œผ๋กœ์„œ, ์Šค๋ž˜๋“œ๊ฐ€ CoInitializeEx()๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ƒ์„ฑ๋œ๋‹ค. apartment๋Š” ํ•˜๋‚˜ ๋˜๋Š” ๊ทธ ์ด์ƒ์˜ ์“ฐ๋ž˜๋“œ์™€ ํ•˜๋‚˜ ๋˜๋Š” ๊ทธ ์ด์ƒ์˜ COM ๊ฐœ์ฒด์™€ ์—ฐ๊ด€๋˜์–ด, apartment๋‚ด์˜ ๋ชจ๋“  ์“ฐ๋ž˜๋“œ๋Š” ํ•ด๋‹น apartment์—์„œ ์ƒ์„ฑ๋œ ๋ชจ๋“  COM ๊ฐœ์ฒด๊ฐ€ ๋…ธ์ถœํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ํฌ์ธํ„ฐ์— ์ง์ ‘ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค. ํ”„๋กœ์„ธ์Šค๋Š” ์—ฌ๋Ÿฌ STA(Single Threaded Apartment: ํ•˜๋‚˜์˜ ์“ฐ๋ž˜๋“œ๋งŒ ํฌํ•จ)๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ MTA(Multi Threaded Apartment: ์—ฌ๋Ÿฌ ์“ฐ๋ž˜๋“œ ํฌํ•จ ๊ฐ€๋Šฅ)๋Š” ๋‹จ ํ•˜๋‚˜๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

Apartment-Threading Model(STA)

COM ๊ฐœ์ฒด๋ฅผ ์ƒ์„ฑ ๋ฐ ํ˜ธ์ถœํ•˜๋Š” ์“ฐ๋ž˜๋“œ๊ฐ€ ์˜ค์ง ํ•˜๋‚˜์ด๋ฉฐ, COINIT_APARTMENTTHREADED๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ CoInitializeEx()์„ ํ˜ธ์ถœํ•  ๋•Œ ์ƒ์„ฑ๋œ๋‹ค. STA์—์„œ ์ƒ์„ฑ๋œ COM ๊ฐœ์ฒด์˜ ์ธํ„ฐํŽ˜์ด์Šค ํฌ์ธํ„ฐ๋Š” ์˜ค์ง ํ•ด๋‹น STA์˜ ์“ฐ๋ž˜๋“œ์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋ฉฐ,ย  ํƒ€ ์“ฐ๋ž˜๋“œ๋Š” marshaling์„ ํ†ตํ•ด ๋…ธ์ถœ๋œ ์ธํ„ฐํŽ˜์ด์Šค ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ํ•ด๋‹น COM ๊ฐœ์ฒด์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด ๊ฒฝ์šฐ, ๊ฐ ํ˜ธ์ถœ๊ฐ„ ๋™๊ธฐํ™”๋Š” STA ์“ฐ๋ž˜๋“œ์˜ (window) message queue๋ฅผ ํ†ตํ•ด ์ด๋ฃฌ๋‹ค.

Free-Threading Model

MTA๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ณธ ๋ชจ๋ธ์€ ํ•˜๋‚˜์˜ apartment์— ์—ฌ๋Ÿฌ ์“ฐ๋ž˜๋“œ๊ฐ€ ์ž…์ฃผ ๊ฐ€๋Šฅํ•˜๋ฉฐ COINIT_MULTITHREADED ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•œ๋‹ค. COM ๊ฐœ์ฒด ์‚ฌ์šฉ์— marshaling์ด ํ•„์š”์—†์–ด ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ์„ ๋ณด์ด์ง€๋งŒ, ๋ณธ ๋ชจ๋ธ์„ ์ง€์›ํ•  COM ๊ฐœ์ฒด๋Š” thread-safeํ•˜๊ฒŒ ๊ตฌํ˜„๋˜์–ด์•ผ ํ•˜๋ฉฐ ๋™๊ธฐํ™” ์ฝ”๋“œ๊ฐ€ ๋‚ด์žฅ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

Mixed-Threading Model

์—ฌ๋Ÿฌ STA์™€ ํ•˜๋‚˜์˜ MTA๊ฐ€ ์ž๋ฆฌ์žก๋Š” ๊ตฌ์กฐ์ด๋‹ค.

Neutral Model

์•ž์„œ ๋‚˜์˜จ apartment ๋ชจ๋ธ๊ณผ๋Š” ๋‹ฌ๋ฆฌ ์“ฐ๋ž˜๋“œ๊ฐ€ apartment์— ์ฐธ์—ฌํ•˜์ง€ ์•Š๋Š” COM ๊ฐœ์ฒด๋งŒ ์ž…์ฃผํ•œ ๋ชจ๋ธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์–ด๋А apartment์˜ ์“ฐ๋ž˜๋“œ๊ฑด NA ์•ˆ์˜ COM ๊ฐœ์ฒด์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด์™€ ๊ฐ™์€ apartment๋ฅผ ๊ฐ€๋ฆฌ์ผœ NA(Neutral Apartment)๋ผ ์นญํ•˜๋ฉฐ, ์•ž์„œ ๋‚˜์˜จ ๋ชจ๋ธ ๊ตฌํ˜„์˜ ๋ณต์žก์„ฑ์„ ์ค„์ด๊ธฐ ์œ„์— COM+์—์„œ ๋„์ž…๋˜์—ˆ๋‹ค. COM ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ์“ฐ๋ž˜๋“œ๋Š” ํ•ญ์ƒ ๊ฒฝ๋Ÿ‰์˜ proxy๋ฅผ ๋ฐ›์•„ ์ด๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœ์„ ํ•œ๋‹ค. ํ•ญ์ƒ ์ž์‹ ์„ ํ˜ธ์ถœํ•œ ์“ฐ๋ž˜๋“œ์—์„œ ํ˜ธ์ถœ์„ ๋ฐ›์œผ๋ฏ€๋กœ ์“ฐ๋ž˜๋“œ ์ „ํ™˜์ด ํ•„์š”์—†์–ด ์„ฑ๋Šฅ ํ–ฅ์ƒ๋˜๋ฉฐ, ๋™๊ธฐํ™”๋Š” COM+์—์„œ ์ง€์›ํ•œ๋‹ค. ๋ณธ ๋ชจ๋ธ์ด ๋‚˜์˜จ ์ด์ƒ free๋‚˜ mixed ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์–ด์กŒ๋‹ค.

Threading Model ๊ด€๋ จ Registryย  ํ‚ค

in-proces ์„œ๋ฒ„๋Š” registry์— ์ž์‹ ์˜ threading model์„ ์ง€์ •ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ๋ณดํ†ต in-proces server๋Š”ย CoInitializeEx()ย ํ˜ธ์ถœ์„ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” in-process ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•  ๊ฒฝ์šฐ registry๋ฅผ ๋’ค์ ธ marshaling ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ์•„๋‚ธ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์œ„์น˜์— ํ•ด๋‹น ์„น์…˜์ด ์กด์žฌํ•œ๋‹ค.
HKEY_CLASSES_ROOT\CLSID\[component CLSID]\InProcServer32
C++
๋ณต์‚ฌ
์œ„ ์„น์…˜์˜ ThreadingModel ํ‚ค ๊ฐ’์œผ๋กœ๋Š” None (Single-threading model), Apartment (STA), Free (MTA), Both (mixed model), ๊ทธ๋ฆฌ๊ณ  neutral์ด ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

References

โ€ข
Desktop Applications with Microsoft Visual C++ 6.0 MCSD Training Kit,
โ€ข
Understanding COM+, David S. Platt
โ€ข
MSDN