ํฌ์ŠคํŠธ

CS โ€” ipc

CS โ€” ipc

๐Ÿ“• 05/13 โ€” ํ”„๋กœ์„ธ์Šค๋ผ๋ฆฌ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•(IPC, Inter-Process Communication)์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”

๋ชจ์˜๋ฉด์ ‘ ์ฃผ์ œ: โ€œํ”„๋กœ์„ธ์Šค๋ผ๋ฆฌ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•(IPC, Inter-Process Communication)์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”โ€ ์™œ IPC๊ฐ€ ํ•„์š”ํ•œ๊ฐ€(์ฃผ์†Œ ๊ณต๊ฐ„ ๊ฒฉ๋ฆฌยท์ปค๋„ ๋ชจ๋“œ ๊ฒฝ์œ ) โ†’ ๋ถ„๋ฅ˜์ถ• 3๊ฐœ(๋ฐ์ดํ„ฐ vs ์‹ ํ˜ธ / ์ปค๋„ ๊ฒฝ์œ  vs ์‚ฌ์šฉ์ž ๊ฒฝ์œ  / ๊ฐ™์€ ๋จธ์‹  vs ๋„คํŠธ์›Œํฌ) โ†’ ํŒŒ์ดํ”„(์ต๋ช…ยท๋ช…๋ช…) โ†’ ๋ฉ”์‹œ์ง€ ํ(POSIXยทWindows PostMessage/Mailslot) โ†’ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌยท๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ โ†’ ์„ธ๋งˆํฌ์–ดยท๋ฎคํ…์ŠคยทEvent(์ปค๋„ ๊ฐ์ฒด) โ†’ ์‹œ๊ทธ๋„ยทWindows Event Object โ†’ ์†Œ์ผ“(UNIX domainยทTCP/UDP) โ†’ RPC / COM โ†’ ๋ณด์•ˆยท๋™๊ธฐํ™” ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ โ†’ ์–ธ๋ฆฌ์–ผ(FPlatformProcessยทMessageBus) โ†’ ๊ผฌ๋ฆฌ์งˆ๋ฌธ ๊ฒฝ๋กœ


ํ•™์Šต ์˜์—ญ โ€” ํ”„๋กœ์„ธ์Šค vs ์Šค๋ ˆ๋“œ(19)ยท์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ(21)์—์„œ ํŒŒ์ƒ๋œ OSยท๋™์‹œ์„ฑ ํšŒ๊ท€

ํ”„๋กœ์„ธ์Šค vs ์Šค๋ ˆ๋“œ(19)์—์„œ ํ”„๋กœ์„ธ์Šค/์Šค๋ ˆ๋“œ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋‹ค๋ฃจ๋ฉฐ โ€œ์Šค๋ ˆ๋“œ๋Š” ๊ฐ™์€ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๊ณต์œ ํ•˜์ง€๋งŒ ํ”„๋กœ์„ธ์Šค๋Š” ๊ฒฉ๋ฆฌ๋ผ ์žˆ๋‹คโ€๋Š” ํ•ต์‹ฌ ์ฐจ์ด๋ฅผ ๋ดค๊ณ , ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ(21)์—์„œ ๊ทธ ๊ฒฉ๋ฆฌ๋ฅผ ์ง€ํ‚ค๋ฉฐ ์‹คํ–‰ ์ฃผ์ฒด๋ฅผ ๊ฐˆ์•„๋ผ์šฐ๋Š” ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์˜ ๋น„์šฉ ๊ตฌ์กฐ๋ฅผ ๋ดค์Šต๋‹ˆ๋‹ค. 22๋ฒˆ์€ ๊ทธ ๊ฒฉ๋ฆฌ๋ฅผ ๊นจ์ง€ ์•Š์œผ๋ฉด์„œ ํ”„๋กœ์„ธ์Šค๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜, ์ฆ‰ IPC๊ฐ€ ๋ณธ ์ฃผ์ œ์ž…๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
01๋ฒˆ ๋ฉ”๋ชจ๋ฆฌ 4์˜์—ญ (Code/Data/Heap/Stack)        โ† ์ฃผ์†Œ ๊ณต๊ฐ„์˜ ๊ธฐ์ดˆ
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
19๋ฒˆ ํ”„๋กœ์„ธ์Šค vs ์Šค๋ ˆ๋“œ                          โ† ์ฃผ์†Œ ๊ณต๊ฐ„ ๊ฒฉ๋ฆฌยทPCBยทํ•ธ๋“ค ํ…Œ์ด๋ธ”
20๋ฒˆ Stack Overflow (์Šค๋ ˆ๋“œ๋ณ„ ๋…๋ฆฝ ์Šคํƒ)         โ† ์Šค๋ ˆ๋“œ๋ณ„ ๋ฉ”๋ชจ๋ฆฌ ๋ถ„๋ฆฌ
21๋ฒˆ Context Switching (โ˜…)                       โ† ์ปค๋„ ๋ชจ๋“œ ์ง„์ž…ยท๋ชจ๋“œ ์Šค์œ„์น˜
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
22๋ฒˆ IPC (โ˜…)                                     โ† ๋ณธ ์ฃผ์ œ โ€” ๊ฒฉ๋ฆฌ๋œ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ 
์ดํ›„ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌยทํŽ˜์ด์ง• / ์‹œ์Šคํ…œ ์ฝœ ABI / ๋„คํŠธ์›Œํฌ ์†Œ์ผ“

IPC๋Š” OS๊ฐ€ ๊ฐ•์ œํ•˜๋Š” ์ฃผ์†Œ ๊ณต๊ฐ„ ๊ฒฉ๋ฆฌ(address space isolation) ์œ„์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค A๊ฐ€ ์ž๊ธฐ ๋ฉ”๋ชจ๋ฆฌ์— ์ ์€ ๊ฐ’์„ ํ”„๋กœ์„ธ์Šค B๊ฐ€ ๊ทธ๋ƒฅ ์ฝ์„ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒŒ OS์˜ ๊ธฐ๋ณธ ์•ฝ์†์ž…๋‹ˆ๋‹ค(๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ•œ ํ”„๋กœ์„ธ์Šค์˜ ๋ฒ„๊ทธ๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ง๊ฐ€๋œจ๋ฆฝ๋‹ˆ๋‹ค). ๊ทธ ์•ฝ์†์„ ๊นจ์ง€ ์•Š์œผ๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ธฐ๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ ์ปค๋„์ด ์ค‘์žฌํ•ด์•ผ ํ•˜๊ณ , ๊ทธ๋ž˜์„œ ๋ชจ๋“  IPC๋Š” ๊ฒฐ๊ตญ ์‹œ์Šคํ…œ ์ฝœ๊ณผ ์ปค๋„ ์ž๋ฃŒ๊ตฌ์กฐ ์œ„์— ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค. ์˜ˆ์™ธ๊ฐ€ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์ธ๋ฐ, ์ด๊ฒƒ์กฐ์ฐจ๋„ โ€œ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜์žโ€๋Š” ํ•ฉ์˜๋Š” ์ปค๋„์ด ํ•œ ๋ฒˆ ์„ธํŒ…ํ•ด์ฃผ๊ณ  ๊ทธ ๋’ค๋กœ๋งŒ ์‚ฌ์šฉ์ž ๋ชจ๋“œ์—์„œ ์ง์ ‘ ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค.

Windows๋Š” ํŠนํžˆ CreateNamedPipeยทCreateFileMappingยทPostMessageยทMailslotยทRPCยทCOM๊นŒ์ง€ ํ’๋ถ€ํ•œ IPC API ๊ณ„์ธต์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์„œ, ๊ฐ™์€ โ€œ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ธด๋‹คโ€๋Š” ์ž‘์—…์ด ์ˆ˜์‹ญ ns(๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ํ•œ ๋ฒˆ ์ฝ๊ธฐ) ๋ถ€ํ„ฐ ์ˆ˜์‹ญ ฮผs(RPC marshalling) ๊นŒ์ง€ 4~5์ž๋ฆฟ์ˆ˜ ๋น„์šฉ ์ฐจ์ด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ IPC ์„ ํƒ์€ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ(21)์˜ ๋™๊ธฐํ™” ๊ฐ์ฒด ์„ ํƒ๊ณผ ๋˜‘๊ฐ™์€ ์˜์‚ฌ๊ฒฐ์ • ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค โ€” ์–ผ๋งˆ๋‚˜ ๋นˆ๋ฒˆํ•œ๊ฐ€, ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๋Š” ์–ผ๋งˆ์ธ๊ฐ€, ๊ฒฉ๋ฆฌ/๋ณด์•ˆ์ด ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ๊ฐ€.


๋ชจ์˜๋ฉด์ ‘ ๋‹ต๋ณ€

IPC(Inter-Process Communication, ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ )๋Š” OS๊ฐ€ ๊ฐ•์ œํ•˜๋Š” ์ฃผ์†Œ ๊ณต๊ฐ„ ๊ฒฉ๋ฆฌ๋ฅผ ๊นจ์ง€ ์•Š์œผ๋ฉด์„œ ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ฑฐ๋‚˜ ๋™๊ธฐํ™” ์‹ ํ˜ธ๋ฅผ ๊ตํ™˜ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค vs ์Šค๋ ˆ๋“œ(19)์—์„œ ๋ดค๋“ฏ์ด ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค ์•ˆ์˜ ์Šค๋ ˆ๋“œ๋“ค์€ ์ฝ”๋“œยท๋ฐ์ดํ„ฐยทํž™์„ ๊ณต์œ ํ•˜๋ฏ€๋กœ ๊ทธ๋ƒฅ ์ „์—ญ ๋ณ€์ˆ˜์— ์จ๋„ ํ†ต์‹ ์ด ๋˜์ง€๋งŒ, ํ”„๋กœ์„ธ์Šค๋ผ๋ฆฌ๋Š” ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„์ด ๋‹ค๋ฅด๊ณ  ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”๋„ ๋‹ค๋ฅด๋ฏ€๋กœ ๊ฐ™์€ ๊ฐ€์ƒ ์ฃผ์†Œ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ†ต์‹ ํ•˜๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ ์ปค๋„์ด ํ•œ ๋ฒˆ ์ค‘์žฌํ•ด์•ผ ํ•˜๊ณ , IPC๋Š” ๊ทธ ์ค‘์žฌ ๋ฐฉ์‹์˜ ์นดํƒˆ๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.

IPC ๋ฐฉ์‹์€ ์„ธ ๊ฐ€์ง€ ์ถ•์œผ๋กœ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฑธ ๋จผ์ € ์ •๋ฆฌํ•˜๋ฉด ๊ฐœ๋ณ„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋น„๊ตํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ ์ „์†ก vs ์‹ ํ˜ธ ์ „์†ก โ€” ํŒŒ์ดํ”„ยท๋ฉ”์‹œ์ง€ ํยท๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌยท์†Œ์ผ“์€ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ธฐ๋Š” ์ฑ„๋„, ์‹œ๊ทธ๋„ยทEventยท์„ธ๋งˆํฌ์–ด๋Š” โ€œ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚ฌ๋‹คโ€๋Š” ์‹ ํ˜ธ๋ฅผ ์•Œ๋ฆฌ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
  • ์ปค๋„ ๊ฒฝ์œ  vs ์‚ฌ์šฉ์ž ๋ชจ๋“œ ์ง์ ‘ โ€” ํŒŒ์ดํ”„ยท๋ฉ”์‹œ์ง€ ํยท์†Œ์ผ“ยท์‹œ๊ทธ๋„์€ ๋งค ์†ก์ˆ˜์‹ ๋งˆ๋‹ค ์ปค๋„์„ ๊ฑฐ์น˜๊ณ , ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ดˆ๊ธฐ ์„ธํŒ…๋งŒ ์ปค๋„์—์„œ ํ•˜๊ณ  ๊ทธ ๋’ค๋กœ๋Š” ์‚ฌ์šฉ์ž ๋ชจ๋“œ์—์„œ ์ง์ ‘ ์ฝ๊ณ  ์”๋‹ˆ๋‹ค.
  • ๊ฐ™์€ ๋จธ์‹  vs ๋„คํŠธ์›Œํฌ ๊ฐ€๋Šฅ โ€” ํŒŒ์ดํ”„(์ต๋ช…)ยท๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌยท์‹œ๊ทธ๋„์€ ๊ฐ™์€ ๋จธ์‹ ๋งŒ, ๋ช…๋ช… ํŒŒ์ดํ”„ยท์†Œ์ผ“ยทRPC๋Š” ๊ฐ™์€ ๋จธ์‹ ๊ณผ ๋„คํŠธ์›Œํฌ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋น„์šฉ ์ˆœ์œผ๋กœ ๋ณด๋ฉด ํฐ ๊ทธ๋ฆผ์ด ๋ณด์ž…๋‹ˆ๋‹ค.

  • ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ(shared memory) ๋Š” ๊ฐ€์žฅ ๋น ๋ฆ…๋‹ˆ๋‹ค. ๋‘ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ™์€ ๋ฌผ๋ฆฌ ํŽ˜์ด์ง€๋ฅผ ์ž๊ธฐ ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„์— ๋งคํ•‘ํ•ด๋‘๋ฉด, ๊ทธ ๋’ค๋กœ๋Š” ์ผ๋ฐ˜ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ(์ˆ˜ ns)๊ณผ ๋˜‘๊ฐ™์€ ์†๋„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Windows์—์„  CreateFileMapping + MapViewOfFile, POSIX์—์„  shm_open + mmap์ด ํ‘œ์ค€์ž…๋‹ˆ๋‹ค. ๋‹จ์ ์€ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ OS๊ฐ€ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค โ€” race condition์„ ์ง์ ‘ ๋ง‰์•„์•ผ ํ•˜๋ฏ€๋กœ ์„ธ๋งˆํฌ์–ด๋‚˜ ๋ฎคํ…์Šค ๊ฐ™์€ ๋™๊ธฐํ™” ๊ฐ์ฒด์™€ ๊ฑฐ์˜ ํ•ญ์ƒ ๊ฐ™์ด ์”๋‹ˆ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ(memory-mapped file) ์€ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์˜ ์ผ๋ฐ˜ํ™”๋กœ, ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋งคํ•‘ํ•ด ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ™์€ ํŒŒ์ผ์„ ๋™์‹œ์— ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋‹ค๋ฃจ๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. Windows์—์„œ๋Š” CreateFileMapping์— ์‹ค์ œ ํŒŒ์ผ ํ•ธ๋“ค์„ ์ฃผ๊ฑฐ๋‚˜, INVALID_HANDLE_VALUE๋ฅผ ์ฃผ์–ด ํŽ˜์ด์ง• ํŒŒ์ผ ๊ธฐ๋ฐ˜์˜ ์ต๋ช… ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ํŒŒ์ดํ”„(pipe) ๋Š” ๋‹จ๋ฐฉํ–ฅ ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์ž…๋‹ˆ๋‹ค. ์ต๋ช… ํŒŒ์ดํ”„(CreatePipe)๋Š” ๋ถ€๋ชจ-์ž์‹ ํ”„๋กœ์„ธ์Šค ์‚ฌ์ด์—์„œ๋งŒ ์“ฐ๊ณ , ๋ช…๋ช… ํŒŒ์ดํ”„(CreateNamedPipe, \\.\pipe\name)๋Š” ์ด๋ฆ„์œผ๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ์–ด ๋ฌด๊ด€ํ•œ ํ”„๋กœ์„ธ์Šค ๊ฐ„์ด๋‚˜ ๋„คํŠธ์›Œํฌ์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์†ก์ˆ˜์‹ ๋งˆ๋‹ค ์ปค๋„ ๋ฒ„ํผ๋ฅผ ๊ฑฐ์น˜๋ฏ€๋กœ ์‹œ์Šคํ…œ ์ฝœ 2ํšŒ + ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ 2ํšŒ(์‚ฌ์šฉ์žโ†’์ปค๋„โ†’์‚ฌ์šฉ์ž)๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฉ”์‹œ์ง€ ํ โ€” POSIX์—์„  mq_open/mq_send/mq_receive๋กœ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์žˆ๋Š” ๊ณ ์ • ํฌ๊ธฐ ๋ฉ”์‹œ์ง€ ํ๋ฅผ ์“ฐ๊ณ , Windows์—์„  ๊ฐ™์€ ๋จธ์‹ ยท๊ฐ™์€ ๋ฐ์Šคํฌํ†ฑ ์•ˆ ์Šค๋ ˆ๋“œ ๋ฉ”์‹œ์ง€ ํ์— ๋ณด๋‚ด๋Š” PostMessage(GUI ์ค‘์‹ฌ), ๋˜๋Š” ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„์‹ ๋ขฐ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•˜๋Š” Mailslot(\\.\mailslot\name)์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€ ๊ฒฝ๊ณ„๊ฐ€ ๋ณด์กด๋œ๋‹ค๋Š” ๊ฒŒ ํŒŒ์ดํ”„์™€์˜ ํ•ต์‹ฌ ์ฐจ์ด์ž…๋‹ˆ๋‹ค.
  • ์†Œ์ผ“(socket) ์€ ๊ฐ€์žฅ ๋ฒ”์šฉ์ ์ž…๋‹ˆ๋‹ค. UNIX domain socket(AF_UNIX)ยทWindows์˜ named pipe over networkยทTCP/UDP ๋ชจ๋‘ ๊ฐ™์€ BSD socket API๋กœ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ๊ฐ™์€ ๋จธ์‹ ์—์„  loopback์ด ๋น ๋ฅด๊ณ , ๋„คํŠธ์›Œํฌ๋กœ ํ™•์žฅํ•˜๋ฉด ๊ทธ๋Œ€๋กœ ๋ถ„์‚ฐ ํ†ต์‹ ์ด ๋ฉ๋‹ˆ๋‹ค. ๋‹จ์ ์€ ๋งค ์†ก์ˆ˜์‹  ์‹œ์Šคํ…œ ์ฝœ๊ณผ ํ”„๋กœํ† ์ฝœ ์Šคํƒ ์ฒ˜๋ฆฌ ๋น„์šฉ์ž…๋‹ˆ๋‹ค.
  • ์„ธ๋งˆํฌ์–ดยท๋ฎคํ…์ŠคยทEvent โ€” ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ธฐ๋Š” ์ฑ„๋„์ด ์•„๋‹ˆ๋ผ ๋™๊ธฐํ™” ์‹ ํ˜ธ์ž…๋‹ˆ๋‹ค. Windows์˜ ์ปค๋„ ๊ฐ์ฒด MutexยทSemaphoreยทEvent๋Š” ์ด๋ฆ„์„ ์ค˜์„œ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๊ณต์œ  ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์™€ ์ง์ง€์–ด โ€œ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ, ์„ธ๋งˆํฌ์–ด/Event๋Š” ๋™๊ธฐํ™”โ€๋กœ ๋ถ„์—…ํ•ฉ๋‹ˆ๋‹ค.
  • ์‹œ๊ทธ๋„(signal) โ€” POSIX์˜ ๊ฐ€์žฅ ์˜ค๋ž˜๋œ IPC. kill(pid, SIGUSR1)์ฒ˜๋Ÿผ ์‹ ํ˜ธ ๋ฒˆํ˜ธ๋ฅผ ๋ณด๋‚ด๋ฉด ๋Œ€์ƒ ํ”„๋กœ์„ธ์Šค์— ๋“ฑ๋ก๋œ ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ์ ์ด๊ณ  ๋น„ํŠธ๋งˆ์Šคํฌ ํ•œ ๊ฐœ๋ผ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์—” ๋ถ€์ ํ•ฉํ•˜์ง€๋งŒ โ€œ์ค‘๋‹จํ•ด๋ผโ€ยทโ€์„ค์ •์„ ๋‹ค์‹œ ์ฝ์–ด๋ผโ€ ๊ฐ™์€ ๋ช…๋ น์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. Windows์—๋Š” ์ง์ ‘ ๋Œ€์‘์ด ์—†๊ณ , ๋Œ€์‹  Event ๊ฐ์ฒด์™€ WaitForSingleObject ๊ฐ€ ๋™๋“ฑํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • RPC / COM โ€” ํ•จ์ˆ˜ ํ˜ธ์ถœ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๊ทธ ํ˜ธ์ถœ์ด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—์„œ ์‹คํ–‰๋˜๋Š” ๊ณ ์ˆ˜์ค€ ์ถ”์ƒํ™”์ž…๋‹ˆ๋‹ค. Windows์˜ MS-RPC ๋Š” IDL๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  marshalling/unmarshalling ์ฝ”๋“œ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•˜๋ฉฐ, ๊ทธ ์œ„์— ์–นํžŒ COM(Component Object Model) ์€ ๊ฐ์ฒด ๋‹จ์œ„๋กœ IPC๋ฅผ ์ถ”์ƒํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋น„์šฉ์€ ๊ฐ€์žฅ ๋น„์‹ธ์ง€๋งŒ(์ˆ˜์‹ญ ฮผs) ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ๊ฐ€์žฅ ๋†’์Šต๋‹ˆ๋‹ค.

์„ ํƒ ๊ธฐ์ค€์„ ํ•œ ์ค„๋กœ ์ •๋ฆฌํ•˜๋ฉด โ€œ๋ฐ์ดํ„ฐ ํฌ๊ธฐ์™€ ๋นˆ๋„, ๊ทธ๋ฆฌ๊ณ  ๊ฒฉ๋ฆฌยท๋ณด์•ˆ ์š”๊ตฌโ€์ž…๋‹ˆ๋‹ค. ๋งค ํ”„๋ ˆ์ž„๋งˆ๋‹ค ํฐ ๋ฐ์ดํ„ฐ(๋ Œ๋” ๋ช…๋ น ๋ฒ„ํผ ๋“ฑ)๋ฅผ ์˜ฎ๊ธด๋‹ค๋ฉด ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ + ์„ธ๋งˆํฌ์–ด๊ฐ€ ๋‹ต์ด๊ณ , ๊ฐ€๋” ์ž‘์€ ๋ช…๋ น์„ ์ฃผ๊ณ ๋ฐ›๋Š”๋‹ค๋ฉด ๋ช…๋ช… ํŒŒ์ดํ”„๋‚˜ ์†Œ์ผ“์ด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ํ˜ธ์ถœ์ฒ˜๋Ÿผ ๋‹ค๋ค„์•ผ ํ•œ๋‹ค๋ฉด RPC/COM์ด์ง€๋งŒ ์„ฑ๋Šฅ์„ ํฌ๊ธฐํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. Chrome์˜ ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค ์•„ํ‚คํ…์ฒ˜ ๊ฐ€ ์ข‹์€ ์˜ˆ์‹œ์ธ๋ฐ, ํƒญ ๊ฐ„ ๊ฒฉ๋ฆฌ(๋ณด์•ˆ)๋ฅผ ์œ„ํ•ด ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ถ„๋ฆฌํ–ˆ์ง€๋งŒ ๊ทธ๋งŒํผ IPC ๋น„์šฉ์„ ๊ฐ์ˆ˜ํ•˜๊ณ , ํ•ต์‹ฌ ๊ฒฝ๋กœ(๋ Œ๋”๋ง ๋ช…๋ น)๋Š” ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ + ์„ธ๋งˆํฌ์–ด๋กœ, ์ œ์–ด ์‹ ํ˜ธ๋Š” ๋ฉ”์‹œ์ง€ ํŒจ์‹ฑ์œผ๋กœ ๋ถ„๋ฆฌํ•ด ๋น„์šฉ์„ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ IPC๋Š” ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ(21)๊ณผ ๊ฐ™์€ ์›๋ฆฌ์ž…๋‹ˆ๋‹ค โ€” ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ OS๊ฐ€ ์ •ํ•ด์ฃผ์ง€๋งŒ, ๋นˆ๋„์™€ ๋น„์šฉ์„ ์กฐ์ ˆํ•˜๋Š” ๊ฒŒ ์—”์ง€๋‹ˆ์–ด๋ง์ž…๋‹ˆ๋‹ค.


ํ•ต์‹ฌ ๊ฐœ๋…

๋ถ„๋ฅ˜ํ‚ค์›Œ๋“œํ•œ ์ค„ ์ •์˜
์ •์˜IPC (Inter-Process Communication, ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ )OS์˜ ์ฃผ์†Œ ๊ณต๊ฐ„ ๊ฒฉ๋ฆฌ๋ฅผ ๊นจ์ง€ ์•Š์œผ๋ฉด์„œ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๋ฐ์ดํ„ฐยท์‹ ํ˜ธ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ์ด์นญ
ย ์ฃผ์†Œ ๊ณต๊ฐ„ ๊ฒฉ๋ฆฌ (Address Space Isolation)๊ฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž๊ธฐ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”ยท๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๊ฐ€์ ธ, ๊ฐ™์€ ๊ฐ€์ƒ ์ฃผ์†Œ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” OS ๋ณดํ˜ธ ๋ชจ๋ธ
ย ์ปค๋„ ์ค‘์žฌ (Kernel Mediation)๊ฒฉ๋ฆฌ๋œ ๋‘ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์•ˆ์ „ํ•˜๊ฒŒ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด ์ปค๋„์ด ์‹œ์Šคํ…œ ์ฝœยท์ปค๋„ ๊ฐ์ฒด๋กœ ๋ฐ์ดํ„ฐ ์ด๋™์„ ๋งค๊ฐœํ•˜๋Š” ์›์น™
๋ถ„๋ฅ˜์ถ•๋ฐ์ดํ„ฐ vs ์‹ ํ˜ธ๋ฐ์ดํ„ฐ ์ „์†ก: pipeยทshmยทsocketยทmessage queue / ์‹ ํ˜ธ ์ „์†ก: signalยทeventยทsemaphore
ย ์ปค๋„ ๊ฒฝ์œ  vs ์‚ฌ์šฉ์ž ๋ชจ๋“œ๋งค๋ฒˆ ์ปค๋„ ๊ฒฝ์œ : pipeยทsocketยทsignal / ์ดˆ๊ธฐ 1ํšŒ๋งŒ: shared memory (์ดํ›„ user-mode)
ย ๋กœ์ปฌ vs ๋„คํŠธ์›Œํฌ๋กœ์ปฌ ์ „์šฉ: anonymous pipeยทshmยทsignal / ๋„คํŠธ์›Œํฌ ๊ฐ€๋Šฅ: named pipeยทsocketยทRPC
ํŒŒ์ดํ”„์ต๋ช… ํŒŒ์ดํ”„ (Anonymous Pipe)๋ถ€๋ชจ-์ž์‹ ์‚ฌ์ด ๋‹จ๋ฐฉํ–ฅ ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ. Windows CreatePipe, POSIX pipe()
ย ๋ช…๋ช… ํŒŒ์ดํ”„ (Named Pipe)์ด๋ฆ„์œผ๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์–‘๋ฐฉํ–ฅ ํŒŒ์ดํ”„. Windows CreateNamedPipe(\\.\pipe\name), POSIX mkfifo()
ย ํŒŒ์ดํ”„ ๋ฒ„ํผ์ปค๋„์ด ๊ด€๋ฆฌํ•˜๋Š” FIFO ํ. ๊ฐ€๋“ ์ฐจ๋ฉด ์†ก์‹ ์ž ๋ธ”๋ก, ๋น„๋ฉด ์ˆ˜์‹ ์ž ๋ธ”๋ก
ย ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ (vs ๋ฉ”์‹œ์ง€)ํŒŒ์ดํ”„๋Š” ๋ฉ”์‹œ์ง€ ๊ฒฝ๊ณ„ ์—†์Œ โ€” 4๋ฐ”์ดํŠธ ์“ฐ๊ณ  4๋ฐ”์ดํŠธ ์“ฐ๋ฉด ์ˆ˜์‹ ์ž๊ฐ€ 8๋ฐ”์ดํŠธ๋กœ ํ•œ ๋ฒˆ์— ์ฝ์„ ์ˆ˜ ์žˆ์Œ
๋ฉ”์‹œ์ง€ ํ๋ฉ”์‹œ์ง€ ํ (Message Queue)๋ฉ”์‹œ์ง€ ๊ฒฝ๊ณ„๊ฐ€ ๋ณด์กด๋˜๋Š” ํ. POSIX mq_open/mq_send/mq_receive
ย POSIX mq ์šฐ์„ ์ˆœ์œ„๋ฉ”์‹œ์ง€๋งˆ๋‹ค ์šฐ์„ ์ˆœ์œ„, ๊ฐ™์€ ํ ์•ˆ์—์„œ ์šฐ์„ ์ˆœ์œ„ ๋†’์€ ๊ฒŒ ๋จผ์ € ๋น ์ง
ย PostMessage/SendMessageWindows GUI ์Šค๋ ˆ๋“œ ๋ฉ”์‹œ์ง€ ํ์— ๋ฉ”์‹œ์ง€ ์ „์†ก. ๊ฐ™์€ ๋ฐ์Šคํฌํ†ฑยท๊ฐ™์€ ๋จธ์‹  ํ•œ์ •
ย MailslotWindows์˜ ์‹ ๋ขฐ์„ฑ ์—†๋Š” ๋‹จ๋ฐฉํ–ฅ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ(์ž‘์€ ๋ฉ”์‹œ์ง€, ๊ฐ™์€ ๋„๋ฉ”์ธ). \\.\mailslot\name
๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ (Shared Memory)๋‘ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ™์€ ๋ฌผ๋ฆฌ ํŽ˜์ด์ง€๋ฅผ ์ž๊ธฐ ๊ฐ€์ƒ ์ฃผ์†Œ์— ๋งคํ•‘ โ†’ ์ผ๋ฐ˜ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ์†๋„
ย CreateFileMapping (Windows)ํŽ˜์ด์ง• ํŒŒ์ผ ๋˜๋Š” ์‹ค์ œ ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘ ๊ฐ์ฒด๋กœ ๋งŒ๋“ฆ
ย MapViewOfFile (Windows)๋งคํ•‘ ๊ฐ์ฒด๋ฅผ ์ž๊ธฐ ํ”„๋กœ์„ธ์Šค ๊ฐ€์ƒ ์ฃผ์†Œ์— ๋งคํ•‘
ย shm_open + mmap (POSIX)POSIX ํ‘œ์ค€ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ โ€” /dev/shm ์•„๋ž˜ ํŒŒ์ผ๋กœ ํ‘œํ˜„
ย ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์˜ ํ•จ์ •OS๊ฐ€ ๋™๊ธฐํ™” ์•ˆ ํ•จ โ†’ race conditionยท๊ตฌ์กฐ์ฒด ์ •๋ ฌยทํฌ์ธํ„ฐ ์˜์กด ๋ชจ๋‘ ์ง์ ‘ ์ฒ˜๋ฆฌ ํ•„์š”
๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ (Memory-Mapped File)๋””์Šคํฌ ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋งคํ•‘ํ•ด read/write ๋Œ€์‹  ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์œผ๋กœ ๋‹ค๋ฃธ. ํŽ˜์ด์ง€ ์บ์‹œ ์ž๋™ ํ™œ์šฉ
ย ์ต๋ช… ๋ฉ”๋ชจ๋ฆฌ ๋งตํŒŒ์ผ ์—†์ด ํŽ˜์ด์ง• ํŒŒ์ผ ๊ธฐ๋ฐ˜ โ€” ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์™€ ๋™์ผ (Windows: INVALID_HANDLE_VALUE)
๋™๊ธฐํ™” ๊ฐ์ฒดMutex (์ปค๋„ ๊ฐ์ฒด, Windows)์ด๋ฆ„ ๋ถ€์—ฌ ์‹œ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๊ณต์œ  ๊ฐ€๋Šฅ. CreateMutex(NULL, FALSE, "Name")
ย Semaphore (์ปค๋„ ๊ฐ์ฒด)์นด์šดํ„ฐ ๊ธฐ๋ฐ˜ ๋ฝ. ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์—์„œ produce/consume ๋™๊ธฐํ™”์— ์“ฐ์ž„
ย Event ๊ฐ์ฒด (Windows)์‹œ๊ทธ๋„ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด. POSIX ์‹œ๊ทธ๋„๊ณผ ๋น„์Šทํ•œ ์•Œ๋ฆผ์šฉ
ย WaitForSingleObject๋ชจ๋“  ์ปค๋„ ๊ฐ์ฒด ๋Œ€๊ธฐ ์ง„์ž…์  โ€” MutexยทSemaphoreยทEvent ๋ชจ๋‘ ๋™์ผ API
ย PulseEvent/SetEvent/ResetEventEvent ๊ฐ์ฒด ์ƒํƒœ ์ œ์–ด
์‹œ๊ทธ๋„์‹œ๊ทธ๋„ (Signal, POSIX)๋น„๋™๊ธฐ ์•Œ๋ฆผ. kill(pid, SIGUSR1) โ†’ ๋Œ€์ƒ ํ”„๋กœ์„ธ์Šค ํ•ธ๋“ค๋Ÿฌ ์‹คํ–‰
ย ํ‘œ์ค€ ์‹œ๊ทธ๋„SIGINT(Ctrl+C), SIGTERM(์ข…๋ฃŒ ์š”์ฒญ), SIGKILL(๊ฐ•์ œ ์ข…๋ฃŒ), SIGUSR1/2(์‚ฌ์šฉ์ž ์ •์˜), SIGPIPE(ํŒŒ์ดํ”„ ๋Š๊น€)
ย signal()/sigaction()์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ ๋“ฑ๋ก. sigaction์ด ๋” ์•ˆ์ „
ย ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ์˜ ์ œ์•ฝasync-signal-safe ํ•จ์ˆ˜๋งŒ ํ˜ธ์ถœ ๊ฐ€๋Šฅ (writeยท_exitยทsignal ๋“ฑ ํ•œ์ •)
ย Windows ๋Œ€์‘Event ๊ฐ์ฒด + WaitForSingleObject ๋˜๋Š” SetConsoleCtrlHandler(์ฝ˜์†” ํ•œ์ •)
์†Œ์ผ“์†Œ์ผ“ (Socket)BSD socket API ๊ธฐ๋ฐ˜ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ . ๊ฐ™์€ ๋จธ์‹ ยท๋„คํŠธ์›Œํฌ ๋ชจ๋‘
ย UNIX domain socket (AF_UNIX)๊ฐ™์€ ๋จธ์‹  ์ „์šฉ. ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ฒฝ๋กœ๋กœ ์‹๋ณ„. TCP๋ณด๋‹ค ๋น ๋ฆ„
ย TCP socket (AF_INET/SOCK_STREAM)์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ. ๋„คํŠธ์›Œํฌ ๊ฐ€๋Šฅ
ย UDP socket (AF_INET/SOCK_DGRAM)๋น„์‹ ๋ขฐ ๋ฐ์ดํ„ฐ๊ทธ๋žจ. ๋ฉ”์‹œ์ง€ ๊ฒฝ๊ณ„ ๋ณด์กด
ย loopback (127.0.0.1)๊ฐ™์€ ๋จธ์‹  ๋‚ด TCP/UDP. ์ปค๋„์ด NIC ์šฐํšŒ
ย WinsockWindows์˜ BSD socket ๊ตฌํ˜„. WSAStartup/socket/bind/listen
RPC/COMRPC (Remote Procedure Call)ํ•จ์ˆ˜ ํ˜ธ์ถœ์ฒ˜๋Ÿผ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ถ”์ƒํ™”
ย MS-RPC (Microsoft RPC)Windows์˜ RPC ๊ตฌํ˜„. IDL๋กœ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜ โ†’ marshalling ์ฝ”๋“œ ์ž๋™ ์ƒ์„ฑ
ย marshalling/unmarshallingํ•จ์ˆ˜ ์ธ์ž๋ฅผ ๋ฐ”์ดํŠธ๋กœ ์ง๋ ฌํ™”(marshal) โ†’ ์ „์†ก โ†’ ์—ญ์ง๋ ฌํ™”(unmarshal)ํ•ด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—์„œ ํ˜ธ์ถœ
ย COM (Component Object Model)๊ฐ์ฒด ๋‹จ์œ„ IPC + ์ปดํฌ๋„ŒํŠธ ๋ชจ๋ธ. CoCreateInstanceยทIUnknownยท์ธํ„ฐํŽ˜์ด์Šค
ย out-of-proc COMCOM ์„œ๋ฒ„๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค(๋˜๋Š” ๋‹ค๋ฅธ ๋จธ์‹ )์— ์žˆ๋Š” ๊ฒฝ์šฐ โ€” ๋‚ด๋ถ€์ ์œผ๋กœ RPC
๋น„์šฉ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๋น„์šฉ์ดˆ๊ธฐ ์„ธํŒ… 1ํšŒ ์‹œ์Šคํ…œ ์ฝœ, ์ดํ›„ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ์†๋„(์ˆ˜ ns)
ย ํŒŒ์ดํ”„/์†Œ์ผ“ ๋น„์šฉ๋งค ์†ก์ˆ˜์‹  ์‹œ์Šคํ…œ ์ฝœ + ์ปค๋„ ๋ฒ„ํผ ๋ณต์‚ฌ 2ํšŒ (์ˆ˜ ฮผs~์ˆ˜์‹ญ ฮผs)
ย ์‹œ๊ทธ๋„ ๋น„์šฉ์‹œ์Šคํ…œ ์ฝœ + ์ธํ„ฐ๋ŸฝํŠธ ์ฒ˜๋ฆฌ (์ˆ˜ ฮผs)
ย RPC/COM ๋น„์šฉmarshalling + ํ”„๋กœ์„ธ์Šค ์ „ํ™˜ + unmarshalling (์ˆ˜์‹ญ~์ˆ˜๋ฐฑ ฮผs)
๋ณด์•ˆ๊ถŒํ•œ/ACL๋ช…๋ช…๋œ IPC ๊ฐ์ฒด(Named PipeยทMutexยทMailslot)๋Š” ๋ณด์•ˆ ๋””์Šคํฌ๋ฆฝํ„ฐ๋กœ ์ ‘๊ทผ ์ œ์–ด
ย integrity level (Windows)Low/Medium/High โ€” ๋‚ฎ์€ IL ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋†’์€ IL ๊ฐ์ฒด์— ์ ‘๊ทผ ์ œํ•œ
ย input validation์‹ ๋ขฐ ๊ฒฝ๊ณ„๋ฅผ ๋„˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ํ•ญ์ƒ ๊ฒ€์ฆ โ€” IPC๋Š” attack surface
์–ธ๋ฆฌ์–ผFPlatformProcessํ”Œ๋žซํผ ์ถ”์ƒํ™” โ€” ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑยทํŒŒ์ดํ”„ยท์‹คํ–‰
ย FPlatformProcess::CreatePipe์ต๋ช… ํŒŒ์ดํ”„ ์ƒ์„ฑ
ย FMessageBus / IMessageBus์–ธ๋ฆฌ์–ผ ์ž์ฒด ๋ฉ”์‹œ์ง€ ํŒจ์‹ฑ ์‹œ์Šคํ…œ (๊ฐ™์€ ๋จธ์‹ ยท๊ฐ™์€ ์ธ์Šคํ„ด์Šค ์•ˆ์˜ ๋ชจ๋“ˆ ๊ฐ„)
ย Live Coding / Hot Reload์—๋””ํ„ฐ-์ปดํŒŒ์ผ๋Ÿฌ IPC (named pipe ๊ธฐ๋ฐ˜)

๋ชฉ์ฐจ

  1. ํ•ต์‹ฌ ์š”์•ฝ ์นด๋“œ
  2. ํ•œ ์ค„ ์ •์˜ โ€” IPC๋ž€ ๋ฌด์—‡์ด๊ณ  ์™œ ํ•„์š”ํ•œ๊ฐ€
  3. ๋ถ„๋ฅ˜์ถ• 3๊ฐ€์ง€ โ€” ๋ฐ์ดํ„ฐ/์‹ ํ˜ธยท์ปค๋„ ๊ฒฝ์œ /์‚ฌ์šฉ์žยท๋กœ์ปฌ/๋„คํŠธ์›Œํฌ
  4. ํŒŒ์ดํ”„ โ€” ์ต๋ช… ํŒŒ์ดํ”„์™€ ๋ช…๋ช… ํŒŒ์ดํ”„
  5. ๋ฉ”์‹œ์ง€ ํ โ€” POSIX mqยทWindows PostMessageยทMailslot
  6. ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ โ€” ๊ฐ€์žฅ ๋น ๋ฅธ IPC
  7. ๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ โ€” CreateFileMapping๊ณผ ํŽ˜์ด์ง€ ์บ์‹œ
  8. ์„ธ๋งˆํฌ์–ดยท๋ฎคํ…์ŠคยทEvent โ€” ๋™๊ธฐํ™” ๊ฐ์ฒด๋กœ์„œ์˜ IPC
  9. ์‹œ๊ทธ๋„ โ€” POSIX์™€ Windows Event ๋Œ€์‘
  10. ์†Œ์ผ“ โ€” UNIX domainยทTCPยทUDPยทWinsock
  11. RPC์™€ COM โ€” ํ•จ์ˆ˜ ํ˜ธ์ถœ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” IPC
  12. ๋น„์šฉ ์ŠคํŽ™ํŠธ๋Ÿผ ์ •๋ฆฌ โ€” ์–ด๋А ๋ฐฉ์‹์ด ์–ผ๋งˆ๋‚˜ ๋น ๋ฅธ๊ฐ€
  13. ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ โ€” ์†๋„ vs ์•ˆ์ „์„ฑ vs ๋™๊ธฐํ™” ๋ณต์žก๋„
  14. ๋ณด์•ˆ โ€” ์‹ ๋ขฐ ๊ฒฝ๊ณ„์™€ ACL
  15. ์–ธ๋ฆฌ์–ผ์—์„œ์˜ IPC โ€” FPlatformProcessยทMessageBusยทHot Reload
  16. ๊ผฌ๋ฆฌ์งˆ๋ฌธ ์˜ˆ์ƒ ๊ฒฝ๋กœ
  17. ํ•ต์‹ฌ ์š”์•ฝ ์นด๋“œ (์žฌ๊ฒŒ์žฌ)
  18. ํšŒ๊ท€ ๋‹ค๋ฆฌ โ€” ๋‹ค๋ฅธ CS ํŒŒ์ผ ์—ฐ๊ฒฐ

1. ํ•ต์‹ฌ ์š”์•ฝ ์นด๋“œ

30์ดˆ ๋‹ต๋ณ€

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
IPC = OS์˜ ์ฃผ์†Œ ๊ณต๊ฐ„ ๊ฒฉ๋ฆฌ๋ฅผ ๊นจ์ง€ ์•Š์œผ๋ฉด์„œ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๋ฐ์ดํ„ฐยท์‹ ํ˜ธ๋ฅผ ๊ตํ™˜ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜.
       ๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” ์ž๊ธฐ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์„ ๊ฐ€์ ธ ๊ฐ€์ƒ ์ฃผ์†Œ๊ฐ€ ๋‹ฌ๋ผ โ†’ ๋ฐ˜๋“œ์‹œ ์ปค๋„์ด ์ค‘์žฌ.

๋ถ„๋ฅ˜์ถ• 3๊ฐœ:
  โ‘  ๋ฐ์ดํ„ฐ vs ์‹ ํ˜ธ       โ€” pipeยทshmยทsocket / signalยทeventยทsemaphore
  โ‘ก ์ปค๋„ ๊ฒฝ์œ  vs ์‚ฌ์šฉ์ž  โ€” ๋งค๋ฒˆ syscall / ์ดˆ๊ธฐ 1ํšŒ๋งŒ (shared memory)
  โ‘ข ๋กœ์ปฌ vs ๋„คํŠธ์›Œํฌ     โ€” anonymous pipeยทshm / named pipeยทsocketยทRPC

์ฃผ์š” ๋ฉ”์ปค๋‹ˆ์ฆ˜ (๋น ๋ฆ„ โ†’ ๋А๋ฆผ):
  โ‘  ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ (CreateFileMapping/MapViewOfFile, shm_open+mmap)
     - ๊ฐ€์žฅ ๋น ๋ฆ„ (์ˆ˜ ns, ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ์†๋„)
     - ๋™๊ธฐํ™” ์ง์ ‘ ์ฒ˜๋ฆฌ ํ•„์š” โ†’ ์„ธ๋งˆํฌ์–ด/Event์™€ ์ง์ง€์–ด ์”€
  โ‘ก ๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ (CreateFileMapping with real file)
     - ๋””์Šคํฌ ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ์ฒ˜๋Ÿผ โ€” ํŽ˜์ด์ง€ ์บ์‹œ ์ž๋™ ํ™œ์šฉ
  โ‘ข ํŒŒ์ดํ”„ (CreatePipe / CreateNamedPipe / pipe / mkfifo)
     - ๋‹จ๋ฐฉํ–ฅ ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ (๋ฉ”์‹œ์ง€ ๊ฒฝ๊ณ„ ์—†์Œ)
     - ์ต๋ช…: ๋ถ€๋ชจ-์ž์‹๋งŒ / ๋ช…๋ช…: ๋ฌด๊ด€ ํ”„๋กœ์„ธ์Šคยท๋„คํŠธ์›Œํฌ ๊ฐ€๋Šฅ
  โ‘ฃ ๋ฉ”์‹œ์ง€ ํ (POSIX mq_*, Windows PostMessage/Mailslot)
     - ๋ฉ”์‹œ์ง€ ๊ฒฝ๊ณ„ ๋ณด์กด, ์šฐ์„ ์ˆœ์œ„ (POSIX)
  โ‘ค ์„ธ๋งˆํฌ์–ดยท๋ฎคํ…์ŠคยทEvent (Windows ์ปค๋„ ๊ฐ์ฒด)
     - ๋ฐ์ดํ„ฐ X, ๋™๊ธฐํ™” ์‹ ํ˜ธ O. ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๊ณต์œ  ๊ฐ€๋Šฅ
  โ‘ฅ ์‹œ๊ทธ๋„ (POSIX kill/signal/sigaction)
     - ๋น„๋™๊ธฐ ์•Œ๋ฆผ. ํ•ธ๋“ค๋Ÿฌ๋Š” async-signal-safe ํ•จ์ˆ˜๋งŒ
     - Windows์—๋Š” Event ๊ฐ์ฒด๋กœ ๋Œ€์‘
  โ‘ฆ ์†Œ์ผ“ (UNIX domain / TCP / UDP)
     - ๊ฐ€์žฅ ๋ฒ”์šฉ. ๋„คํŠธ์›Œํฌ๋กœ ํ™•์žฅ ๊ฐ€๋Šฅ
  โ‘ง RPC / COM (MS-RPC, CoCreateInstance)
     - ํ•จ์ˆ˜ ํ˜ธ์ถœ์ฒ˜๋Ÿผ โ€” marshalling ๋น„์šฉ ํผ

๋น„์šฉ ์ŠคํŽ™ํŠธ๋Ÿผ (๋‚ฎ์Œ โ†’ ๋†’์Œ):
  ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ            ์ˆ˜ ns
  Mutex/Event signal+wait     1~3 ฮผs
  Anonymous Pipe send/recv    ์ˆ˜ ฮผs
  Named Pipe send/recv        ์ˆ˜ ฮผs (loopback)
  UNIX domain socket          ์ˆ˜ ฮผs
  TCP loopback                ์ˆ˜~์ˆ˜์‹ญ ฮผs
  PostMessage                 ์ˆ˜ ฮผs
  Mailslot                    ์ˆ˜์‹ญ ฮผs
  MS-RPC ํ˜ธ์ถœ                 ์ˆ˜์‹ญ~์ˆ˜๋ฐฑ ฮผs

์„ ํƒ ๊ฐ€์ด๋“œ:
  ํฐ ๋ฐ์ดํ„ฐยท๊ณ ๋นˆ๋„        โ†’ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ + ์„ธ๋งˆํฌ์–ด
  ๋ฉ”์‹œ์ง€ ๊ฒฝ๊ณ„ ํ•„์š”        โ†’ ๋ฉ”์‹œ์ง€ ํ / Mailslot / UDP
  ๋„คํŠธ์›Œํฌ ํ™•์žฅ ๊ฐ€๋Šฅ์„ฑ    โ†’ ์†Œ์ผ“ / ๋ช…๋ช… ํŒŒ์ดํ”„
  ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ถ”์ƒํ™”        โ†’ RPC / COM
  ๋‹จ์ˆœ ์‹ ํ˜ธ               โ†’ Event / ์‹œ๊ทธ๋„

๊ผฌ๋ฆฌ์งˆ๋ฌธ ์—ฐ๊ฒฐ ๋งต

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
IPC
โ”œโ”€โ”€ ์™œ ํ•„์š”ํ•œ๊ฐ€
โ”‚   โ”œโ”€โ”€ ์ฃผ์†Œ ๊ณต๊ฐ„ ๊ฒฉ๋ฆฌ (ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”ยทCR3 โ€” ํ”„๋กœ์„ธ์Šค vs ์Šค๋ ˆ๋“œ(19)ยท์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ(21) ํšŒ๊ท€)
โ”‚   โ”œโ”€โ”€ ์ปค๋„ ๋ชจ๋“œ ์ค‘์žฌ (์‹œ์Šคํ…œ ์ฝœยท๋ชจ๋“œ ์Šค์œ„์น˜ โ€” ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ(21) ํšŒ๊ท€)
โ”‚   โ””โ”€โ”€ ํ•œ ํ”„๋กœ์„ธ์Šค ๋ฒ„๊ทธ๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋กœ ์ „ํŒŒ ์•ˆ ๋˜๊ฒŒ (๋ณด์•ˆยท์•ˆ์ •์„ฑ)
โ”œโ”€โ”€ ๋ถ„๋ฅ˜์ถ•
โ”‚   โ”œโ”€โ”€ ๋ฐ์ดํ„ฐ vs ์‹ ํ˜ธ
โ”‚   โ”œโ”€โ”€ ์ปค๋„ ๊ฒฝ์œ  vs ์‚ฌ์šฉ์ž ๋ชจ๋“œ
โ”‚   โ””โ”€โ”€ ๋กœ์ปฌ vs ๋„คํŠธ์›Œํฌ
โ”œโ”€โ”€ ๋ฐ์ดํ„ฐ ์ „์†ก
โ”‚   โ”œโ”€โ”€ ํŒŒ์ดํ”„ (๋‹จ๋ฐฉํ–ฅ, ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ)
โ”‚   โ”‚   โ”œโ”€โ”€ ์ต๋ช… (CreatePipe / pipe) โ€” ๋ถ€๋ชจ-์ž์‹๋งŒ
โ”‚   โ”‚   โ””โ”€โ”€ ๋ช…๋ช… (CreateNamedPipe / mkfifo) โ€” ์ด๋ฆ„ยท๋„คํŠธ์›Œํฌ
โ”‚   โ”œโ”€โ”€ ๋ฉ”์‹œ์ง€ ํ (๋ฉ”์‹œ์ง€ ๊ฒฝ๊ณ„ ๋ณด์กด)
โ”‚   โ”‚   โ”œโ”€โ”€ POSIX mq_open/send/receive โ€” ์šฐ์„ ์ˆœ์œ„
โ”‚   โ”‚   โ”œโ”€โ”€ Windows PostMessage โ€” GUI ํ•œ์ •
โ”‚   โ”‚   โ””โ”€โ”€ Windows Mailslot โ€” ์‹ ๋ขฐ์„ฑ ์—†๋Š” ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ
โ”‚   โ”œโ”€โ”€ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ (๊ฐ€์žฅ ๋น ๋ฆ„)
โ”‚   โ”‚   โ”œโ”€โ”€ Windows CreateFileMapping / MapViewOfFile
โ”‚   โ”‚   โ”œโ”€โ”€ POSIX shm_open / mmap
โ”‚   โ”‚   โ””โ”€โ”€ ๋™๊ธฐํ™”๋Š” ์„ธ๋งˆํฌ์–ด/Event์™€ ํ•จ๊ป˜
โ”‚   โ”œโ”€โ”€ ๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ (๋””์Šคํฌ ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ๋กœ)
โ”‚   โ”‚   โ””โ”€โ”€ ํŽ˜์ด์ง€ ์บ์‹œ ์ž๋™ ํ™œ์šฉ
โ”‚   โ””โ”€โ”€ ์†Œ์ผ“ (๊ฐ€์žฅ ๋ฒ”์šฉ)
โ”‚       โ”œโ”€โ”€ UNIX domain (AF_UNIX) โ€” ๋กœ์ปฌ, ๋น ๋ฆ„
โ”‚       โ”œโ”€โ”€ TCP/UDP (AF_INET) โ€” ๋„คํŠธ์›Œํฌ
โ”‚       โ””โ”€โ”€ Winsock โ€” Windows์˜ BSD ํ˜ธํ™˜
โ”œโ”€โ”€ ๋™๊ธฐํ™” ์‹ ํ˜ธ
โ”‚   โ”œโ”€โ”€ ์„ธ๋งˆํฌ์–ด (์นด์šดํ„ฐ)
โ”‚   โ”œโ”€โ”€ ๋ฎคํ…์Šค (๋ฐฐํƒ€ ๋ฝ)
โ”‚   โ”œโ”€โ”€ Event ๊ฐ์ฒด (Windows, ์ƒํƒœ ์‹œ๊ทธ๋„)
โ”‚   โ””โ”€โ”€ ์‹œ๊ทธ๋„ (POSIX, ๋น„๋™๊ธฐ ํ•ธ๋“ค๋Ÿฌ)
โ”œโ”€โ”€ ๊ณ ์ˆ˜์ค€ ์ถ”์ƒํ™”
โ”‚   โ”œโ”€โ”€ RPC (ํ•จ์ˆ˜ ํ˜ธ์ถœ์ฒ˜๋Ÿผ)
โ”‚   โ”‚   โ”œโ”€โ”€ IDL๋กœ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜
โ”‚   โ”‚   โ”œโ”€โ”€ marshalling/unmarshalling
โ”‚   โ”‚   โ””โ”€โ”€ MS-RPC (Windows)
โ”‚   โ””โ”€โ”€ COM (๊ฐ์ฒด ๋‹จ์œ„)
โ”‚       โ”œโ”€โ”€ CoCreateInstance
โ”‚       โ”œโ”€โ”€ IUnknown / ์ธํ„ฐํŽ˜์ด์Šค
โ”‚       โ””โ”€โ”€ out-of-proc COM (๋‚ด๋ถ€ RPC)
โ”œโ”€โ”€ ๋น„์šฉ ์ŠคํŽ™ํŠธ๋Ÿผ
โ”‚   โ”œโ”€โ”€ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ โ€” ์ˆ˜ ns
โ”‚   โ”œโ”€โ”€ ๋™๊ธฐํ™” ๊ฐ์ฒด โ€” 1~3 ฮผs
โ”‚   โ”œโ”€โ”€ ํŒŒ์ดํ”„/์†Œ์ผ“ โ€” ์ˆ˜~์ˆ˜์‹ญ ฮผs
โ”‚   โ””โ”€โ”€ RPC/COM โ€” ์ˆ˜์‹ญ~์ˆ˜๋ฐฑ ฮผs
โ”œโ”€โ”€ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„
โ”‚   โ”œโ”€โ”€ ์†๋„: ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ โ‰ซ ํŒŒ์ดํ”„ โ‰ซ RPC
โ”‚   โ”œโ”€โ”€ ์•ˆ์ „์„ฑ: ๋ฉ”์‹œ์ง€ ํยท์†Œ์ผ“ (๊ฒฉ๋ฆฌ ๊ฐ•ํ•จ) > ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ (์ง์ ‘ ๋™๊ธฐํ™”)
โ”‚   โ””โ”€โ”€ ์ถ”์ƒํ™”: RPC/COM > ๋ฉ”์‹œ์ง€ ํ > ํŒŒ์ดํ”„ > ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ
โ”œโ”€โ”€ ๋ณด์•ˆ
โ”‚   โ”œโ”€โ”€ ACL (Named ๊ฐ์ฒด)
โ”‚   โ”œโ”€โ”€ Integrity Level (Windows)
โ”‚   โ””โ”€โ”€ ์ž…๋ ฅ ๊ฒ€์ฆ (์‹ ๋ขฐ ๊ฒฝ๊ณ„)
โ””โ”€โ”€ ์–ธ๋ฆฌ์–ผ
    โ”œโ”€โ”€ FPlatformProcess::CreatePipe (์ต๋ช… ํŒŒ์ดํ”„)
    โ”œโ”€โ”€ FPlatformProcess::CreateProc (์ž์‹ ํ”„๋กœ์„ธ์Šค)
    โ”œโ”€โ”€ IMessageBus / MessageBus ํ”Œ๋Ÿฌ๊ทธ์ธ
    โ”œโ”€โ”€ Live Coding (named pipe)
    โ””โ”€โ”€ ์™ธ๋ถ€ ๋นŒ๋“œ ๋„๊ตฌ์™€์˜ ํ†ต์‹ 

2. ํ•œ ์ค„ ์ •์˜ โ€” IPC๋ž€ ๋ฌด์—‡์ด๊ณ  ์™œ ํ•„์š”ํ•œ๊ฐ€

ํ•ต์‹ฌ ํ•œ ๋ฌธ์žฅ

IPC(Inter-Process Communication, ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ )๋Š” OS๊ฐ€ ๊ฐ•์ œํ•˜๋Š” ์ฃผ์†Œ ๊ณต๊ฐ„ ๊ฒฉ๋ฆฌ๋ฅผ ๊นจ์ง€ ์•Š์œผ๋ฉด์„œ ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ธฐ๊ฑฐ๋‚˜ ๋™๊ธฐํ™” ์‹ ํ˜ธ๋ฅผ ๊ตํ™˜ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ์ด์นญ์ž…๋‹ˆ๋‹ค.

์™œ ๊ทธ๋ƒฅ ๋ฉ”๋ชจ๋ฆฌ์— ์“ฐ๋ฉด ์•ˆ ๋˜๋‚˜ โ€” ์ฃผ์†Œ ๊ณต๊ฐ„ ๊ฒฉ๋ฆฌ

ํ”„๋กœ์„ธ์Šค vs ์Šค๋ ˆ๋“œ(19)์™€ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ(21)์—์„œ ์ •๋ฆฌํ•œ ๊ทธ๋Œ€๋กœ์ง€๋งŒ, IPC์˜ ์ถœ๋ฐœ์ ์ด๋ผ ๋‹ค์‹œ ์งš์Šต๋‹ˆ๋‹ค.

1
2
3
4
ํ”„๋กœ์„ธ์Šค P1: ๊ฐ€์ƒ ์ฃผ์†Œ 0x12345678 โ†’ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” P1 โ†’ ๋ฌผ๋ฆฌ ์ฃผ์†Œ 0xAAAA
ํ”„๋กœ์„ธ์Šค P2: ๊ฐ€์ƒ ์ฃผ์†Œ 0x12345678 โ†’ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” P2 โ†’ ๋ฌผ๋ฆฌ ์ฃผ์†Œ 0xBBBB
                                                     โ†‘ ๊ฐ™์€ ๊ฐ€์ƒ ์ฃผ์†Œ๊ฐ€
                                                       ๋‹ค๋ฅธ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ!

P1์ด ์ž๊ธฐ ๊ฐ€์ƒ ์ฃผ์†Œ 0x12345678์— 42๋ฅผ ์จ๋„ P2๊ฐ€ ๊ฐ™์€ ์ฃผ์†Œ๋ฅผ ์ฝ์œผ๋ฉด ์ „ํ˜€ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ด…๋‹ˆ๋‹ค. ์ด๊ฒŒ ์ฃผ์†Œ ๊ณต๊ฐ„ ๊ฒฉ๋ฆฌ(address space isolation) ์ž…๋‹ˆ๋‹ค. OS๊ฐ€ ๊ฐ•์ œํ•˜๊ณ  MMU(Memory Management Unit)๊ฐ€ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฉ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” ์„ธ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

  • ์•ˆ์ •์„ฑ โ€” ํ•œ ํ”„๋กœ์„ธ์Šค์˜ ๋ฒ„๊ทธ(use-after-freeยทwild pointerยท์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ)๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ง๊ฐ€๋œจ๋ฆฌ์ง€ ์•Š๊ฒŒ.
  • ๋ณด์•ˆ โ€” ์•…์˜์  ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ๋น„๋ฐ€ ๋ฐ์ดํ„ฐ(์•”ํ˜ธํ™” ํ‚คยท์„ธ์…˜ ํ† ํฐ)๋ฅผ ์ฝ์ง€ ๋ชปํ•˜๊ฒŒ.
  • ์ž์› ๊ฒฉ๋ฆฌ โ€” ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฃฝ์–ด๋„ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋Š” ์‚ด์•„ ์žˆ๊ฒŒ (Chrome์˜ ํƒญ๋ณ„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋Œ€ํ‘œ ์˜ˆ).

๊ฒฉ๋ฆฌ๊ฐ€ ์žˆ์œผ๋‹ˆ ํ”„๋กœ์„ธ์Šค๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ธฐ๋ ค๋ฉด ๊ทธ ๊ฒฉ๋ฆฌ๋ฅผ ํ•œ ๋ฒˆ ์šฐํšŒํ•˜๊ฑฐ๋‚˜, ํ†ต์‹  ์ฑ„๋„์„ ๋”ฐ๋กœ ๋งŒ๋“ค๊ฑฐ๋‚˜ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ IPC๊ฐ€ ํ’€์–ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ•œ๊ฐ€ โ€” ์ปค๋„์ด ์ค‘์žฌ

๊ฒฉ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž ๋ชจ๋“œ์—์„œ ๊นจ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๋ชจ๋“œ ์ฝ”๋“œ๋Š” ์ž๊ธฐ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์— ๋งคํ•‘๋˜์ง€ ์•Š์€ ์ฃผ์†Œ๋ฅผ ๋งŒ์ง€๋ฉด ์ฆ‰์‹œ page fault โ†’ segfault๋กœ ์ฃฝ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฒฉ๋ฆฌ๋ฅผ ํ•ฉ๋ฒ•์ ์œผ๋กœ ์šฐํšŒํ•˜๋ ค๋ฉด ์ปค๋„ ๋ชจ๋“œ๋ฅผ ๊ฑฐ์ณ์•ผ ํ•˜๊ณ , ๊ทธ๊ฒŒ ์‹œ์Šคํ…œ ์ฝœ์ž…๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
ํ”„๋กœ์„ธ์Šค P1 (์‚ฌ์šฉ์ž ๋ชจ๋“œ)
  โ†“ write(pipe_fd, data, n)  โ€” ์‹œ์Šคํ…œ ์ฝœ
์‚ฌ์šฉ์ž โ†’ ์ปค๋„ ๋ชจ๋“œ (๋ชจ๋“œ ์Šค์œ„์น˜, ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ(21))
  โ†“
์ปค๋„: ์ž๊ธฐ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ํŒŒ์ดํ”„ ๋ฒ„ํผ์— data ๋ณต์‚ฌ (์ด๊ฑด ํ•ฉ๋ฒ•)
  โ†“ ์ปค๋„ โ†’ ์‚ฌ์šฉ์ž ๋ชจ๋“œ
ํ”„๋กœ์„ธ์Šค P2 (์‚ฌ์šฉ์ž ๋ชจ๋“œ)
  โ†“ read(pipe_fd, buf, n)
์‚ฌ์šฉ์ž โ†’ ์ปค๋„ ๋ชจ๋“œ
  โ†“
์ปค๋„: ํŒŒ์ดํ”„ ๋ฒ„ํผ์—์„œ buf๋กœ ๋ณต์‚ฌ
  โ†“ ์ปค๋„ โ†’ ์‚ฌ์šฉ์ž ๋ชจ๋“œ

P1์ด P2์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง์ ‘ ๋งŒ์ง€๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ๋‘˜ ๋‹ค ์ปค๋„ ์•ˆ์˜ ๊ณต์šฉ ์ž๋ฃŒ๊ตฌ์กฐ(ํŒŒ์ดํ”„ ๋ฒ„ํผยท๋ฉ”์‹œ์ง€ ํยท์†Œ์ผ“ ๋ฒ„ํผ) ์— ์ž๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๊ธฐ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ๊ฐ‘๋‹ˆ๋‹ค. ์ปค๋„์€ ์–‘์ชฝ ํ”„๋กœ์„ธ์Šค์˜ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์„ ๋‹ค ์•Œ๋ฏ€๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์™ธ๊ฐ€ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์ž…๋‹ˆ๋‹ค. ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ฒ˜์Œ ํ•œ ๋ฒˆ ์ปค๋„์ด โ€œ์ด ๋ฌผ๋ฆฌ ํŽ˜์ด์ง€๋ฅผ P1ยทP2 ๋‘˜ ๋‹ค์˜ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์— ๋งคํ•‘ํ•˜๋ผโ€๊ณ  ์„ธํŒ…ํ•ด์ฃผ๋ฉด, ๊ทธ ๋’ค๋กœ P1ยทP2๋Š” ์‚ฌ์šฉ์ž ๋ชจ๋“œ์—์„œ ์ž๊ธฐ ๊ฐ€์ƒ ์ฃผ์†Œ๋กœ ๊ทธ๋ƒฅ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ€์žฅ ๋น ๋ฆ…๋‹ˆ๋‹ค. ๋Œ€์‹  ๊ทธ ๋ฉ”๋ชจ๋ฆฌ์—์„œ race condition์„ ๋ง‰๋Š” ๊ฑด ์‚ฌ์šฉ์ž ์ฝ”๋“œ์˜ ์ฑ…์ž„์ž…๋‹ˆ๋‹ค โ€” ์ปค๋„์€ ๋งคํ•‘๋งŒ ๋„์™€์ฃผ๊ณ  ๋™๊ธฐํ™”๋Š” ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

ํ๋ฆ„ ํ•œ๋ˆˆ์—

1
2
3
4
5
6
7
8
9
10
11
12
ํ”„๋กœ์„ธ์Šค P1                     ์ปค๋„                      ํ”„๋กœ์„ธ์Šค P2
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€                       โ”€โ”€โ”€โ”€                      โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
write/send/post  โ”€โ”€โ”€โ”€โ”€syscallโ”€โ”€โ”€โ”€โ†’  [๋ฒ„ํผ/ํ/๊ฐ์ฒด]
                                          โ”‚
                                          โ”‚   (ํ˜น์€ ๊ณต์œ  ํŽ˜์ด์ง€ ๋งคํ•‘)
                                          โ†“
                                    [ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” P2์— ๋งคํ•‘]
                                          โ†“
                            โ”€โ”€โ”€โ”€โ”€โ”€syscallโ”€โ”€โ”€โ”€โ”€โ†’   read/recv/get
                                                            โ”‚
                                                            โ†“
                                                          ๋ฐ์ดํ„ฐ ์ˆ˜์‹ 

์™œ IPC๋ฅผ ์ž˜ ๊ณจ๋ผ์•ผ ํ•˜๋Š”๊ฐ€

๊ฐ™์€ โ€œ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ธด๋‹คโ€๋Š” ์ž‘์—…์ด๋ผ๋„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๋”ฐ๋ผ ์ˆ˜์‹ญ ns(๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ํ•œ ์ค„ ์ฝ๊ธฐ) ์—์„œ ์ˆ˜์‹ญ ฮผs(RPC ํ•œ ๋ฒˆ ํ˜ธ์ถœ) ๊นŒ์ง€ 1000๋ฐฐ ์ด์ƒ ๋น„์šฉ ์ฐจ์ด๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค. ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ(21)์—์„œ ๋ณธ ๋™๊ธฐํ™” ๊ฐ์ฒด ์„ ํƒ๊ณผ ๋˜‘๊ฐ™์€ ์˜์‚ฌ๊ฒฐ์ • ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค โ€” ์–ผ๋งˆ๋‚˜ ๋นˆ๋ฒˆํ•œ๊ฐ€, ์–ผ๋งˆ๋‚˜ ํฐ๊ฐ€, ๊ฒฉ๋ฆฌยท๋ณด์•ˆ์ด ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ๊ฐ€.


3. ๋ถ„๋ฅ˜์ถ• 3๊ฐ€์ง€ โ€” ๋ฐ์ดํ„ฐ/์‹ ํ˜ธยท์ปค๋„ ๊ฒฝ์œ /์‚ฌ์šฉ์žยท๋กœ์ปฌ/๋„คํŠธ์›Œํฌ

IPC ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๋„ˆ๋ฌด ๋งŽ์•„ ๋ณด์ด์ง€๋งŒ, ์‚ฌ์‹ค ์„ธ ๊ฐœ์˜ ์ถ•์œผ๋กœ ๋ถ„๋ฅ˜ํ•˜๋ฉด ์ฐจ์ด๊ฐ€ ์„ ๋ช…ํ•ด์ง‘๋‹ˆ๋‹ค.

๋ถ„๋ฅ˜์ถ• 1 โ€” ๋ฐ์ดํ„ฐ ์ „์†ก vs ์‹ ํ˜ธ ์ „์†ก

์œ ํ˜•๋ฌด์—‡์„ ์˜ฎ๊ธฐ๋‚˜๋ฉ”์ปค๋‹ˆ์ฆ˜
๋ฐ์ดํ„ฐ ์ „์†ก (data-carrying)์ž„์˜ ํฌ๊ธฐ์˜ ๋ฐ”์ดํŠธํŒŒ์ดํ”„ยท๋ฉ”์‹œ์ง€ ํยท๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌยท์†Œ์ผ“ยท๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ
์‹ ํ˜ธ ์ „์†ก (signaling)์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‚ฌ์‹ค์‹œ๊ทธ๋„ยทEvent ๊ฐ์ฒดยท์„ธ๋งˆํฌ์–ดยท๋ฎคํ…์Šค

๋ฐ์ดํ„ฐ ์ „์†ก ์ฑ„๋„์€ ๋ฌด์—‡์„ ๋ณด๋ƒˆ๋Š”๊ฐ€๊ฐ€ ํ•ต์‹ฌ์ด๊ณ , ์‹ ํ˜ธ ์ „์†ก์€ ์–ธ์ œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ฌ๋Š”๊ฐ€๊ฐ€ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. ์‹ค๋ฌด์—์„  ๋‘˜์„ ์ง์ง€์–ด ์”๋‹ˆ๋‹ค โ€” ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๊ณ  ์„ธ๋งˆํฌ์–ด๋กœ โ€œ๋‹ค ์ผ๋‹คโ€๊ณ  ์•Œ๋ฆฌ๋Š” ์‹. ๋ฉ”์ผ์Šฌ๋กฏ์— ์ž‘์€ ๋ช…๋ น์„ ๋„ฃ๊ณ  ๋ฐ›๋Š” ์ชฝ์ด Event ๊ฐ์ฒด๋กœ ๊นจ์–ด๋‚˜๋Š” ์‹.

๋ถ„๋ฅ˜์ถ• 2 โ€” ์ปค๋„ ๊ฒฝ์œ  vs ์‚ฌ์šฉ์ž ๋ชจ๋“œ ์ง์ ‘

์œ ํ˜•๋งค ๋™์ž‘๋งˆ๋‹ค ์ปค๋„ ์ง„์ž…?๋ฉ”์ปค๋‹ˆ์ฆ˜
๋งค๋ฒˆ ์ปค๋„ ๊ฒฝ์œ O (์‹œ์Šคํ…œ ์ฝœ 1~2ํšŒ)ํŒŒ์ดํ”„ยท๋ฉ”์‹œ์ง€ ํยท์†Œ์ผ“ยท์‹œ๊ทธ๋„ยทRPC
์ดˆ๊ธฐ 1ํšŒ๋งŒ ์ปค๋„X (์ดํ›„ user-mode ์ ‘๊ทผ)๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌยท๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ

๋งค๋ฒˆ ์ปค๋„ ๊ฒฝ์œ ๋Š” ๋ชจ๋“œ ์Šค์œ„์น˜ ๋น„์šฉ(์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ(21)) ์ด ๋งค ์†ก์ˆ˜์‹ ๋งˆ๋‹ค ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค โ€” ๋ณดํ†ต 100~500 ns ร— 2ํšŒ + ์ปค๋„ ์•ˆ์—์„œ ๋ฒ„ํผ ๋ณต์‚ฌ. ๊ทธ๋ž˜์„œ ๋นˆ๋„๊ฐ€ ๋†’์œผ๋ฉด ๋น„์šฉ์ด ๋ˆ„์ ๋ฉ๋‹ˆ๋‹ค.

๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ฒ˜์Œ CreateFileMapping/MapViewOfFile ํ˜ธ์ถœ ์‹œ์—๋งŒ ์ปค๋„์„ ๊ฑฐ์น˜๊ณ , ๊ทธ ๋’ค๋กœ๋Š” ์ผ๋ฐ˜ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์ž…๋‹ˆ๋‹ค โ€” ๋งค ์ ‘๊ทผ ๋น„์šฉ์ด ์ˆ˜ nanosecond. ๋‹จ์ ์€ ๋™๊ธฐํ™”ยท๋ฉ”์‹œ์ง€ ๊ฒฝ๊ณ„ยท์ƒ์‚ฐ์ž/์†Œ๋น„์ž ํŽ˜์ด์‹ฑ์„ ์ง์ ‘ ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

๋ถ„๋ฅ˜์ถ• 3 โ€” ๊ฐ™์€ ๋จธ์‹  vs ๋„คํŠธ์›Œํฌ ๊ฐ€๋Šฅ

์œ ํ˜•์–ด๋””์„œ ๋™์ž‘๋ฉ”์ปค๋‹ˆ์ฆ˜
๊ฐ™์€ ๋จธ์‹  ์ „์šฉํ•œ OS ์ธ์Šคํ„ด์Šค ์•ˆ์ต๋ช… ํŒŒ์ดํ”„ยท๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌยท์‹œ๊ทธ๋„ยทMailslotยทUNIX domain socket
๋„คํŠธ์›Œํฌ ๊ฐ€๋Šฅ๊ฐ™์€ ๋จธ์‹  + ๋‹ค๋ฅธ ๋จธ์‹ ๋ช…๋ช… ํŒŒ์ดํ”„(Windows SMB ๊ฒฝ์œ )ยทTCP/UDP ์†Œ์ผ“ยทMS-RPC

๊ฐ™์€ ๋จธ์‹  ์ „์šฉ์€ ๋ณดํ†ต ๋” ๋น ๋ฅด๊ณ  ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ๊ฐ€๋Šฅ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๊ฐ™์€ ๋จธ์‹ ์—์„œ๋„ ์“ธ ์ˆ˜ ์žˆ์ง€๋งŒ ์•ฝ๊ฐ„์˜ ์ถ”๊ฐ€ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๊ฐ์ˆ˜ํ•ฉ๋‹ˆ๋‹ค(loopback ์ธํ„ฐํŽ˜์ด์Šค๋ผ๋„ ํ”„๋กœํ† ์ฝœ ์Šคํƒ์„ ํ†ต๊ณผ).

Windows์˜ named pipe๋Š” ๊ฐ™์€ ๋จธ์‹ ์—์„  ์ง์ ‘ IPC๋กœ ๋™์ž‘ํ•˜์ง€๋งŒ, \\server\pipe\name ํ˜•์‹์œผ๋กœ ๋‹ค๋ฅธ ๋จธ์‹ ์„ ๊ฐ€๋ฆฌํ‚ค๋ฉด SMB ํ”„๋กœํ† ์ฝœ ์œ„๋กœ ์ž๋™ ์ „ํ™˜๋˜์–ด ๋„คํŠธ์›Œํฌ IPC๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ ์ฝ”๋“œ๋Š” ๊ฐ™์Šต๋‹ˆ๋‹ค.

์„ธ ์ถ•์˜ ์กฐํ•ฉ ํ‘œ

๋ฉ”์ปค๋‹ˆ์ฆ˜๋ฐ์ดํ„ฐ/์‹ ํ˜ธ์ปค๋„ ๊ฒฝ์œ ๋„คํŠธ์›Œํฌ
์ต๋ช… ํŒŒ์ดํ”„๋ฐ์ดํ„ฐ๋งค๋ฒˆ๊ฐ™์€ ๋จธ์‹ 
๋ช…๋ช… ํŒŒ์ดํ”„๋ฐ์ดํ„ฐ๋งค๋ฒˆO (SMB)
POSIX mq๋ฐ์ดํ„ฐ๋งค๋ฒˆ๊ฐ™์€ ๋จธ์‹ 
PostMessage๋ฐ์ดํ„ฐ๋งค๋ฒˆ๊ฐ™์€ ๋จธ์‹ ยท๊ฐ™์€ ๋ฐ์Šคํฌํ†ฑ
Mailslot๋ฐ์ดํ„ฐ๋งค๋ฒˆO (๋„๋ฉ”์ธ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ)
๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋ฐ์ดํ„ฐ์ดˆ๊ธฐ๋งŒ๊ฐ™์€ ๋จธ์‹ 
๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ๋ฐ์ดํ„ฐ์ดˆ๊ธฐ๋งŒ๊ฐ™์€ ๋จธ์‹ 
Mutex/Semaphore/Event์‹ ํ˜ธ๋งค๋ฒˆ (Wait)๊ฐ™์€ ๋จธ์‹ 
์‹œ๊ทธ๋„ (POSIX)์‹ ํ˜ธ๋งค๋ฒˆ๊ฐ™์€ ๋จธ์‹ 
UNIX domain socket๋ฐ์ดํ„ฐ๋งค๋ฒˆ๊ฐ™์€ ๋จธ์‹ 
TCP/UDP ์†Œ์ผ“๋ฐ์ดํ„ฐ๋งค๋ฒˆO
MS-RPC / COM๋ฐ์ดํ„ฐ (ํ•จ์ˆ˜ ํ˜ธ์ถœ)๋งค๋ฒˆO

์ด ํ‘œ๋งŒ ์™ธ์›Œ๋„ ๋ฉด์ ‘์—์„œ IPC ์นดํƒˆ๋กœ๊ทธ๋ฅผ ํ•œ ๋ฒˆ์— ๋‹ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


4. ํŒŒ์ดํ”„ โ€” ์ต๋ช… ํŒŒ์ดํ”„์™€ ๋ช…๋ช… ํŒŒ์ดํ”„

4.1 ์ต๋ช… ํŒŒ์ดํ”„ (Anonymous Pipe)

๋ถ€๋ชจ-์ž์‹ ์‚ฌ์ด์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋‹จ๋ฐฉํ–ฅ ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋‹จ์ˆœํ•˜๊ณ  ๊ฐ€์žฅ ์˜ค๋ž˜๋œ IPC.

Windows โ€” CreatePipe

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <windows.h>

HANDLE hRead, hWrite;
SECURITY_ATTRIBUTES sa = { sizeof(sa), NULL, TRUE };  // bInheritHandle = TRUE
CreatePipe(&hRead, &hWrite, &sa, 0);  // ๋งˆ์ง€๋ง‰ 0์€ ๊ธฐ๋ณธ ๋ฒ„ํผ ํฌ๊ธฐ

// ์ž์‹ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ ์‹œ ํ•ธ๋“ค ์ƒ์†
PROCESS_INFORMATION pi;
STARTUPINFO si = { sizeof(si) };
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdInput = hRead;
si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
CreateProcess(NULL, L"child.exe", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);

// ๋ถ€๋ชจ๋Š” ์“ฐ๊ธฐ๋งŒ
CloseHandle(hRead);
DWORD written;
WriteFile(hWrite, "hello", 5, &written, NULL);
CloseHandle(hWrite);

POSIX โ€” pipe()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <unistd.h>

int fds[2];
pipe(fds);  // fds[0]: ์ฝ๊ธฐ, fds[1]: ์“ฐ๊ธฐ

pid_t pid = fork();
if (pid == 0) {  // ์ž์‹
    close(fds[1]);
    char buf[64];
    read(fds[0], buf, sizeof(buf));
    close(fds[0]);
} else {  // ๋ถ€๋ชจ
    close(fds[0]);
    write(fds[1], "hello", 5);
    close(fds[1]);
}

๋™์ž‘ ์›๋ฆฌ

1
2
3
4
5
6
7
8
9
10
๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค                  ์ปค๋„                       ์ž์‹ ํ”„๋กœ์„ธ์Šค
โ”€โ”€โ”€โ”€โ”€                          โ”€โ”€                          โ”€โ”€โ”€โ”€โ”€
write(hWrite, data)  โ”€โ”€syscallโ”€โ†’  [ํŒŒ์ดํ”„ ๋ฒ„ํผ (FIFO)]
                                          โ”‚
                                          โ”‚   (ํŽ˜์ด์ง€ ์บ์‹œ ๋น„์Šทํ•œ ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ)
                                          โ†“
                                  โ†โ”€syscallโ”€โ”€  read(hRead, buf)
                                                      โ”‚
                                                      โ†“
                                                    buf์— ๋ณต์‚ฌ

ํ•ต์‹ฌ์€ ์ปค๋„์ด FIFO ๋ฒ„ํผ(๋ณดํ†ต 4KB~64KB)๋ฅผ ๊ฐ€์ง€๊ณ , ์–‘์ชฝ์ด ๊ทธ ๋ฒ„ํผ์— ์‹œ์Šคํ…œ ์ฝœ๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๋ฒ„ํผ๊ฐ€ ๊ฐ€๋“ ์ฐจ๋ฉด WriteFile์ด ๋ธ”๋ก(๋˜๋Š” EAGAIN), ๋น„๋ฉด ReadFile์ด ๋ธ”๋ก.

์ต๋ช… ํŒŒ์ดํ”„์˜ ํ•œ๊ณ„

  • ๋ถ€๋ชจ-์ž์‹ ํ•œ์ • โ€” ํ•ธ๋“ค ์ƒ์†์œผ๋กœ ๊ณต์œ ํ•˜๋ฏ€๋กœ ๋ฌด๊ด€ํ•œ ํ”„๋กœ์„ธ์Šค์—์„  ๋ชป ์”€
  • ๋‹จ๋ฐฉํ–ฅ โ€” ์–‘๋ฐฉํ–ฅ์ด ํ•„์š”ํ•˜๋ฉด ํŒŒ์ดํ”„ 2๊ฐœ ํ•„์š”
  • ๋ฉ”์‹œ์ง€ ๊ฒฝ๊ณ„ ์—†์Œ โ€” 4๋ฐ”์ดํŠธ ๋‘ ๋ฒˆ ์จ๋„ 8๋ฐ”์ดํŠธ๋กœ ํ•œ ๋ฒˆ์— ์ฝํž ์ˆ˜ ์žˆ์Œ (๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ)
  • ๋กœ์ปฌ ํ•œ์ • โ€” ๋„คํŠธ์›Œํฌ ๋ถˆ๊ฐ€

4.2 ๋ช…๋ช… ํŒŒ์ดํ”„ (Named Pipe)

์ด๋ฆ„์œผ๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์–‘๋ฐฉํ–ฅ ํŒŒ์ดํ”„์ž…๋‹ˆ๋‹ค. ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๊ฐ€ ์—†๋Š” ํ”„๋กœ์„ธ์Šค๋ผ๋ฆฌ๋„ ํ†ต์‹  ๊ฐ€๋Šฅํ•˜๊ณ , Windows์—์„  ๋„คํŠธ์›Œํฌ IPC(๋‹ค๋ฅธ ๋จธ์‹ )๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Windows โ€” CreateNamedPipe

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// ์„œ๋ฒ„ ์ธก
HANDLE hPipe = CreateNamedPipe(
    L"\\\\.\\pipe\\MyService",        // ์ด๋ฆ„ (๋„คํŠธ์›Œํฌ: \\server\pipe\name)
    PIPE_ACCESS_DUPLEX,                // ์–‘๋ฐฉํ–ฅ
    PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,  // ๋ฉ”์‹œ์ง€ ๋ชจ๋“œ!
    PIPE_UNLIMITED_INSTANCES,
    4096, 4096,                        // out/in ๋ฒ„ํผ ํฌ๊ธฐ
    0,                                 // ๊ธฐ๋ณธ ํƒ€์ž„์•„์›ƒ
    NULL                               // ๊ธฐ๋ณธ ๋ณด์•ˆ
);

ConnectNamedPipe(hPipe, NULL);  // ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ๋Œ€๊ธฐ โ†’ ์ปจํ…์ŠคํŠธ ์Šค์œ„์น˜

DWORD bytesRead;
char buf[4096];
ReadFile(hPipe, buf, sizeof(buf), &bytesRead, NULL);

WriteFile(hPipe, "response", 8, &bytesWritten, NULL);

DisconnectNamedPipe(hPipe);
CloseHandle(hPipe);
1
2
3
4
5
6
7
8
9
10
// ํด๋ผ์ด์–ธํŠธ ์ธก
HANDLE hPipe = CreateFile(
    L"\\\\.\\pipe\\MyService",
    GENERIC_READ | GENERIC_WRITE,
    0, NULL, OPEN_EXISTING, 0, NULL
);

WriteFile(hPipe, "request", 7, &bytesWritten, NULL);
ReadFile(hPipe, buf, sizeof(buf), &bytesRead, NULL);
CloseHandle(hPipe);

POSIX โ€” mkfifo()

1
2
3
4
5
6
7
8
9
10
11
#include <sys/stat.h>

mkfifo("/tmp/myfifo", 0666);  // ํŒŒ์ผ ์‹œ์Šคํ…œ์— FIFO ๋…ธ๋“œ ์ƒ์„ฑ

// ํ”„๋กœ์„ธ์Šค A
int fd = open("/tmp/myfifo", O_WRONLY);
write(fd, "hello", 5);

// ํ”„๋กœ์„ธ์Šค B (๋ณ„๋„ ์‹คํ–‰)
int fd = open("/tmp/myfifo", O_RDONLY);
read(fd, buf, sizeof(buf));

POSIX์˜ FIFO๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ค์ง€๋งŒ ๋ฐ์ดํ„ฐ๋Š” ๋””์Šคํฌ์— ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค โ€” ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฒ„ํผ๋งŒ ์”๋‹ˆ๋‹ค.

Windows ๋ช…๋ช… ํŒŒ์ดํ”„์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ

  • ์–‘๋ฐฉํ–ฅ(PIPE_ACCESS_DUPLEX) ๋˜๋Š” ๋‹จ๋ฐฉํ–ฅ(PIPE_ACCESS_INBOUND/OUTBOUND)
  • ๋ฉ”์‹œ์ง€ ๋ชจ๋“œ(PIPE_TYPE_MESSAGE) โ€” ๋ฉ”์‹œ์ง€ ๊ฒฝ๊ณ„ ๋ณด์กด! ํ•œ ๋ฒˆ WriteFileํ•œ ๋งŒํผ ํ•œ ๋ฒˆ์— ReadFile๋กœ ๋ฐ›์Œ
  • ๋ฐ”์ดํŠธ ๋ชจ๋“œ(PIPE_TYPE_BYTE) โ€” ์ต๋ช… ํŒŒ์ดํ”„์™€ ๊ฐ™์€ ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ
  • ๋„คํŠธ์›Œํฌ ๊ฐ€๋Šฅ โ€” \\server\pipe\name์œผ๋กœ ๋‹ค๋ฅธ ๋จธ์‹  ์ ‘๊ทผ (SMB ๊ฒฝ์œ )
  • ์ธ์Šคํ„ด์Šค ์ œํ•œ โ€” PIPE_UNLIMITED_INSTANCES๋กœ ๋‹ค์ค‘ ํด๋ผ์ด์–ธํŠธ
  • ACL ์ ์šฉ โ€” ๋ณด์•ˆ ๋””์Šคํฌ๋ฆฝํ„ฐ๋กœ ์ ‘๊ทผ ์ œ์–ด

์ต๋ช… vs ๋ช…๋ช… ํŒŒ์ดํ”„ ๋น„๊ต

ํ•ญ๋ชฉ์ต๋ช… ํŒŒ์ดํ”„๋ช…๋ช… ํŒŒ์ดํ”„
์‚ฌ์šฉ ๋ฒ”์œ„๋ถ€๋ชจ-์ž์‹ ํ•œ์ •๋ฌด๊ด€ ํ”„๋กœ์„ธ์Šคยท๋„คํŠธ์›Œํฌ
๋ฐฉํ–ฅ๋‹จ๋ฐฉํ–ฅ์–‘๋ฐฉํ–ฅ ๊ฐ€๋Šฅ
๋ฉ”์‹œ์ง€ ๊ฒฝ๊ณ„์—†์Œ (๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ)๋ชจ๋“œ ์„ ํƒ (๋ฉ”์‹œ์ง€/๋ฐ”์ดํŠธ)
์ด๋ฆ„์—†์Œ (ํ•ธ๋“ค ์ƒ์†)\\.\pipe\name
๋ณด์•ˆํ•ธ๋“ค ์ƒ์† ๊ฐ€์‹œ์„ฑACL ์ ์šฉ
๋„คํŠธ์›ŒํฌXO (SMB)
์‚ฌ์šฉ์ฒ˜ํ‘œ์ค€ ์ž…์ถœ๋ ฅ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ, ์ž์‹ ํ”„๋กœ์„ธ์Šค ํ†ต์‹ ์„œ๋น„์Šค-ํด๋ผ์ด์–ธํŠธ, ๋””๋ฒ„๊ฑฐ-ํ”„๋กœ์„ธ์Šค, ๋นŒ๋“œ ๋„๊ตฌ

์‚ฌ์šฉ ์‚ฌ๋ก€

1
2
3
4
5
6
7
8
9
10
Windows ์ต๋ช… ํŒŒ์ดํ”„:
  - cmd ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ (cmd | grep)
  - Visual Studio๊ฐ€ ์ž์‹ ์ปดํŒŒ์ผ๋Ÿฌ์™€ ํ†ต์‹  (์ถœ๋ ฅ ์บก์ฒ˜)
  - ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ stdout/stderr ๊ฐ€๋กœ์ฑ„๊ธฐ

Windows ๋ช…๋ช… ํŒŒ์ดํ”„:
  - SQL Server ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ (TCP ์™ธ ์˜ต์…˜)
  - Docker Desktop์˜ docker.exe โ†” engine
  - .NET์˜ NamedPipeServerStream / NamedPipeClientStream
  - ์–ธ๋ฆฌ์–ผ Live Coding์˜ ์—๋””ํ„ฐ โ†” ์ปดํŒŒ์ผ๋Ÿฌ ํ†ต์‹ 

5. ๋ฉ”์‹œ์ง€ ํ โ€” POSIX mqยทWindows PostMessageยทMailslot

ํŒŒ์ดํ”„์™€ ๊ฐ€์žฅ ํฐ ์ฐจ์ด๋Š” ๋ฉ”์‹œ์ง€ ๊ฒฝ๊ณ„๊ฐ€ ๋ณด์กด๋œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. 4๋ฐ”์ดํŠธ ๋ฉ”์‹œ์ง€ + 8๋ฐ”์ดํŠธ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋ฉด ๋ฐ›๋Š” ์ชฝ๋„ 4๋ฐ”์ดํŠธ + 8๋ฐ”์ดํŠธ๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค(ํŒŒ์ดํ”„๋Š” 12๋ฐ”์ดํŠธ ํ•œ ๋ฒˆ์— ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ).

5.1 POSIX ๋ฉ”์‹œ์ง€ ํ โ€” mq_*

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <mqueue.h>

struct mq_attr attr = {
    .mq_flags = 0,
    .mq_maxmsg = 10,        // ์ตœ๋Œ€ 10๊ฐœ ๋ฉ”์‹œ์ง€
    .mq_msgsize = 256,      // ๋ฉ”์‹œ์ง€๋‹น ์ตœ๋Œ€ 256๋ฐ”์ดํŠธ
    .mq_curmsgs = 0
};

// ์†ก์‹  ์ธก
mqd_t mq = mq_open("/myqueue", O_CREAT | O_WRONLY, 0644, &attr);
mq_send(mq, "hello", 5, 1);  // ๋งˆ์ง€๋ง‰ 1์€ priority
mq_close(mq);

// ์ˆ˜์‹  ์ธก
mqd_t mq = mq_open("/myqueue", O_RDONLY);
char buf[256];
unsigned prio;
mq_receive(mq, buf, sizeof(buf), &prio);
mq_close(mq);
mq_unlink("/myqueue");  // ํ ์ž์ฒด ์ œ๊ฑฐ

ํŠน์ง•:

  • ์šฐ์„ ์ˆœ์œ„ ํ โ€” ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ๋ฉ”์‹œ์ง€๊ฐ€ ๋จผ์ € ๋น ์ง
  • ๊ณ ์ • ๋ฉ”์‹œ์ง€ ํฌ๊ธฐ ์ œํ•œ โ€” mq_msgsize ์ดˆ๊ณผ ์‹œ ์†ก์‹  ์‹คํŒจ
  • ์•Œ๋ฆผ(mq_notify) โ€” ํ์— ๋ฉ”์‹œ์ง€ ๋„์ฐฉ ์‹œ ์‹œ๊ทธ๋„ ๋˜๋Š” ์Šค๋ ˆ๋“œ ์‹œ์ž‘
  • ๊ฐ™์€ ๋จธ์‹  ์ „์šฉ

System V ๊ณ„์—ด์˜ msgsnd/msgrcv๋„ ๋น„์Šทํ•œ ์—ญํ• ์ด์ง€๋งŒ POSIX ๋ฐฉ์‹์ด ๋” ๋ชจ๋˜ํ•˜๊ณ  ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.

5.2 Windows PostMessage/SendMessage โ€” GUI ์Šค๋ ˆ๋“œ ๋ฉ”์‹œ์ง€ ํ

Windows๋Š” ๋ชจ๋“  GUI ์Šค๋ ˆ๋“œ๊ฐ€ ์ž๊ธฐ ๋ฉ”์‹œ์ง€ ํ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ/ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ด ํ์— ๋ฉ”์‹œ์ง€๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1
2
3
4
5
6
// ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ์œˆ๋„์šฐ์— ๋ฉ”์‹œ์ง€ ๋ณด๋‚ด๊ธฐ
HWND hwnd = FindWindow(L"Notepad", NULL);  // ๋ฉ”๋ชจ์žฅ ์ฐพ๊ธฐ
PostMessage(hwnd, WM_USER + 100, wParam, lParam);  // ๋น„๋™๊ธฐ (์ฆ‰์‹œ ๋ฆฌํ„ด)

// ๋˜๋Š” ๋™๊ธฐ๋กœ (๋Œ€์ƒ์ด ์ฒ˜๋ฆฌ ๋๋‚  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ)
LRESULT result = SendMessage(hwnd, WM_USER + 100, wParam, lParam);
ํ•จ์ˆ˜์˜๋ฏธ
PostMessageํ์— ๋„ฃ๊ณ  ์ฆ‰์‹œ ๋ฆฌํ„ด (๋น„๋™๊ธฐ)
SendMessage๋Œ€์ƒ์ด ์ฒ˜๋ฆฌ ๋๋‚  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ (๋™๊ธฐ) โ€” ๋Œ€์ƒ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‘๋‹ต ์•ˆ ํ•˜๋ฉด ๋ฌดํ•œ ๋Œ€๊ธฐ ๊ฐ€๋Šฅ
SendMessageTimeoutํƒ€์ž„์•„์›ƒ ์žˆ๋Š” ๋™๊ธฐ ํ˜ธ์ถœ

ํŠน์ง•:

  • ๊ฐ™์€ ๋ฐ์Šคํฌํ†ฑ ์•ˆ์˜ GUI ์Šค๋ ˆ๋“œ๋งŒ โ€” ์„œ๋น„์Šค ํ”„๋กœ์„ธ์Šค๋‚˜ ๋‹ค๋ฅธ ์„ธ์…˜์—๋Š” ์•ˆ ๋จ
  • WPARAM/LPARAM ์€ 32/64๋น„ํŠธ ์ •์ˆ˜๋กœ ์ž‘์€ ๋ฐ์ดํ„ฐ๋งŒ ์ง์ ‘ ์ „๋‹ฌ โ€” ํฐ ๋ฐ์ดํ„ฐ๋Š” WM_COPYDATA๋กœ ๊ตฌ์กฐ์ฒด ํฌ์ธํ„ฐ ์ „๋‹ฌ
  • WM_COPYDATA ์‚ฌ์šฉ ์‹œ OS๊ฐ€ ์ž๋™์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋Œ€์ƒ ํ”„๋กœ์„ธ์Šค ์ฃผ์†Œ ๊ณต๊ฐ„์œผ๋กœ ๋ณต์‚ฌ
  • GUI ์•ฑ๋ผ๋ฆฌ์˜ ๊ฐ„๋‹จํ•œ ๋ช…๋ น ์ „๋‹ฌ์— ํ”ํžˆ ์‚ฌ์šฉ (์˜ˆ: ๋‘ ๋ฒˆ์งธ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ฒซ ๋ฒˆ์งธ ์ธ์Šคํ„ด์Šค์— ์ธ์ž ์ „๋‹ฌ)
1
2
3
4
5
COPYDATASTRUCT cds;
cds.dwData = 0xCAFEBABE;
cds.cbData = strlen(msg) + 1;
cds.lpData = (PVOID)msg;
SendMessage(hwnd, WM_COPYDATA, (WPARAM)hThisWnd, (LPARAM)&cds);

5.3 Windows Mailslot โ€” ์‹ ๋ขฐ์„ฑ ์—†๋Š” ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ

Mailslot์€ ์ž‘์€ ๋ฉ”์‹œ์ง€์˜ ๋‹จ๋ฐฉํ–ฅ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ๋ฅผ ์œ„ํ•œ IPC์ž…๋‹ˆ๋‹ค. ๋„๋ฉ”์ธ ์•ˆ์˜ ์—ฌ๋Ÿฌ ๋จธ์‹ ์— ๊ฐ™์€ ๋ฉ”์‹œ์ง€๋ฅผ ํ•œ ๋ฒˆ์— ๋ฟŒ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
// ์ˆ˜์‹  ์ธก (์„œ๋ฒ„)
HANDLE hSlot = CreateMailslot(
    L"\\\\.\\mailslot\\MyMailslot",
    0,                  // ์ตœ๋Œ€ ๋ฉ”์‹œ์ง€ ํฌ๊ธฐ (0 = ๋ฌด์ œํ•œ)
    MAILSLOT_WAIT_FOREVER,
    NULL
);

DWORD bytesRead;
char buf[512];
ReadFile(hSlot, buf, sizeof(buf), &bytesRead, NULL);
1
2
3
4
5
6
7
8
9
10
11
// ์†ก์‹  ์ธก (ํด๋ผ์ด์–ธํŠธ) โ€” ๋‹จ๋ฐฉํ–ฅ
HANDLE hMail = CreateFile(
    L"\\\\.\\mailslot\\MyMailslot",
    GENERIC_WRITE,
    FILE_SHARE_READ,
    NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
);
WriteFile(hMail, "broadcast", 9, &written, NULL);

// ๋„๋ฉ”์ธ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ
HANDLE hMail = CreateFile(L"\\\\*\\mailslot\\MyMailslot", ...);

ํŠน์ง•:

  • ๋‹จ๋ฐฉํ–ฅ (์„œ๋ฒ„ โ† ํด๋ผ์ด์–ธํŠธ๋งŒ)
  • ์‹ ๋ขฐ์„ฑ ์—†์Œ โ€” ํฐ ๋ฉ”์‹œ์ง€(>424B)๋Š” ๋„๋ฉ”์ธ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ์‹œ ์†์‹ค ๊ฐ€๋Šฅ
  • ๋ฉ”์‹œ์ง€ ๊ฒฝ๊ณ„ ๋ณด์กด
  • ๋„๋ฉ”์ธ ์™€์ผ๋“œ์นด๋“œ โ€” \\*\mailslot\name์œผ๋กœ ๋„๋ฉ”์ธ ๋‚ด ๋ชจ๋“  ๋จธ์‹ 
  • ๋ณด์•ˆ ๋ฐœ๊ฒฌ(discovery), ๋„คํŠธ์›Œํฌ ๊ฒŒ์ž„์˜ LAN ๊ด‘๊ณ  ๊ฐ™์€ ์šฉ๋„์— ์‚ฌ์šฉ

Mailslot์€ ๋ชจ๋˜ Windows์—์„  ๊ฑฐ์˜ deprecated ๋ถ„์œ„๊ธฐ์ด๊ณ , ์ƒˆ ์ฝ”๋“œ์—์„  ์ž˜ ์•ˆ ์”๋‹ˆ๋‹ค. ์•Œ์•„๋‘๋Š” ์ •๋„๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

5.4 ๋ฉ”์‹œ์ง€ ํ ๋น„๊ต ํ‘œ

ํ•ญ๋ชฉPOSIX mqWindows PostMessageWindows Mailslot
๋ฐฉํ–ฅ์–‘๋ฐฉํ–ฅ(๋ณ„ ํ)์–‘๋ฐฉํ–ฅ๋‹จ๋ฐฉํ–ฅ
๋ฉ”์‹œ์ง€ ๊ฒฝ๊ณ„OOO
์šฐ์„ ์ˆœ์œ„OX (FIFO)X
ํฌ๊ธฐ ์ œํ•œmq_msgsizeWPARAM/LPARAM (8B+8B) ๋˜๋Š” WM_COPYDATA๋ฌด์ œํ•œ (๋‹จ, ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ์‹œ 424B)
๋„คํŠธ์›ŒํฌXXO (๋„๋ฉ”์ธ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ)
์‚ฌ์šฉ์ฒ˜UNIX ์„œ๋น„์Šค ํGUI ์•ฑ ๊ฐ„ ๋ช…๋ น๋„คํŠธ์›Œํฌ ๋ฐœ๊ฒฌยทLAN ๊ด‘๊ณ 

6. ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ โ€” ๊ฐ€์žฅ ๋น ๋ฅธ IPC

6.1 ์™œ ๊ฐ€์žฅ ๋น ๋ฅธ๊ฐ€

์ด๋ฏธ ๋ดค๋“ฏ์ด ๋‹ค๋ฅธ IPC๋Š” ๋งค ์†ก์ˆ˜์‹ ๋งˆ๋‹ค ์‹œ์Šคํ…œ ์ฝœ + ๋ชจ๋“œ ์Šค์œ„์น˜ + ์ปค๋„ ์•ˆ ๋ฒ„ํผ ๋ณต์‚ฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. 1KB๋ฅผ ๋ณด๋‚ด๋ฉด ์‚ฌ์šฉ์žโ†’์ปค๋„ ๋ณต์‚ฌ + ์ปค๋„โ†’์‚ฌ์šฉ์ž ๋ณต์‚ฌ = ์ด 2KB ๋ฉ”๋ชจ๋ฆฌ ๋ณต์‚ฌ + ์‹œ์Šคํ…œ ์ฝœ 2ํšŒ.

๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ดˆ๊ธฐ ์„ธํŒ… ํ•œ ๋ฒˆ๋งŒ ์‹œ์Šคํ…œ ์ฝœ์ด๊ณ , ๊ทธ ๋’ค๋กœ๋Š” ๋‘ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ™์€ ๋ฌผ๋ฆฌ ํŽ˜์ด์ง€๋ฅผ ์ž๊ธฐ ๊ฐ€์ƒ ์ฃผ์†Œ์— ๋งคํ•‘ํ•ด๋‘๋ฏ€๋กœ ์ผ๋ฐ˜ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ(์ˆ˜ nanosecond)๊ณผ ๊ฐ™์€ ์†๋„์ž…๋‹ˆ๋‹ค. 1KB๋ฅผ โ€œ๋ณด๋‚ด๋Š”โ€ ๊ฒŒ ์‚ฌ์‹ค์€ ๊ทธ ๋ฉ”๋ชจ๋ฆฌ์— ๊ทธ๋ƒฅ ์“ฐ๋Š” ๊ฒƒ์ด๋ผ ๋ณต์‚ฌ๋„ ์—†์Šต๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
์ดˆ๊ธฐ ์„ธํŒ… (ํ•œ ๋ฒˆ):
  P1: CreateFileMapping โ†’ ์ปค๋„์ด ํŽ˜์ด์ง€ ๊ฐ์ฒด ์ƒ์„ฑ
  P1: MapViewOfFile     โ†’ P1 ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์— ๋งคํ•‘ (๊ฐ€์ƒ ์ฃผ์†Œ V1)
  P2: OpenFileMapping   โ†’ ๊ฐ™์€ ๊ฐ์ฒด ์ฐพ๊ธฐ (์ด๋ฆ„ ๊ธฐ๋ฐ˜)
  P2: MapViewOfFile     โ†’ P2 ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์— ๋งคํ•‘ (๊ฐ€์ƒ ์ฃผ์†Œ V2)
        (V1๊ณผ V2๋Š” ๊ฐ€์ƒ ์ฃผ์†Œ๋งŒ ๋‹ค๋ฅผ ๋ฟ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฌผ๋ฆฌ ํŽ˜์ด์ง€๋Š” ๊ฐ™์Œ)

์ดํ›„ ํ†ต์‹ :
  P1: *V1 = 42;         โ† ๊ทธ๋ƒฅ ๋ฉ”๋ชจ๋ฆฌ ์“ฐ๊ธฐ (์ˆ˜ ns)
  P2: int x = *V2;      โ† ๊ทธ๋ƒฅ ๋ฉ”๋ชจ๋ฆฌ ์ฝ๊ธฐ (์ˆ˜ ns)

6.2 Windows โ€” CreateFileMapping + MapViewOfFile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// ํ”„๋กœ์„ธ์Šค P1 (์ƒ์„ฑ์ž)
HANDLE hMap = CreateFileMapping(
    INVALID_HANDLE_VALUE,         // ์‹ค์ œ ํŒŒ์ผ ์—†์Œ โ†’ ํŽ˜์ด์ง• ํŒŒ์ผ ๊ธฐ๋ฐ˜ ์ต๋ช…
    NULL,                         // ๊ธฐ๋ณธ ๋ณด์•ˆ
    PAGE_READWRITE,
    0, 4096,                       // ํฌ๊ธฐ (4KB)
    L"Global\\MySharedMem"         // ์ด๋ฆ„ (๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฐพ์„ ์ด๋ฆ„)
);

void* pView = MapViewOfFile(
    hMap,
    FILE_MAP_ALL_ACCESS,
    0, 0,                          // offset
    4096                           // ๋งคํ•‘ ํฌ๊ธฐ
);

strcpy((char*)pView, "Hello from P1");

// ... P2๊ฐ€ ์ฝ์„ ๋™์•ˆ ๋งคํ•‘ ์œ ์ง€
UnmapViewOfFile(pView);
CloseHandle(hMap);
1
2
3
4
5
6
7
8
9
10
11
12
13
// ํ”„๋กœ์„ธ์Šค P2 (์†Œ๋น„์ž)
HANDLE hMap = OpenFileMapping(
    FILE_MAP_ALL_ACCESS,
    FALSE,
    L"Global\\MySharedMem"
);

void* pView = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 4096);

printf("%s\n", (char*)pView);  // "Hello from P1"

UnmapViewOfFile(pView);
CloseHandle(hMap);

Global\\ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ๋ชจ๋“  ์„ธ์…˜์—์„œ ๋ณด์ด๊ณ , Local\\์€ ๊ฐ™์€ ์„ธ์…˜ ์•ˆ์—์„œ๋งŒ ๋ณด์ž…๋‹ˆ๋‹ค. ์„œ๋น„์Šค โ†” ๋ฐ์Šคํฌํ†ฑ ์•ฑ ํ†ต์‹ ์€ Global\\์ด ํ•„์š”.

6.3 POSIX โ€” shm_open + mmap

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <sys/mman.h>
#include <fcntl.h>

// ํ”„๋กœ์„ธ์Šค P1
int fd = shm_open("/myshm", O_CREAT | O_RDWR, 0666);
ftruncate(fd, 4096);
void* pView = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

strcpy((char*)pView, "Hello from P1");

munmap(pView, 4096);
close(fd);
// shm_unlink("/myshm")๋กœ ๊ฐ์ฒด ์ œ๊ฑฐ

// ํ”„๋กœ์„ธ์Šค P2
int fd = shm_open("/myshm", O_RDWR, 0);
void* pView = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
printf("%s\n", (char*)pView);
munmap(pView, 4096);
close(fd);

POSIX ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๊ฐ์ฒด๋Š” /dev/shm/myshm ๊ฐ™์€ ํŒŒ์ผ๋กœ ๋…ธ์ถœ๋˜์–ด ๋””๋ฒ„๊น… ์‹œ ls /dev/shm์œผ๋กœ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

6.4 ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์˜ ํ•จ์ • โ€” ๋™๊ธฐํ™”๋Š” ์ง์ ‘

๋น ๋ฅด์ง€๋งŒ OS๋Š” ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‘ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ๊ฐ™์€ ์˜์—ญ์„ ์“ฐ๋ฉด ๊ทธ๋ƒฅ race condition.

1
2
3
4
5
6
7
// ์ž˜๋ชป๋œ ์˜ˆ โ€” race condition
*((int*)pView) += 1;   // P1ยทP2๊ฐ€ ๋™์‹œ์— ํ•˜๋ฉด ๊ฒฐ๊ณผ ๋ถˆํ™•์ •

// ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ โ€” ์„ธ๋งˆํฌ์–ด/๋ฎคํ…์Šค๋กœ ๋™๊ธฐํ™”
WaitForSingleObject(hMutex, INFINITE);
*((int*)pView) += 1;
ReleaseMutex(hMutex);

๊ทธ๋ž˜์„œ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋Š” ๊ฑฐ์˜ ํ•ญ์ƒ ์ด๋ฆ„ ์žˆ๋Š” MutexยทSemaphoreยทEvent์™€ ์ง์ง€์–ด ์”๋‹ˆ๋‹ค. ๋ณดํ†ต ํŒจํ„ด์ด โ€œ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ, ์„ธ๋งˆํฌ์–ด๋Š” ์Šฌ๋กฏ ์นด์šดํŠธ, Event๋Š” ๋ฐ์ดํ„ฐ ๋„์ฐฉ ์•Œ๋ฆผโ€.

6.5 ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์˜ ๋‹ค๋ฅธ ํ•จ์ • โ€” ํฌ์ธํ„ฐ ์‚ฌ์šฉ ๋ถˆ๊ฐ€

๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์— ํฌ์ธํ„ฐ๋ฅผ ๋„ฃ์œผ๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. P1์˜ ๋งคํ•‘ ์ฃผ์†Œ์™€ P2์˜ ๋งคํ•‘ ์ฃผ์†Œ๊ฐ€ ๋‹ค๋ฅด๋ฏ€๋กœ P1์—์„œ ์ ์€ ํฌ์ธํ„ฐ๊ฐ€ P2์—์„  ์ž˜๋ชป๋œ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

1
2
3
4
5
6
// ์ž˜๋ชป๋œ ์˜ˆ โ€” P1ยทP2์˜ ๋งคํ•‘ ์ฃผ์†Œ๊ฐ€ ๋‹ค๋ฅด๋ฉด ํฌ์ธํ„ฐ ๊นจ์ง
struct Bad { int* p; };
((Bad*)pView)->p = &localVar;  // P1์˜ ์ง€์—ญ ๋ณ€์ˆ˜ ์ฃผ์†Œ โ†’ P2์—์„  ์˜๋ฏธ ์—†์Œ

// ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ โ€” ์˜คํ”„์…‹(offset)์œผ๋กœ ํ‘œํ˜„
struct Good { ptrdiff_t offset_to_data; };

๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์—์„œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ํฌ์ธํ„ฐ ๋Œ€์‹  ์˜คํ”„์…‹, ๋˜๋Š” ๋งคํ•‘์„ ์–‘์ชฝ์ด ๊ฐ™์€ ์ฃผ์†Œ์— ํ•˜๋„๋ก ๊ฐ•์ œ(MapViewOfFileEx)ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์–ด๋ ต๊ณ  ์˜ค๋ฅ˜๊ฐ€ ์žฆ์•„ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

6.6 ์‚ฌ์šฉ ์‚ฌ๋ก€

1
2
3
4
5
- ๊ฒŒ์ž„ ์—”์ง„์˜ ๋ Œ๋” ๋ช…๋ น ๋ฒ„ํผ (Game โ†” Render ํ”„๋กœ์„ธ์Šค ๋ถ„๋ฆฌ ์‹œ)
- Chrome์˜ GPU ํ”„๋กœ์„ธ์Šค์™€ ๋ Œ๋”๋Ÿฌ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ…์Šค์ฒ˜ ๊ณต์œ 
- ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋„๊ตฌ ๊ฐ„ ์ธก์ • ๋ฐ์ดํ„ฐ ๊ณต์œ 
- ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ shared buffer pool (์›Œ์ปค ํ”„๋กœ์„ธ์Šค ํ’€)
- ์œˆ๋„์šฐ ๋ฉ”์‹œ์ง€ ๋ณด๋“œ(๊ณต์œ  ๋น„๋””์˜ค ๋ฉ”๋ชจ๋ฆฌ)

7. ๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ โ€” CreateFileMapping๊ณผ ํŽ˜์ด์ง€ ์บ์‹œ

๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ(memory-mapped file)์€ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์˜ ์ผ๋ฐ˜ํ™”์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋งคํ•‘ํ•ด์„œ read/write ์‹œ์Šคํ…œ ์ฝœ ์—†์ด ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์œผ๋กœ ํŒŒ์ผ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

7.1 Windows โ€” ๊ฐ™์€ API, ๋‹ค๋ฅธ ์ธ์ž

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
HANDLE hFile = CreateFile(
    L"data.bin",
    GENERIC_READ | GENERIC_WRITE,
    0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
);

HANDLE hMap = CreateFileMapping(
    hFile,                       // ์‹ค์ œ ํŒŒ์ผ ํ•ธ๋“ค (vs INVALID_HANDLE_VALUE)
    NULL,
    PAGE_READWRITE,
    0, 0,                         // 0,0 = ํŒŒ์ผ ์ „์ฒด
    NULL                          // ์ด๋ฆ„ ์—†์–ด๋„ ๋จ
);

void* pView = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);

// ํŒŒ์ผ์ด ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋ณด์ž„ โ€” ์ผ๋ฐ˜ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ
((char*)pView)[0] = 'A';  // ํŒŒ์ผ ์ฒซ ๋ฐ”์ดํŠธ๊ฐ€ 'A'๋กœ

hFile์„ INVALID_HANDLE_VALUE๋กœ ์ฃผ๋ฉด ํŽ˜์ด์ง• ํŒŒ์ผ ๊ธฐ๋ฐ˜ ์ต๋ช… ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ(6์žฅ), ์‹ค์ œ ํŒŒ์ผ์„ ์ฃผ๋ฉด ๊ทธ ํŒŒ์ผ๊ณผ ๋™๊ธฐํ™”๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ์ด ๋ฉ๋‹ˆ๋‹ค โ€” API๊ฐ€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

7.2 POSIX โ€” mmap

1
2
3
4
5
int fd = open("data.bin", O_RDWR);
void* pView = mmap(NULL, file_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
// pView๋กœ ํŒŒ์ผ ์ ‘๊ทผ
munmap(pView, file_size);
close(fd);

7.3 IPC ์ธก๋ฉด์—์„œ์˜ ๊ฐ€์น˜

์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ™์€ ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ ๋งตํ•˜๋ฉด ์ž๋™์œผ๋กœ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. OS์˜ ํŽ˜์ด์ง€ ์บ์‹œ(page cache)๊ฐ€ ๊ฐ™์€ ํŒŒ์ผ์˜ ๊ฐ™์€ ํŽ˜์ด์ง€๋ฅผ ํ•œ ๋ฒˆ๋งŒ RAM์— ์˜ฌ๋ฆฌ๊ณ  ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์— ๋งคํ•‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

1
2
3
4
5
ํ”„๋กœ์„ธ์Šค P1 โ”€โ”€mmap("data.bin")โ”€โ”€โ†’  โ”
                                   โ”‚
ํ”„๋กœ์„ธ์Šค P2 โ”€โ”€mmap("data.bin")โ”€โ”€โ†’  โ”œโ”€ ํŽ˜์ด์ง€ ์บ์‹œ (RAM)  โ†โ”€ data.bin (๋””์Šคํฌ)
                                   โ”‚
ํ”„๋กœ์„ธ์Šค P3 โ”€โ”€mmap("data.bin")โ”€โ”€โ†’  โ”˜

์ฝ๊ธฐยท์“ฐ๊ธฐ๊ฐ€ ์ž๋™์œผ๋กœ ๋””์Šคํฌ์™€ ๋™๊ธฐํ™”๋˜์–ด ์˜์†์„ฑ๋„ ์–ป์Šต๋‹ˆ๋‹ค.

7.4 ํŽ˜์ด์ง€ ํดํŠธ ๊ธฐ๋ฐ˜ lazy ๋กœ๋”ฉ

๋งคํ•‘ํ•  ๋•Œ ๋ฐ์ดํ„ฐ๊ฐ€ ์‹ค์ œ๋กœ RAM์— ์˜ฌ๋ผ์˜ค๋Š” ๊ฒŒ ์•„๋‹™๋‹ˆ๋‹ค. ์ฒ˜์Œ ๊ทธ ๋ฉ”๋ชจ๋ฆฌ ํŽ˜์ด์ง€๋ฅผ ๋งŒ์งˆ ๋•Œ page fault๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ , ๊ทธ๋•Œ OS๊ฐ€ ๋””์Šคํฌ์—์„œ ํŽ˜์ด์ง€๋ฅผ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค โ€” ์ผ์ข…์˜ lazy loading. ๊ทธ๋ž˜์„œ 100GB ํŒŒ์ผ๋„ ๋ฉ”๋ชจ๋ฆฌ ๋งต์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ฃผ์†Œ ๊ณต๊ฐ„๋งŒ ์žก๊ณ  ์‹ค์ œ ๋ฐ์ดํ„ฐ๋Š” ์ ‘๊ทผํ•˜๋Š” ํŽ˜์ด์ง€๋งŒ).

7.5 ์‚ฌ์šฉ ์‚ฌ๋ก€

1
2
3
4
- DBMS์˜ ๋ฐ์ดํ„ฐ ํŒŒ์ผ (SQLite mmap mode, MongoDB์˜ ์ผ๋ถ€ ์—”์ง„)
- ๋Œ€์šฉ๋Ÿ‰ ๋กœ๊ทธ ํŒŒ์ผ ๋ถ„์„ (์ˆ˜์‹ญ GB)
- ๊ฒŒ์ž„์˜ ์• ์…‹ ํŒจํ‚ค์ง€ โ€” ํ”„๋กœ์„ธ์Šค๋ผ๋ฆฌ ๊ณต์œ ํ•˜๋ฉด์„œ page cache ํ™œ์šฉ
- ์™ธ๋ถ€ ๋„๊ตฌ๊ฐ€ ๋งŒ๋“  ๊ฒฐ๊ณผ ํŒŒ์ผ์„ ๋ฉ”์ธ ์•ฑ์ด ์ฆ‰์‹œ ๋ฉ”๋ชจ๋ฆฌ๋กœ ์‚ฌ์šฉ

8. ์„ธ๋งˆํฌ์–ดยท๋ฎคํ…์ŠคยทEvent โ€” ๋™๊ธฐํ™” ๊ฐ์ฒด๋กœ์„œ์˜ IPC

์ด ์…‹์€ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ธฐ๋Š” ์ฑ„๋„์ด ์•„๋‹ˆ๋ผ ๋™๊ธฐํ™” ์‹ ํ˜ธ์ž…๋‹ˆ๋‹ค. ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ(21)์—์„œ ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค ์•ˆ์˜ ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”๋กœ ๋‹ค๋ค˜๋Š”๋ฐ, IPC ๊ด€์ ์—์„œ๋Š” ์ด๋ฆ„์„ ๋ถ€์—ฌํ•ด ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

8.1 Named Mutex (Windows)

1
2
3
4
5
6
7
8
9
10
11
12
13
// P1 (๋จผ์ € ์‹คํ–‰)
HANDLE hMutex = CreateMutex(NULL, FALSE, L"Global\\MyMutex");
WaitForSingleObject(hMutex, INFINITE);
// ์ž„๊ณ„ ๊ตฌ์—ญ
ReleaseMutex(hMutex);
CloseHandle(hMutex);

// P2 (๋‚˜์ค‘์— ์‹คํ–‰)
HANDLE hMutex = OpenMutex(SYNCHRONIZE, FALSE, L"Global\\MyMutex");
WaitForSingleObject(hMutex, INFINITE);
// ๊ฐ™์€ ์ž„๊ณ„ ๊ตฌ์—ญ (P1๊ณผ ์ง๋ ฌํ™”)
ReleaseMutex(hMutex);
CloseHandle(hMutex);

CreateMutex๊ฐ€ ๊ธฐ์กด์— ๊ฐ™์€ ์ด๋ฆ„์ด ์žˆ์œผ๋ฉด ๊ทธ ํ•ธ๋“ค์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค(GetLastError() == ERROR_ALREADY_EXISTS๋กœ ๊ตฌ๋ถ„ ๊ฐ€๋Šฅ). ๊ทธ๋ž˜์„œ โ€œ๋จผ์ € ๋งŒ๋“ค๊ธฐโ€ ํŒจํ„ด์ด ๊ฐ€๋Šฅ โ€” ํ•œ ์ธ์Šคํ„ด์Šค๋งŒ ๋„์šฐ๋Š” single-instance ์•ฑ์ด ํ”ํžˆ ์”๋‹ˆ๋‹ค.

8.2 Named Semaphore (Windows)

1
2
3
4
5
6
7
HANDLE hSem = CreateSemaphore(NULL, 0, 10, L"Global\\MySem");  // ์ดˆ๊ธฐ 0, ์ตœ๋Œ€ 10

// ์ƒ์‚ฐ์ž
ReleaseSemaphore(hSem, 1, NULL);  // ์นด์šดํ„ฐ +1 โ†’ ๋Œ€๊ธฐ ์ค‘์ธ ์†Œ๋น„์ž 1๋ช… ๊นจ์›€

// ์†Œ๋น„์ž
WaitForSingleObject(hSem, INFINITE);  // ์นด์šดํ„ฐ -1, 0์ด๋ฉด ๋Œ€๊ธฐ

์ „ํ˜•์ ์ธ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ + ์„ธ๋งˆํฌ์–ด ํŒจํ„ด:

1
2
3
4
5
6
7
๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ: ๋ฐ์ดํ„ฐ ์Šฌ๋กฏ N๊ฐœ
์„ธ๋งˆํฌ์–ด 'empty' (์ดˆ๊ธฐ N): ๋นˆ ์Šฌ๋กฏ ์ˆ˜
์„ธ๋งˆํฌ์–ด 'full'  (์ดˆ๊ธฐ 0): ์ฑ„์›Œ์ง„ ์Šฌ๋กฏ ์ˆ˜
Mutex 'lock':                 ์Šฌ๋กฏ ์ธ๋ฑ์Šค ๋ณดํ˜ธ

์ƒ์‚ฐ์ž: Wait(empty) โ†’ Wait(lock) โ†’ ์Šฌ๋กฏ ์ฑ„์›€ โ†’ Release(lock) โ†’ Release(full)
์†Œ๋น„์ž: Wait(full)  โ†’ Wait(lock) โ†’ ์Šฌ๋กฏ ๋น„์›€ โ†’ Release(lock) โ†’ Release(empty)

8.3 Named Event (Windows)

Event๋Š” ์‹œ๊ทธ๋„ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์‹œ๊ทธ๋„ ์ƒํƒœ์—์„œ WaitForSingleObject ํ˜ธ์ถœ์€ ์ฆ‰์‹œ ํ†ต๊ณผ, ๋น„์‹œ๊ทธ๋„ ์ƒํƒœ์—์„  ๋Œ€๊ธฐ.

1
2
3
4
5
6
// ์ข…๋ฅ˜ ๋‘ ๊ฐ€์ง€
HANDLE hAuto = CreateEvent(NULL, FALSE, FALSE, L"Global\\AutoEvt");  // auto-reset
HANDLE hManual = CreateEvent(NULL, TRUE, FALSE, L"Global\\ManualEvt"); // manual-reset

// auto-reset: SetEvent๋กœ ์‹œ๊ทธ๋„ โ†’ ํ•œ ์Šค๋ ˆ๋“œ ๊นจ์šฐ๋ฉด ์ž๋™์œผ๋กœ reset
// manual-reset: SetEvent๋กœ ์‹œ๊ทธ๋„ โ†’ ๋ชจ๋“  ๋Œ€๊ธฐ ์Šค๋ ˆ๋“œ ๊นจ์›€, ResetEvent๋กœ ์ง์ ‘ reset
ํ•จ์ˆ˜ํšจ๊ณผ
SetEvent์‹œ๊ทธ๋„ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ โ†’ ๋Œ€๊ธฐ ์Šค๋ ˆ๋“œ ๊นจ์›€
ResetEvent๋น„์‹œ๊ทธ๋„ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ (manual-reset๋งŒ ์˜๋ฏธ)
PulseEventSet ํ›„ ์ฆ‰์‹œ Reset (๋‹จ๋ฐœ ์‹ ํ˜ธ, ์ž˜ ์•ˆ ์”€ โ€” ๊ฒฝํ•ฉ ์‹œ ๋ˆ„๋ฝ ๊ฐ€๋Šฅ)

8.4 ๋™๊ธฐํ™” ๊ฐ์ฒด์˜ IPC ๋ถ„๋ฅ˜

๊ฐ์ฒด๋ฐ์ดํ„ฐ์‹ ํ˜ธํ”„๋กœ์„ธ์Šค ๊ฐ„ ๊ณต์œ ์‚ฌ์šฉ ํŒจํ„ด
Named MutexX๋ฐฐํƒ€ ๋ฝO (์ด๋ฆ„)์ž์› ๋ณดํ˜ธ, single-instance
Named SemaphoreX์นด์šดํ„ฐO (์ด๋ฆ„)์ƒ์‚ฐ์ž-์†Œ๋น„์ž ์Šฌ๋กฏ ์นด์šดํŒ…
Named EventX์ƒํƒœ ์‹œ๊ทธ๋„O (์ด๋ฆ„)โ€œ๋ฐ์ดํ„ฐ ๋„์ฐฉโ€, โ€œ์ค€๋น„ ์™„๋ฃŒโ€ ์•Œ๋ฆผ
WaitForMultipleObjects-๋‹ค์ค‘ ๋Œ€๊ธฐO์—ฌ๋Ÿฌ ์ด๋ฒคํŠธ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์‹œ๊ทธ๋„์ด๋ฉด ๊นจ์–ด๋‚จ

8.5 WaitForMultipleObjects โ€” ๋‹ค์ค‘ ๋Œ€๊ธฐ

1
2
3
4
5
6
7
8
9
10
HANDLE handles[] = { hEvent1, hMutex, hSem };
DWORD ret = WaitForMultipleObjects(3, handles, FALSE, INFINITE);
// FALSE: ํ•˜๋‚˜๋ผ๋„ ์‹œ๊ทธ๋„์ด๋ฉด ๋ฆฌํ„ด
// TRUE: ๋ชจ๋‘ ์‹œ๊ทธ๋„์ด๋ฉด ๋ฆฌํ„ด

switch (ret) {
case WAIT_OBJECT_0 + 0: /* hEvent1 ์‹œ๊ทธ๋„ */ break;
case WAIT_OBJECT_0 + 1: /* hMutex ํš๋“ */ break;
case WAIT_OBJECT_0 + 2: /* hSem ์นด์šดํŠธ ๊ฐ์†Œ */ break;
}

์—ฌ๋Ÿฌ IPC ๊ฐ์ฒด๋ฅผ ํ•œ ์Šค๋ ˆ๋“œ์—์„œ ํ†ตํ•ฉ ๋Œ€๊ธฐ. ๊ฒŒ์ž„ ์„œ๋ฒ„๋‚˜ UI ๋””์ŠคํŒจ์ฒ˜๊ฐ€ โ€œ๋ฉ”์‹œ์ง€ ํ + ์ข…๋ฃŒ ์‹ ํ˜ธ + ํƒ€์ด๋จธโ€๋ฅผ ๋™์‹œ์— ๊ธฐ๋‹ค๋ฆด ๋•Œ ํ”ํžˆ ์”๋‹ˆ๋‹ค.

8.6 POSIX ๋™๋“ฑ๋ฌผ

1
2
3
4
5
6
7
8
9
10
11
12
// Named Semaphore โ€” POSIX
sem_t* sem = sem_open("/mysem", O_CREAT, 0666, 0);
sem_post(sem);  // +1
sem_wait(sem);  // -1
sem_close(sem);
sem_unlink("/mysem");

// Mutex/Condition Variable in shared memory โ€” POSIX
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
pthread_mutex_init(mutex_in_shm, &attr);

POSIX๋Š” Mutex/Condition Variable๋ฅผ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์— ๋†“๊ณ  PTHREAD_PROCESS_SHARED ์†์„ฑ์„ ์ค˜์„œ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค โ€” Windows์˜ Named Mutex์™€ ๊ฐ™์€ ํšจ๊ณผ์ง€๋งŒ ๋” ๋ฒˆ๊ฑฐ๋กญ์Šต๋‹ˆ๋‹ค.


9. ์‹œ๊ทธ๋„ โ€” POSIX์™€ Windows Event ๋Œ€์‘

9.1 POSIX ์‹œ๊ทธ๋„ โ€” ๊ฐ€์žฅ ์˜ค๋ž˜๋œ IPC

์‹œ๊ทธ๋„์€ ๋น„๋™๊ธฐ ์•Œ๋ฆผ์ž…๋‹ˆ๋‹ค. ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— โ€œ์ด๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚ฌ๋‹คโ€๋Š” ๋ฒˆํ˜ธ ํ•˜๋‚˜๋งŒ ๋ณด๋‚ด๊ณ , ๋ฐ›๋Š” ์ชฝ์€ ๊ทธ ๋ฒˆํ˜ธ์— ๋“ฑ๋กํ•ด๋‘” ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <signal.h>

void handler(int signo) {
    write(1, "received\n", 9);  // async-signal-safe ํ•จ์ˆ˜๋งŒ
}

int main() {
    signal(SIGUSR1, handler);    // ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ ๋“ฑ๋ก
    // ๋˜๋Š” ๋” ์•ˆ์ „ํ•œ sigaction()
    struct sigaction sa = { .sa_handler = handler };
    sigaction(SIGUSR1, &sa, NULL);

    while (1) pause();           // ์‹œ๊ทธ๋„ ๋Œ€๊ธฐ
}

// ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—์„œ
kill(target_pid, SIGUSR1);

9.2 ํ‘œ์ค€ ์‹œ๊ทธ๋„

์‹œ๊ทธ๋„๊ธฐ๋ณธ ๋™์ž‘์˜๋ฏธ
SIGINT (2)์ข…๋ฃŒCtrl+C
SIGTERM (15)์ข…๋ฃŒ์ •์ƒ ์ข…๋ฃŒ ์š”์ฒญ (catch ๊ฐ€๋Šฅ)
SIGKILL (9)๊ฐ•์ œ ์ข…๋ฃŒcatch ๋ถˆ๊ฐ€, ๋ฌด์กฐ๊ฑด ์ฃฝ์Œ
SIGSTOP (19)์ •์ง€catch ๋ถˆ๊ฐ€
SIGSEGV (11)core dumpSegmentation Fault
SIGCHLD (17)๋ฌด์‹œ์ž์‹ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ
SIGPIPE (13)์ข…๋ฃŒ๋Š์–ด์ง„ ํŒŒ์ดํ”„์— ์“ฐ๊ธฐ ์‹œ๋„
SIGUSR1 / SIGUSR2์ข…๋ฃŒ์‚ฌ์šฉ์ž ์ •์˜
SIGHUP (1)์ข…๋ฃŒํ„ฐ๋ฏธ๋„ ๋‹ซํž˜ (์„œ๋น„์Šค ์žฌ์„ค์ • ์‹ ํ˜ธ๋กœ ์ž์ฃผ ์žฌ์ •์˜)

9.3 ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ์˜ ์ œ์•ฝ โ€” async-signal-safe

์‹œ๊ทธ๋„์€ ์–ธ์ œ๋“  ์ธํ„ฐ๋ŸฝํŠธ๋กœ ๋ผ์–ด๋“ค์–ด ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค โ€” ์ผ๋ฐ˜ ํ•จ์ˆ˜๊ฐ€ ๋ฝ์„ ์žก๊ณ  ์žˆ๋Š” ์ƒํƒœ์—์„œ๋„. ๊ทธ๋ž˜์„œ ํ•ธ๋“ค๋Ÿฌ ์•ˆ์—์„œ๋Š” ๋งค์šฐ ์ ์€ ํ•จ์ˆ˜๋งŒ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค(POSIX async-signal-safe ํ•จ์ˆ˜ ๋ชฉ๋ก).

1
2
3
4
5
6
7
8
9
10
// ์•ˆ์ „
write(1, "msg\n", 4);
_exit(1);
signal(SIGINT, handler);
sigaction(...);

// ์œ„ํ—˜ (๋‹ค๋ฅธ ์ฝ”๋“œ๊ฐ€ ๊ฐ™์€ ์ž์›์—์„œ ๋ฝ์„ ์žก๊ณ  ์žˆ์œผ๋ฉด ๋ฐ๋“œ๋ฝ)
printf("msg\n");           // stdio ๋ฝ
malloc(100);               // ํž™ ๋ฝ
pthread_mutex_lock(&mtx);  // ์ผ๋ฐ˜ mutex

์‹ค๋ฌด ํŒจํ„ด์€ ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ์—์„œ ํ”Œ๋ž˜๊ทธ๋งŒ ์„ธํŒ…ํ•˜๊ณ , ๋ฉ”์ธ ๋ฃจํ”„์—์„œ ๊ทธ ํ”Œ๋ž˜๊ทธ๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค:

1
2
3
4
5
6
7
volatile sig_atomic_t g_should_quit = 0;
void handler(int) { g_should_quit = 1; }

while (!g_should_quit) {
    // ๋ฉ”์ธ ์ž‘์—…
}
cleanup();

sig_atomic_t๋Š” ์‹œ๊ทธ๋„ ์•ˆ์ „ํ•œ ์ •์ˆ˜ ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

9.4 ์‹œ๊ทธ๋„์˜ ํ•œ๊ณ„

  • ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ถˆ๊ฐ€ โ€” ์‹œ๊ทธ๋„ ๋ฒˆํ˜ธ ํ•˜๋‚˜๋ฟ (๋‹ค๋งŒ POSIX real-time signals โ€” SIGRTMIN~SIGRTMAX๋Š” ์ž‘์€ ์ •์ˆ˜ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๊ฐ€๋Šฅ, sigqueue/siginfo_t)
  • ๋น„๋™๊ธฐ โ€” ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์–ธ์ œ ์‹คํ–‰๋ ์ง€ ๋ชจ๋ฆ„
  • ๋ˆ„๋ฝ ๊ฐ€๋Šฅ โ€” ๊ฐ™์€ ์‹œ๊ทธ๋„์ด ํ•ธ๋“ค๋Ÿฌ ์‹คํ–‰ ์ „์— ๋˜ ์˜ค๋ฉด ํ•ฉ์ณ์ง(๊ธฐ๋ณธ ์‹œ๊ทธ๋„). real-time signals๋Š” ํ์ž‰๋จ
  • async-signal-safe ํ•จ์ˆ˜๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ๋กœ์ปฌ ํ•œ์ • โ€” ๋„คํŠธ์›Œํฌ ๋ถˆ๊ฐ€

๊ทธ๋ž˜์„œ ์‹œ๊ทธ๋„์€ ๋ณดํ†ต ๊ฐ„๋‹จํ•œ ๋ช…๋ น (โ€œ์ข…๋ฃŒํ•ด๋ผโ€, โ€œ์„ค์ • ๋‹ค์‹œ ์ฝ์–ด๋ผโ€, โ€œํ†ต๊ณ„ ์ถœ๋ ฅํ•ด๋ผโ€) ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ธฐ๋ ค๋ฉด ๋‹ค๋ฅธ IPC๋ฅผ ์จ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

9.5 Windows์—๋Š” ์‹œ๊ทธ๋„์ด ์—†๋‹ค โ€” Event๋กœ ๋Œ€์‘

Windows๋Š” POSIX ์‹œ๊ทธ๋„์„ ์ง์ ‘ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ํ‘œ์ค€ C ์‹œ๊ทธ๋„(SIGINT, SIGTERM)์€ ํ‰๋‚ด๋‚ด์ง€๋งŒ ๋™์ž‘์ด ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค.

Windows์—์„œ ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ๋‚ด๋Š” ๋ฐฉ๋ฒ•:

POSIX ํŒจํ„ดWindows ๋Œ€์‘
kill(pid, SIGUSR1) โ†’ ํ•ธ๋“ค๋Ÿฌ ์‹คํ–‰Named Event + WaitForSingleObject (๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋Œ€๊ธฐ, ์‹œ๊ทธ๋„๋Ÿฌ๊ฐ€ SetEvent)
kill(pid, SIGTERM) โ†’ ์ •์ƒ ์ข…๋ฃŒSetConsoleCtrlHandler (์ฝ˜์†” ์•ฑ), ๋˜๋Š” IPC ์ฑ„๋„๋กœ ์ข…๋ฃŒ ๋ฉ”์‹œ์ง€
Ctrl+CSetConsoleCtrlHandler(CTRL_C_EVENT)
SIGSEGV (access violation)SEH (__try/__except) ๋˜๋Š” Vectored Exception Handler
SIGCHLD (์ž์‹ ์ข…๋ฃŒ)WaitForSingleObject(hProcess)
1
2
3
4
5
6
7
8
9
// Windows์˜ Ctrl+C ์ฒ˜๋ฆฌ
BOOL WINAPI CtrlHandler(DWORD ctrlType) {
    if (ctrlType == CTRL_C_EVENT) {
        // ์ •๋ฆฌ
        return TRUE;
    }
    return FALSE;
}
SetConsoleCtrlHandler(CtrlHandler, TRUE);
1
2
3
4
5
6
7
8
9
10
// "๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ์•Œ๋ฆผ" ํŒจํ„ด โ€” Named Event
// ์‹œ๊ทธ๋„๋Ÿฌ ์ธก
HANDLE h = OpenEvent(EVENT_MODIFY_STATE, FALSE, L"Global\\QuitEvent");
SetEvent(h);
CloseHandle(h);

// ๋Œ€์ƒ ์ธก (๋ฉ”์ธ ์Šค๋ ˆ๋“œ ๋˜๋Š” ์›Œ์ปค)
HANDLE h = CreateEvent(NULL, TRUE, FALSE, L"Global\\QuitEvent");
WaitForSingleObject(h, INFINITE);
// ๊นจ์–ด๋‚˜๋ฉด ์ •๋ฆฌ

์ด๊ฒŒ Windows์—์„  ์‚ฌ์‹ค์ƒ IPC + ๋น„๋™๊ธฐ ์•Œ๋ฆผ์˜ ํ‘œ์ค€ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.


10. ์†Œ์ผ“ โ€” UNIX domainยทTCPยทUDPยทWinsock

์†Œ์ผ“์€ ๊ฐ€์žฅ ๋ฒ”์šฉ์ ์ธ IPC์ž…๋‹ˆ๋‹ค. ๊ฐ™์€ BSD socket API๋กœ ๊ฐ™์€ ๋จธ์‹ ๊ณผ ๋„คํŠธ์›Œํฌ๋ฅผ ๋ชจ๋‘ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

10.1 ์ฃผ์š” ๋„๋ฉ”์ธ

๋„๋ฉ”์ธ์ฃผ์†Œ ํŒจ๋ฐ€๋ฆฌ๋ฒ”์œ„ํŠน์„ฑ
UNIX domainAF_UNIX (POSIX)๊ฐ™์€ ๋จธ์‹ ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ฒฝ๋กœ๋กœ ์‹๋ณ„, TCP๋ณด๋‹ค ๋น ๋ฆ„
TCPAF_INET + SOCK_STREAM๋„คํŠธ์›Œํฌ์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ
UDPAF_INET + SOCK_DGRAM๋„คํŠธ์›Œํฌ๋น„์‹ ๋ขฐ ๋ฐ์ดํ„ฐ๊ทธ๋žจ, ๋ฉ”์‹œ์ง€ ๊ฒฝ๊ณ„ ๋ณด์กด
IPv6 TCP/UDPAF_INET6๋„คํŠธ์›ŒํฌIPv6

Windows์—๋Š” ์ง์ ‘์ ์ธ AF_UNIX ๋Œ€์‘์ด ๋ช…๋ช… ํŒŒ์ดํ”„์ง€๋งŒ, Windows 10 1803+๋ถ€ํ„ฐ AF_UNIX ์ž์ฒด๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

10.2 UNIX domain socket โ€” AF_UNIX

๊ฐ™์€ ๋จธ์‹  ์•ˆ์—์„œ๋งŒ ๋™์ž‘ํ•˜๋Š” ์†Œ์ผ“์œผ๋กœ, TCP loopback๋ณด๋‹ค ๋น ๋ฆ…๋‹ˆ๋‹ค(ํ”„๋กœํ† ์ฝœ ์Šคํƒ ์šฐํšŒ).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <sys/socket.h>
#include <sys/un.h>

// ์„œ๋ฒ„
int sfd = socket(AF_UNIX, SOCK_STREAM, 0);
struct sockaddr_un addr = { .sun_family = AF_UNIX };
strcpy(addr.sun_path, "/tmp/mysock");
bind(sfd, (struct sockaddr*)&addr, sizeof(addr));
listen(sfd, 5);

int cfd = accept(sfd, NULL, NULL);
char buf[1024];
read(cfd, buf, sizeof(buf));
close(cfd);

// ํด๋ผ์ด์–ธํŠธ
int sfd = socket(AF_UNIX, SOCK_STREAM, 0);
struct sockaddr_un addr = { .sun_family = AF_UNIX };
strcpy(addr.sun_path, "/tmp/mysock");
connect(sfd, (struct sockaddr*)&addr, sizeof(addr));
write(sfd, "hello", 5);
close(sfd);

ํŠน์ง•:

  • ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ฒฝ๋กœ๋กœ ์‹๋ณ„ โ€” /tmp/mysock
  • ๊ถŒํ•œ ๊ด€๋ฆฌ โ€” ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ถŒํ•œ ๊ทธ๋Œ€๋กœ (chmod)
  • stream(SOCK_STREAM)ยทdatagram(SOCK_DGRAM)ยทseqpacket(SOCK_SEQPACKET)
  • fd ์ „์†ก ๊ฐ€๋Šฅ โ€” SCM_RIGHTS๋กœ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ์ž์ฒด๋ฅผ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋กœ ๋„˜๊น€ (๊ณ ๊ธ‰)
  • TCP loopback๋ณด๋‹ค 30~50% ๋น ๋ฆ„

Docker socket(/var/run/docker.sock), X11 ๋””์Šคํ”Œ๋ ˆ์ด ์„œ๋ฒ„, systemd activation ๋“ฑ์ด ๋Œ€ํ‘œ ์‚ฌ์šฉ์ฒ˜์ž…๋‹ˆ๋‹ค.

10.3 TCP/UDP โ€” ๋„คํŠธ์›Œํฌ ๊ฐ€๋Šฅ

1
2
3
4
5
6
7
8
9
10
// TCP ์„œ๋ฒ„
int sfd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr = {
    .sin_family = AF_INET,
    .sin_port = htons(8080),
    .sin_addr.s_addr = INADDR_ANY
};
bind(sfd, (struct sockaddr*)&addr, sizeof(addr));
listen(sfd, 5);
int cfd = accept(sfd, NULL, NULL);

๊ฐ™์€ ๋จธ์‹  ์•ˆ์—์„œ ์“ธ ๋•Œ๋Š” 127.0.0.1 (loopback)์„ ์”๋‹ˆ๋‹ค. loopback์€ NIC๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ์ปค๋„์ด ์ง์ ‘ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ๋„คํŠธ์›Œํฌ ๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ํ”„๋กœํ† ์ฝœ ์Šคํƒ(TCP ํ—ค๋”ยท์‹œํ€€์Šค ๋ฒˆํ˜ธยท์ฒดํฌ์„ฌ)์€ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค.

์˜ต์…˜TCPUDP
์‹ ๋ขฐ์„ฑO (์žฌ์ „์†ก)X
์ˆœ์„œ ๋ณด์žฅOX
๋ฉ”์‹œ์ง€ ๊ฒฝ๊ณ„X (๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ)O (๋ฐ์ดํ„ฐ๊ทธ๋žจ)
์—ฐ๊ฒฐ ์ง€ํ–ฅOX
๋น„์šฉํ•ธ๋“œ์…ฐ์ดํฌ + ACK๋‹จ์ˆœ ์†ก์ˆ˜์‹ 

10.4 Windows Winsock

Windows๋Š” BSD socket API์˜ ๋ณ€ํ˜•์ธ Winsock์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ์˜ ๊ฐ™์ง€๋งŒ WSAStartup/WSACleanup์ด ํ•„์š”ํ•˜๊ณ  closesocket์„ ์”๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")

WSADATA wsa;
WSAStartup(MAKEWORD(2, 2), &wsa);

SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
// ... bind/connect/send/recv
closesocket(s);

WSACleanup();

Winsock์€ ๋˜ ํ™•์žฅ ํ•จ์ˆ˜(WSAAccept, WSAConnect, WSARecv ๋“ฑ)์™€ IOCP(I/O Completion Port) ๊ฐ™์€ ๋น„๋™๊ธฐ ๋ชจ๋ธ์„ ์ œ๊ณตํ•ด ๊ณ ์„ฑ๋Šฅ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

10.5 ์†Œ์ผ“์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€ (IPC ๊ด€์ )

1
2
3
4
5
6
- ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค: TCP/UDP๋กœ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹  (HTTPยทgRPC)
- Docker daemon: UNIX domain socket
- X11/Wayland: UNIX domain socket
- ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ (Postgres, MySQL โ€” TCP ๋˜๋Š” UNIX socket)
- ๊ฒŒ์ž„ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ (UDP ์œ„์ฃผ, TCP๋Š” ์ฑ„ํŒ…ยท๋กœ๋น„)
- ์–ธ๋ฆฌ์–ผ์˜ NetDriver๋Š” UDP socket ๊ธฐ๋ฐ˜

11. RPC์™€ COM โ€” ํ•จ์ˆ˜ ํ˜ธ์ถœ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” IPC

11.1 RPC โ€” Remote Procedure Call

RPC๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค(๋˜๋Š” ๋จธ์‹ )์˜ ํ•จ์ˆ˜๋ฅผ ์ž๊ธฐ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ํ˜ธ์ถœํ•˜๋Š” ์ถ”์ƒํ™”์ž…๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๊ฐ€ Add(2, 3) ํ˜ธ์ถœํ•˜๋ฉด ๊ทธ ํ˜ธ์ถœ์ด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—์„œ ์‹คํ–‰๋˜๊ณ  ๊ฒฐ๊ณผ๊ฐ€ ๋Œ์•„์˜ต๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ํด๋ผ์ด์–ธํŠธ (P1)             RPC ๋Ÿฐํƒ€์ž„                ์„œ๋ฒ„ (P2)
โ”€โ”€โ”€โ”€โ”€                       โ”€โ”€โ”€โ”€โ”€                     โ”€โ”€โ”€โ”€โ”€
int r = Add(2, 3);
  โ†“
  client stub (์ž๋™ ์ƒ์„ฑ)
  โ†“ marshalling
  [๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ]            โ”€โ”€IPC ์ฑ„๋„โ”€โ”€โ†’     [๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ]
                              (pipe/socket)         โ†“
                                                  server stub
                                                    โ†“ unmarshalling
                                                  Add(2, 3)  ์‹ค์ œ ํ•จ์ˆ˜
                                                    โ†“
                                                  return 5
                                                    โ†“ marshalling
                              โ†โ”€โ”€IPC ์ฑ„๋„โ”€โ”€             [๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ]
  โ†“ unmarshalling
  return 5

ํ•ต์‹ฌ ๊ธฐ์ˆ ์ด marshalling(์ธ์ž๋ฅผ ๋ฐ”์ดํŠธ๋กœ ์ง๋ ฌํ™”)๊ณผ stub ์ฝ”๋“œ ์ž๋™ ์ƒ์„ฑ์ž…๋‹ˆ๋‹ค.

11.2 MS-RPC โ€” Windows์˜ RPC

Windows๋Š” OS ์ˆ˜์ค€์—์„œ RPC๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. IDL(Interface Definition Language) ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๊ณ , midl.exe ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ stub ์ฝ”๋“œ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

// math.idl
[uuid(00000000-0000-0000-0000-000000000001), version(1.0)]
interface MathInterface {
    int Add([in] int a, [in] int b);
    int Subtract([in] int a, [in] int b);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
// ์„œ๋ฒ„ ์ธก (์ž๋™ ์ƒ์„ฑ๋œ ์ฝ”๋“œ + ์‹ค์ œ ๊ตฌํ˜„)
int Add(handle_t h, int a, int b) { return a + b; }

// ๋“ฑ๋ก
RpcServerUseProtseqEp(L"ncalrpc", ...);  // ๋กœ์ปฌ RPC (LPC, fastest)
// ๋˜๋Š” RpcServerUseProtseq(L"ncacn_ip_tcp", ...)  // TCP
RpcServerRegisterIf(MathInterface_v1_0_s_ifspec, NULL, NULL);
RpcServerListen(...);

// ํด๋ผ์ด์–ธํŠธ ์ธก
RpcStringBindingCompose(NULL, L"ncalrpc", NULL, ..., &binding);
RpcBindingFromStringBinding(binding, &g_hBinding);
int result = Add(g_hBinding, 2, 3);  // ๋งˆ์น˜ ๋กœ์ปฌ ํ•จ์ˆ˜์ฒ˜๋Ÿผ

RPC์˜ ์ „์†ก ํ”„๋กœํ† ์ฝœ ์˜ต์…˜:

ํ”„๋กœํ† ์ฝœ์šฉ๋„
ncalrpcLocal RPC (LPC) โ€” ๊ฐ™์€ ๋จธ์‹ , ๊ฐ€์žฅ ๋น ๋ฆ„
ncacn_ip_tcpTCP
ncacn_npNamed Pipe
ncacn_httpHTTP (firewall ํ†ต๊ณผ)

11.3 COM โ€” Component Object Model

COM์€ RPC๋ฅผ ๊ฐ์ฒด ๋‹จ์œ„๋กœ ์ถ”์ƒํ™”ํ•œ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค(IUnknown ๊ธฐ๋ฐ˜)๋ฅผ ํ‘œ์ค€ํ™”ํ•˜๊ณ , ์–ด๋””์„œ๋“  ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
// ํด๋ผ์ด์–ธํŠธ
IShellLink* pSL;
CoInitialize(NULL);
CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
                 IID_IShellLink, (void**)&pSL);
pSL->SetPath(L"C:\\Windows\\notepad.exe");
pSL->Release();
CoUninitialize();

COM ๊ฐ์ฒด๋Š” ์œ„์น˜ ํˆฌ๋ช…์„ฑ(location transparency) ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค:

CLSCTX์˜๋ฏธ
CLSCTX_INPROC_SERVER๊ฐ™์€ ํ”„๋กœ์„ธ์Šค ์•ˆ์˜ DLL โ€” IPC ์—†์Œ, ์ง์ ‘ ํ˜ธ์ถœ
CLSCTX_LOCAL_SERVER๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ EXE โ€” out-of-proc, ๋‚ด๋ถ€์ ์œผ๋กœ LRPC
CLSCTX_REMOTE_SERVER๋‹ค๋ฅธ ๋จธ์‹  โ€” DCOM, ๋‚ด๋ถ€์ ์œผ๋กœ RPC over TCP

ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋Š” ๋˜‘๊ฐ™์Šต๋‹ˆ๋‹ค โ€” ์–ด๋””์„œ ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋Š”์ง€ COM ๋Ÿฐํƒ€์ž„์ด ์•Œ์•„์„œ ๊ฒฐ์ •. out-of-proc COM์ด ์‚ฌ์‹ค์ƒ RPC์ธ ์…ˆ์ž…๋‹ˆ๋‹ค.

11.4 marshalling ๋น„์šฉ

1
2
3
4
5
6
7
8
9
10
11
ํ•จ์ˆ˜ ํ˜ธ์ถœ ํ•œ ๋ฒˆ์—:
  โ‘  ์ธ์ž๋ฅผ ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ง๋ ฌํ™” (๊ตฌ์กฐ์ฒดยทํฌ์ธํ„ฐ ๋”ฐ๋ผ๊ฐ€๊ธฐ)
  โ‘ก IPC ์ฑ„๋„ (LPC pipe/named pipe/TCP)๋กœ ์ „์†ก
  โ‘ข ์„œ๋ฒ„ ํ”„๋กœ์„ธ์Šค ๊นจ์šฐ๊ธฐ (์ปจํ…์ŠคํŠธ ์Šค์œ„์น˜)
  โ‘ฃ ์„œ๋ฒ„์—์„œ ์—ญ์ง๋ ฌํ™”
  โ‘ค ์‹ค์ œ ํ•จ์ˆ˜ ํ˜ธ์ถœ
  โ‘ฅ ๊ฒฐ๊ณผ๋ฅผ ์ง๋ ฌํ™”
  โ‘ฆ IPC ์ฑ„๋„๋กœ ๋ฐ˜ํ™˜
  โ‘ง ํด๋ผ์ด์–ธํŠธ์—์„œ ์—ญ์ง๋ ฌํ™”

์ด ๋น„์šฉ: ์ˆ˜์‹ญ~์ˆ˜๋ฐฑ ฮผs

๊ฐ™์€ ๋จธ์‹ ยท๊ฐ„๋‹จํ•œ ์ธ์ž๋ผ๋„ ์ˆ˜์‹ญ ฮผs๋Š” ๊น๋‹ˆ๋‹ค โ€” ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ(์ˆ˜ ns)์˜ 1000~10000๋ฐฐ. ๊ทธ๋ž˜์„œ RPC/COM์€ ํ˜ธ์ถœ ๋นˆ๋„๊ฐ€ ๋‚ฎ๊ณ  ์ถ”์ƒํ™”๊ฐ€ ์ค‘์š”ํ•œ ๊ณณ์—๋งŒ ์“ฐ๋Š” ๊ฒŒ ์›์น™์ž…๋‹ˆ๋‹ค.

11.5 ์‚ฌ์šฉ ์‚ฌ๋ก€

1
2
3
4
5
6
- Windows Shell ํ™•์žฅ (ํƒ์ƒ‰๊ธฐ ์ปจํ…์ŠคํŠธ ๋ฉ”๋‰ด, ์ธ๋„ค์ผ ํ•ธ๋“ค๋Ÿฌ) โ€” COM in-proc DLL
- Office ์ž๋™ํ™” (WordยทExcel ๋งคํฌ๋กœ API) โ€” COM
- DirectX, Direct2D, DirectWrite โ€” COM ์ธํ„ฐํŽ˜์ด์Šค
- WMI (Windows Management Instrumentation) โ€” DCOM
- gRPC, Thrift, Cap'n Proto โ€” ํฌ๋กœ์Šคํ”Œ๋žซํผ RPC ํ”„๋ ˆ์ž„์›Œํฌ
- ์ผ๋ฐ˜ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ํ†ต์‹ 

12. ๋น„์šฉ ์ŠคํŽ™ํŠธ๋Ÿผ ์ •๋ฆฌ โ€” ์–ด๋А ๋ฐฉ์‹์ด ์–ผ๋งˆ๋‚˜ ๋น ๋ฅธ๊ฐ€

์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ(21)์—์„œ ๋™๊ธฐํ™” ๊ฐ์ฒด ๋น„์šฉ ์ŠคํŽ™ํŠธ๋Ÿผ์„ ์ •๋ฆฌํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

12.1 ๋น„์šฉ ํ‘œ (๋Œ€๋žต์  ์ˆ˜์น˜, ๊ฐ™์€ ๋จธ์‹ ยท์ž‘์€ ๋ฉ”์‹œ์ง€ ๊ธฐ์ค€)

IPC ๋ฉ”์ปค๋‹ˆ์ฆ˜ํ•œ ํšŒ ๋น„์šฉ์ƒ๋Œ€ ๋น„์šฉ๋น„๊ณ 
๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์ˆ˜ ns1ร—์ดˆ๊ธฐ ์„ธํŒ… ํ›„, ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ๊ทธ ์ž์ฒด
std::atomic (๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์—์„œ)์ˆ˜ ns1ร—CPU ๋ช…๋ น
Named Mutex/Event signal+wait1~3 ฮผs~500ร—์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ(21) ๊ทธ๋Œ€๋กœ
Anonymous Pipe send/recv์ˆ˜ ฮผs~1000ร—์‹œ์Šคํ…œ ์ฝœ 2ํšŒ + ๋ณต์‚ฌ 2ํšŒ
Named Pipe send/recv (๋กœ์ปฌ)์ˆ˜ ฮผs~1000ร—๋น„์Šท
UNIX domain socket send/recv์ˆ˜ ฮผs~1000ร—TCP๋ณด๋‹ค ๋น ๋ฆ„
POSIX mq send/receive์ˆ˜ ฮผs~1000ร—๋ฉ”์‹œ์ง€ ๊ฒฝ๊ณ„ ์ฒ˜๋ฆฌ
TCP loopback send/recv5~30 ฮผs~5000ร—ํ”„๋กœํ† ์ฝœ ์Šคํƒ ๋น„์šฉ
PostMessage์ˆ˜ ฮผs~1000ร—GUI ํ dispatch
Mailslot write์ˆ˜์‹ญ ฮผs~5000ร—์‹ ๋ขฐ์„ฑ ์—†์Œ
์‹œ๊ทธ๋„์ˆ˜ ฮผs~1000ร—์ธํ„ฐ๋ŸฝํŠธ ์ฒ˜๋ฆฌ
MS-RPC ํ˜ธ์ถœ (LRPC)์ˆ˜์‹ญ ฮผs~10000ร—marshalling ํฌํ•จ
MS-RPC ํ˜ธ์ถœ (TCP)์ˆ˜์‹ญ~์ˆ˜๋ฐฑ ฮผs~50000ร—+ ํ”„๋กœํ† ์ฝœ ์Šคํƒ
COM out-of-proc์ˆ˜์‹ญ~์ˆ˜๋ฐฑ ฮผs~50000ร—RPC์™€ ๋น„์Šท
DCOM (๋„คํŠธ์›Œํฌ)์ˆ˜๋ฐฑ ฮผs~์ˆ˜ ms~100000ร—+ ๋„คํŠธ์›Œํฌ ์ง€์—ฐ

12.2 ๋น„์šฉ ๊ตฌ์„ฑ ๋ถ„์„

๊ฐ ๋ฐฉ์‹์˜ ํ•œ ํšŒ ๋น„์šฉ์ด ์–ด๋””์„œ ์˜ค๋Š”์ง€ ๋ถ„ํ•ดํ•ด๋ณด๋ฉด:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ (์ˆ˜ ns):
  โ”” CPU ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ๋น„์šฉ ๊ทธ ์ž์ฒด

ํŒŒ์ดํ”„/์†Œ์ผ“ ํ•œ ํšŒ (์ˆ˜ ฮผs):
  โ”œ ์‹œ์Šคํ…œ ์ฝœ ์ง„์ž… (๋ชจ๋“œ ์Šค์œ„์น˜, 100~500 ns)
  โ”œ ์ปค๋„ ์•ˆ ๋ฒ„ํผ ๋ฝ ํš๋“ (์ˆ˜์‹ญ ns)
  โ”œ ์‚ฌ์šฉ์ž โ†’ ์ปค๋„ ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ (memcpy, ๋ฐ์ดํ„ฐ ํฌ๊ธฐ ๋น„๋ก€)
  โ”œ ์ˆ˜์‹ ์ž ๊นจ์šฐ๊ธฐ (์Šค์ผ€์ค„๋Ÿฌ ์‹œ๊ทธ๋„)
  โ”œ (์ˆ˜์‹ ์ž ์ธก) ์ปจํ…์ŠคํŠธ ์Šค์œ„์น˜ (1~5 ฮผs, ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ(21))
  โ”œ ์‹œ์Šคํ…œ ์ฝœ ์ง„์ž… (์ˆ˜์‹ ์ž)
  โ”œ ์ปค๋„ โ†’ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ
  โ”” ์‹œ์Šคํ…œ ์ฝœ ๋ฆฌํ„ด

RPC ํ•œ ํšŒ (์ˆ˜์‹ญ ฮผs):
  โ”œ marshalling (์ธ์ž ์ง๋ ฌํ™”, ๊ตฌ์กฐ์ฒด ๋”ฐ๋ผ๊ฐ€๊ธฐ)
  โ”œ IPC ์ฑ„๋„ ์†ก์‹  (์œ„ ํŒŒ์ดํ”„/์†Œ์ผ“ ๋น„์šฉ)
  โ”œ ์„œ๋ฒ„ ์ปจํ…์ŠคํŠธ ์Šค์œ„์น˜
  โ”œ unmarshalling
  โ”œ ์‹ค์ œ ํ•จ์ˆ˜ ํ˜ธ์ถœ
  โ”œ ๊ฒฐ๊ณผ marshalling
  โ”œ IPC ์ฑ„๋„ ๋ฐ˜ํ™˜
  โ”” ํด๋ผ์ด์–ธํŠธ unmarshalling

12.3 ๋ฉ”์‹œ์ง€ ํฌ๊ธฐ์— ๋”ฐ๋ฅธ ๋ณ€ํ™”

ํฐ ๋ฉ”์‹œ์ง€(์ˆ˜ MB)์ผ ๋•Œ๋Š” ๋น„์šฉ ๊ตฌ์„ฑ์ด ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

1
2
3
4
5
6
1MB ๋ฐ์ดํ„ฐ ์ „์†ก:
  - ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ: ์ˆ˜ ns (ํฌ์ธํ„ฐ๋งŒ ๊ณต์œ , ๋ฐ์ดํ„ฐ ์ž์ฒด๋Š” ๋ณต์‚ฌ ์—†์Œ)
  - ํŒŒ์ดํ”„/์†Œ์ผ“: 1MB ๋ณต์‚ฌ ร— 2ํšŒ = ์ˆ˜์‹ญ ms (๋ฉ”๋ชจ๋ฆฌ ๋Œ€์—ญํญ ํ•œ๊ณ„)
  - RPC: marshalling + 1MB ๋ณต์‚ฌ = ์ˆ˜์‹ญ ms ์ด์ƒ

โ†’ ํฐ ๋ฐ์ดํ„ฐ๋Š” ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ ˆ๋Œ€์ ์œผ๋กœ ์œ ๋ฆฌ

์ด๊ฒŒ ๊ฒŒ์ž„ ์—”์ง„์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ๊ทน ํ™œ์šฉํ•˜๋Š” ์ง์ ‘์  ์ด์œ ์ž…๋‹ˆ๋‹ค.

12.4 ๋นˆ๋„์— ๋”ฐ๋ฅธ ๋ˆ„์  ๋น„์šฉ

1
2
3
4
1์ดˆ๋‹น 10000ํšŒ IPC (๊ฒŒ์ž„ 60fps ร— 200ํšŒ):
  ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ: 10000 ร— ์ˆ˜ ns = ์ˆ˜์‹ญ ฮผs (๋ฌด์‹œ ๊ฐ€๋Šฅ)
  ํŒŒ์ดํ”„:    10000 ร— ์ˆ˜ ฮผs = ์ˆ˜์‹ญ ms (5% ํ”„๋ ˆ์ž„ ์˜ˆ์‚ฐ)
  RPC:       10000 ร— ์ˆ˜์‹ญ ฮผs = ์ˆ˜๋ฐฑ ms (ํ”„๋ ˆ์ž„ ์˜ˆ์‚ฐ ํญ๋ฐœ!)

๋†’์€ ๋นˆ๋„ + ์ž‘์€ ๋ฐ์ดํ„ฐ = ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ, ๋‚ฎ์€ ๋นˆ๋„ + ์ถ”์ƒํ™” = RPC/COM ์ด ํฐ ๊ทธ๋ฆผ์˜ ์˜์‚ฌ๊ฒฐ์ • ์ถ•์ž…๋‹ˆ๋‹ค.


13. ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ โ€” ์†๋„ vs ์•ˆ์ „์„ฑ vs ๋™๊ธฐํ™” ๋ณต์žก๋„

๋น„์šฉ๋งŒ์œผ๋กœ๋Š” IPC๋ฅผ ๊ณ ๋ฅผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์•ˆ์ „์„ฑยท๋™๊ธฐํ™” ๋ณต์žก๋„ยท๊ฒฉ๋ฆฌ ๊ฐ•๋„๊ฐ€ ์ง๊ต์ถ•์œผ๋กœ ํ•จ๊ป˜ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค.

13.1 3์ถ• ๋น„๊ต ํ‘œ

๋ฉ”์ปค๋‹ˆ์ฆ˜์†๋„์•ˆ์ „์„ฑ/๊ฒฉ๋ฆฌ๋™๊ธฐํ™” ๋ณต์žก๋„์ถ”์ƒํ™”
๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌโ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜… (์ง์ ‘ ๋™๊ธฐํ™” ํ•„์š”)โ˜…โ˜…โ˜…โ˜…โ˜… (์–ด๋ ต๋‹ค)โ˜…
๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผโ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…
๋ช…๋ช… ํŒŒ์ดํ”„โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…
๋ฉ”์‹œ์ง€ ํโ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…
UNIX domain socketโ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…
TCP/UDP socketโ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…
์‹œ๊ทธ๋„/Eventโ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜… (์žฌ์ง„์ž… ์ฃผ์˜)โ˜…โ˜…
RPCโ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜… (๋Ÿฐํƒ€์ž„์ด ์ฒ˜๋ฆฌ)โ˜…โ˜…โ˜…โ˜…โ˜…
COMโ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…

13.2 ์•ˆ์ „์„ฑ/๊ฒฉ๋ฆฌ โ€” ์™œ ๊ฒฉ๋ฆฌ๊ฐ€ ๊นจ์งˆ๊นŒ

๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋‘ ํ”„๋กœ์„ธ์Šค์˜ ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„์ด ๊ฐ™์€ ๋ฌผ๋ฆฌ ํŽ˜์ด์ง€๋ฅผ ๊ณต์œ ํ•˜๋ฏ€๋กœ ๊ฒฉ๋ฆฌ๊ฐ€ ๋ถ€๋ถ„์ ์œผ๋กœ ๊นจ์ง‘๋‹ˆ๋‹ค. ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž˜๋ชป ์“ฐ๋ฉด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ทธ ๊นจ์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ด…๋‹ˆ๋‹ค. ๋˜ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ํฌ์ธํ„ฐ๋ฅผ ๋„ฃ์œผ๋ฉด ๋งคํ•‘ ์ฃผ์†Œ๊ฐ€ ๋‹ฌ๋ผ ๊นจ์ง‘๋‹ˆ๋‹ค(6.5์ ˆ).

๋ฐ˜๋ฉด ํŒŒ์ดํ”„ยท์†Œ์ผ“ยท๋ฉ”์‹œ์ง€ ํ๋Š” ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ ๋ฐฉ์‹์ด๋ผ ๋ณด๋‚ธ ์ชฝ์ด ๋ง๊ฐ€์ ธ๋„ ๋ฐ›์€ ์ชฝ์˜ ๋ฐ์ดํ„ฐ๋Š” ์˜ํ–ฅ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฉ๋ฆฌ๊ฐ€ ๊ฐ•ํ•ฉ๋‹ˆ๋‹ค. RPC๋Š” ํ•œ ๋‹จ๊ณ„ ๋” โ€” ์ธ์ž๊ฐ€ marshalling ๊ณผ์ •์—์„œ ๊ฒ€์ฆ๋˜๋ฏ€๋กœ ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด stub์ด ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

13.3 ๋™๊ธฐํ™” ๋ณต์žก๋„ โ€” ๊ฐ€์žฅ ์–ด๋ ค์šด ๋ถ€๋ถ„

๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ฐ€์žฅ ํฐ ์•ฝ์ ์ž…๋‹ˆ๋‹ค. OS๊ฐ€ ๋™๊ธฐํ™”๋ฅผ ์•ˆ ํ•ด์ฃผ๋‹ˆ๊นŒ ๋‹ค์Œ์„ ๋ชจ๋‘ ์ง์ ‘ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • race condition โ€” ๋‘ ํ”„๋กœ์„ธ์Šค ๋™์‹œ ์“ฐ๊ธฐ ๋ณดํ˜ธ
  • memory ordering โ€” atomic operations, memory barriers
  • ๋ถ€๋ถ„ ์“ฐ๊ธฐ(torn write) โ€” 8๋ฐ”์ดํŠธ ๊ฐ’์„ 32๋น„ํŠธ ๋จธ์‹ ์—์„œ atomicํ•˜๊ฒŒ ์“ฐ๊ธฐ ๋ถˆ๊ฐ€
  • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ์ผ๊ด€์„ฑ โ€” ์ž๋ฃŒ๊ตฌ์กฐ ๊ฐฑ์‹  ์ค‘๊ฐ„์— ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ณด๋ฉด ๊นจ์ง„ ์ƒํƒœ๊ฐ€ ๋ณด์ž„
  • ๋ฒ„์ „ ๊ด€๋ฆฌ โ€” ์ƒ์‚ฐ์ž๊ฐ€ N๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๋Š” ์ค‘์— ์†Œ๋น„์ž๊ฐ€ N-1๋ฒˆ์งธ์™€ N๋ฒˆ์งธ ํ˜ผํ•ฉ๋ณธ์„ ์ฝ์ง€ ์•Š๊ฒŒ
1
2
3
4
5
6
7
8
9
10
11
// ์ž˜๋ชป๋œ ์˜ˆ โ€” race condition
struct SharedData {
    int x, y;
    int magic;  // ๊ฒ€์ฆ์šฉ
};
SharedData* p = (SharedData*)pView;
p->x = 10;     // โ† ์—ฌ๊ธฐ์„œ ์ปจํ…์ŠคํŠธ ์Šค์œ„์น˜
p->y = 20;
p->magic = 0xDEADBEEF;

// ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์œ„ ์‹œ์ ์— ์ฝ์œผ๋ฉด x=10, y=์ด์ „๊ฐ’, magic=์ด์ „๊ฐ’
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ โ€” Mutex๋กœ ๋ณดํ˜ธ
WaitForSingleObject(hMutex, INFINITE);
p->x = 10;
p->y = 20;
p->magic = 0xDEADBEEF;
ReleaseMutex(hMutex);

// ๋˜๋Š” atomic + ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด
std::atomic<bool> ready{false};
p->x = 10;
p->y = 20;
ready.store(true, std::memory_order_release);
// ๋ฐ›๋Š” ์ชฝ
if (ready.load(std::memory_order_acquire)) {
    // x, y ์•ˆ์ „ํ•˜๊ฒŒ ์ฝ๊ธฐ
}

๋ฉ”์‹œ์ง€ ํยทํŒŒ์ดํ”„๋Š” ๋ฉ”์‹œ์ง€ ํ•œ ๋‹จ์œ„์˜ ์›์ž์„ฑ์„ OS๊ฐ€ ๋ณด์žฅํ•˜๋ฏ€๋กœ ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ์ถ”์ƒํ™”์˜ ๊ฐ€์น˜์ž…๋‹ˆ๋‹ค.

13.4 ๊ฒฉ๋ฆฌ vs ์†๋„ โ€” ์‹ค๋ฌด ์˜์‚ฌ๊ฒฐ์ •

1
2
3
4
5
6
7
8
์‹ ๋ขฐ ๊ฒฝ๊ณ„ ์•ˆ (๊ฐ™์€ ํŒ€ยท๊ฐ™์€ ์ฝ”๋“œ ๋ฒ ์ด์Šค):
  โ†’ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์šฐ์„  โ€” ์†๋„ ์ ˆ๋Œ€์ 
  โ†’ ๋™๊ธฐํ™” ์ง์ ‘ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ

์‹ ๋ขฐ ๊ฒฝ๊ณ„ ๋ฐ”๊นฅ (์™ธ๋ถ€ ํ”„๋กœ์„ธ์Šคยท์„œ๋“œํŒŒํ‹ฐ):
  โ†’ ๋ฉ”์‹œ์ง€ ํยท์†Œ์ผ“ยทRPC โ€” ๊ฒฉ๋ฆฌ ๊ฐ•ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜
  โ†’ ์ž…๋ ฅ ๊ฒ€์ฆ ํ•„์ˆ˜
  โ†’ ์†๋„๋Š” ์ผ๋ถ€ ํฌ๊ธฐ

Chrome์˜ GPU ํ”„๋กœ์„ธ์Šค๋Š” ๋ Œ๋”๋Ÿฌ์™€๋Š” ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ(ํ…์Šค์ฒ˜), ๋ธŒ๋ผ์šฐ์ € ๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค์™€๋Š” ๋ฉ”์‹œ์ง€ ํŒจ์‹ฑ์œผ๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค โ€” ์‹ ๋ขฐ๋„๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฐ™์€ ์ž๊ธฐ ํŒ€ ์ฝ”๋“œ๋ผ๋ฆฌ๋Š” ๋น ๋ฅด๊ฒŒ, ์™ธ๋ถ€ ๋…ธ์ถœ ๊ฐ€๋Šฅ ์ฝ”๋“œ์™€๋Š” ์•ˆ์ „ํ•˜๊ฒŒ.

13.5 ๋™๊ธฐํ™” ๊ฐ์ฒด + ๋ฐ์ดํ„ฐ ์ฑ„๋„์˜ ์กฐํ•ฉ ํŒจํ„ด

์‹ค๋ฌด์—์„œ ๊ฐ€์žฅ ํ”ํ•œ ํŒจํ„ด์ด ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ + ๋™๊ธฐํ™” ๊ฐ์ฒด ์กฐํ•ฉ์ž…๋‹ˆ๋‹ค.

1
2
3
4
๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ:    ๋ฐ์ดํ„ฐ
Named Mutex:    ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ
Named Event:    "์ƒˆ ๋ฐ์ดํ„ฐ ์žˆ์Œ" ์•Œ๋ฆผ
Named Semaphore: ์Šฌ๋กฏ ์นด์šดํŒ… (ํ ๋ชจ๋ธ)

์ด ์กฐํ•ฉ์€ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์˜ ์†๋„ + ๋™๊ธฐํ™” ๊ฐ์ฒด์˜ ์•ˆ์ „์„ฑ์„ ํ•จ๊ป˜ ์–ป์Šต๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์—”์ง„์˜ ํ”„๋กœ์„ธ์Šค ๋ถ„๋ฆฌ, DBMS์˜ ์›Œ์ปค ํ’€, ๋น„๋””์˜ค ์ธ์ฝ”๋”์˜ GPU ์ธํ„ฐํŽ˜์ด์Šค ๋ชจ๋‘ ์ด ํŒจํ„ด.


14. ๋ณด์•ˆ โ€” ์‹ ๋ขฐ ๊ฒฝ๊ณ„์™€ ACL

IPC๋Š” ์‹ ๋ขฐ ๊ฒฝ๊ณ„(trust boundary) ๋ฅผ ๋„˜๋Š” ํ†ต์‹ ์ด๋ฏ€๋กœ ๋ณด์•ˆ ๊ณ ๋ ค๊ฐ€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.

14.1 ๋ช…๋ช…๋œ IPC ๊ฐ์ฒด์˜ ACL

Windows์—์„œ ์ด๋ฆ„ ์žˆ๋Š” IPC ๊ฐ์ฒด(Named PipeยทNamed MutexยทFile MappingยทMailslot)๋Š” ๋ณด์•ˆ ๋””์Šคํฌ๋ฆฝํ„ฐ(SECURITY_DESCRIPTOR) ๋กœ ์ ‘๊ทผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

1
2
3
4
5
SECURITY_ATTRIBUTES sa = { sizeof(sa), pSD, FALSE };
// pSD๋Š” ์ง์ ‘ ๋งŒ๋“ค๊ฑฐ๋‚˜ ConvertStringSecurityDescriptorToSecurityDescriptor๋กœ

HANDLE hPipe = CreateNamedPipe(L"\\\\.\\pipe\\MyService",
                                ..., ..., ..., ..., ..., ..., &sa);

๊ธฐ๋ณธ๊ฐ’(NULL)์€ ํ˜„์žฌ ์‚ฌ์šฉ์ž์˜ ํ† ํฐ ๊ธฐ์ค€์œผ๋กœ ๊ถŒํ•œ์ด ๋งค๊ฒจ์ง‘๋‹ˆ๋‹ค โ€” ๊ฐ™์€ ์‚ฌ์šฉ์ž์˜ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋งŒ ์—ด ์ˆ˜ ์žˆ๊ณ , ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋‚˜ ์„œ๋น„์Šค๋Š” ๋ชป ์—ฝ๋‹ˆ๋‹ค.

14.2 Integrity Level (Windows)

Vista ์ดํ›„ Windows๋Š” ๋ฌด๊ฒฐ์„ฑ ์ˆ˜์ค€(Integrity Level) ์œผ๋กœ ์ถ”๊ฐ€ ๊ฒฉ๋ฆฌ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜์ค€์‚ฌ์šฉ์ฒ˜
SystemOS ์ฝ”์–ด
High๊ด€๋ฆฌ์ž ๊ถŒํ•œ (UAC ์Šน๊ฒฉ)
Medium์ผ๋ฐ˜ ์‚ฌ์šฉ์ž ํ”„๋กœ์„ธ์Šค (๊ธฐ๋ณธ)
Low์ธํ„ฐ๋„ท Explorer protected mode, Chrome ๋ Œ๋”๋Ÿฌ
Untrusted๋” ๊ฐ•ํ•œ ์ƒŒ๋“œ๋ฐ•์Šค

๋‚ฎ์€ IL ํ”„๋กœ์„ธ์Šค๋Š” ๋†’์€ IL์ด ๊ฐ€์ง„ ๊ฐ์ฒด์— ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ƒŒ๋“œ๋ฐ•์Šค๋œ ๋ Œ๋”๋Ÿฌ(Low)๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค(Medium)์˜ ๊ฐ์ฒด๋ฅผ ๋งˆ์Œ๋Œ€๋กœ ๋ชป ๋งŒ์ง‘๋‹ˆ๋‹ค. IPC ์ฑ„๋„์„ ํ†ตํ•ด์„œ๋งŒ ์ œํ•œ๋œ ๋ช…๋ น์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

14.3 ์‹ ๋ขฐ ๊ฒฝ๊ณ„์™€ ์ž…๋ ฅ ๊ฒ€์ฆ

IPC๋กœ ๋“ค์–ด์˜ค๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋‘ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ž…๋ ฅ์œผ๋กœ ์ทจ๊ธ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// ์ž˜๋ชป๋œ ์˜ˆ
struct Command {
    int op;
    int size;
    char data[1024];
};

void HandleCommand(const Command* cmd) {
    memcpy(g_buffer, cmd->data, cmd->size);  // cmd->size๊ฐ€ 1024 ์ดˆ๊ณผ๋ฉด? 1MB๋ผ๋ฉด?
}

// ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ
void HandleCommand(const Command* cmd) {
    if (cmd->size < 0 || cmd->size > sizeof(cmd->data) || cmd->size > sizeof(g_buffer)) {
        // ๊ฑฐ๋ถ€
        return;
    }
    memcpy(g_buffer, cmd->data, cmd->size);
}

IPC๊ฐ€ ๋ณด์•ˆ ์ทจ์•ฝ์ ์˜ ํ”ํ•œ ์ถœ์ฒ˜์ธ ์ด์œ  โ€” ์ฝ”๋“œ๊ฐ€ ๊ฐ™์€ ํŒ€์—์„œ ์ž‘์„ฑ๋๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๊ฒ€์ฆ์„ ๋น ๋œจ๋ฆฝ๋‹ˆ๋‹ค.

14.4 ์ธ์ฆ๊ณผ ์ž„ํผ์†Œ๋„ค์ด์…˜

Windows์˜ ๋ช…๋ช… ํŒŒ์ดํ”„๋Š” ํด๋ผ์ด์–ธํŠธ ์ž„ํผ์†Œ๋„ค์ด์…˜(impersonation) ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค โ€” ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ๋ณด์•ˆ ํ† ํฐ์„ ๋นŒ๋ ค ๊ทธ ๊ถŒํ•œ์œผ๋กœ ๋™์ž‘.

1
2
3
4
5
ConnectNamedPipe(hPipe, NULL);
ImpersonateNamedPipeClient(hPipe);
// ์ด์ œ ์ด ์Šค๋ ˆ๋“œ๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ๊ถŒํ•œ์œผ๋กœ ๋™์ž‘
// (ํŒŒ์ผ ์ ‘๊ทผ ๋“ฑ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ€์ง„ ๊ถŒํ•œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
RevertToSelf();

์„œ๋น„์Šค๊ฐ€ ํด๋ผ์ด์–ธํŠธ ๊ถŒํ•œ์œผ๋กœ ์ž์› ์ ‘๊ทผํ•˜๋Š” ํŒจํ„ด. ์ž„ํผ์†Œ๋„ค์ด์…˜ ํ† ํฐ์„ ์ž˜๋ชป ๋‹ค๋ฃจ๋ฉด ๊ถŒํ•œ ์ƒ์Šน ์ทจ์•ฝ์ ์ด ๋จ.

14.5 ๋ณด์•ˆ ์ธก๋ฉด ํŠธ๋ ˆ์ด๋“œ์˜คํ”„

๋ฉ”์ปค๋‹ˆ์ฆ˜๊ฒฉ๋ฆฌ์ธ์ฆ์ž…๋ ฅ ๊ฒ€์ฆ ๋ถ€๋‹ด
๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋‚ฎ์Œ (ํฌ์ธํ„ฐ ๊นจ์ง ์œ„ํ—˜)๊ฐ์ฒด ACL๋งค์šฐ ํผ (๊ตฌ์กฐ์ฒด ์ž์ฒด ์‹ ๋ขฐ ๋ถˆ๊ฐ€)
๋ช…๋ช… ํŒŒ์ดํ”„๋†’์ŒACL + ์ž„ํผ์†Œ๋„ค์ด์…˜๋ณดํ†ต (๋ฉ”์‹œ์ง€ ๋‹จ์œ„ ๊ฒ€์ฆ)
๋ฉ”์‹œ์ง€ ํ๋†’์ŒACL๋ณดํ†ต
์†Œ์ผ“๋งค์šฐ ๋†’์Œ์™ธ๋ถ€ ์ธ์ฆ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ๋งค์šฐ ํผ (๋„คํŠธ์›Œํฌ ์‹ ๋ขฐ ์•ˆ ๋จ)
RPC/COM๋งค์šฐ ๋†’์Œํ† ํฐ + ์ธ์ฆ ์ฝœ๋ฐฑ์ž๋™ (marshalling์ด ์ผ๋ถ€ ๊ฒ€์ฆ)

15. ์–ธ๋ฆฌ์–ผ์—์„œ์˜ IPC โ€” FPlatformProcessยทMessageBusยทHot Reload

์–ธ๋ฆฌ์–ผ ์—”์ง„์€ IPC๋ฅผ ์—๋””ํ„ฐ-์™ธ๋ถ€ ๋„๊ตฌ ํ†ต์‹ ๊ณผ ๋ถ„์‚ฐ ๋นŒ๋“œ/ํ˜‘์—…์— ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

15.1 FPlatformProcess โ€” ํ”Œ๋žซํผ ์ถ”์ƒํ™”

์–ธ๋ฆฌ์–ผ์€ ๋ชจ๋“  IPC๋ฅผ FPlatformProcess ์ธํ„ฐํŽ˜์ด์Šค ๋’ค์— ์ˆจ๊น๋‹ˆ๋‹ค. Windows์—์„  Win32 API, Linux/Mac์—์„  POSIX๋กœ ๋งคํ•‘.

1
2
3
4
5
6
7
8
9
10
11
// ์ž์‹ ํ”„๋กœ์„ธ์Šค ์‹คํ–‰
FProcHandle proc = FPlatformProcess::CreateProc(
    *AppPath,            // ์‹คํ–‰ ํŒŒ์ผ
    *Args,               // ์ธ์ž
    true,                // ๋ถ„๋ฆฌ๋œ ์ฝ˜์†”
    false, false,        // ์ˆจ๊น€ยทminimize
    nullptr,             // PID ์ถœ๋ ฅ
    0,                   // ์šฐ์„ ์ˆœ์œ„
    nullptr,             // ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ
    nullptr              // ํ‘œ์ค€ ์ž…์ถœ๋ ฅ ํŒŒ์ดํ”„
);

15.2 ์ต๋ช… ํŒŒ์ดํ”„ โ€” FPlatformProcess::CreatePipe

1
2
3
4
5
6
7
8
9
10
void* ReadPipe = nullptr;
void* WritePipe = nullptr;
FPlatformProcess::CreatePipe(ReadPipe, WritePipe);

// CreateProc์— ReadPipe/WritePipe ์ „๋‹ฌํ•ด ์ž์‹ ํ”„๋กœ์„ธ์Šค stdout ์บก์ฒ˜

// ์ž์‹ ์ถœ๋ ฅ ์ฝ๊ธฐ
FString Output = FPlatformProcess::ReadPipe(ReadPipe);

FPlatformProcess::ClosePipe(ReadPipe, WritePipe);

๋‚ด๋ถ€์ ์œผ๋กœ Windows์—์„  CreatePipe โ†’ CreateProcess์— STDIN/STDOUT ํ•ธ๋“ค ์—ฐ๊ฒฐ.

๋Œ€ํ‘œ ์‚ฌ์šฉ์ฒ˜:

  • UnrealBuildTool ์‹คํ–‰ ํ›„ ์ปดํŒŒ์ผ๋Ÿฌ ์ถœ๋ ฅ ์บก์ฒ˜
  • ์…ฐ์ด๋” ์ปดํŒŒ์ผ๋Ÿฌ ์ž์‹ ํ”„๋กœ์„ธ์Šค ๋ชจ๋‹ˆํ„ฐ๋ง
  • ์—๋””ํ„ฐ โ†” Live Coding ์ปดํŒŒ์ผ๋Ÿฌ ํ†ต์‹ 

15.3 IMessageBus / MessageBus ํ”Œ๋Ÿฌ๊ทธ์ธ โ€” ๊ฐ™์€ ์ธ์Šคํ„ด์Šค ๋‚ด ๋ฉ”์‹œ์ง€ ํŒจ์‹ฑ

์–ธ๋ฆฌ์–ผ์˜ MessageBus ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๊ฐ™์€ ๋จธ์‹ ยท๊ฐ™์€ ์—๋””ํ„ฐ ์ธ์Šคํ„ด์Šค ์•ˆ์—์„œ ๋ชจ๋“ˆ ๊ฐ„ ๋ฉ”์‹œ์ง€ ํŒจ์‹ฑ์„ ์ถ”์ƒํ™”ํ•ฉ๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// ๋ฉ”์‹œ์ง€ ์ •์˜
USTRUCT()
struct FMyCommand
{
    GENERATED_BODY()
    UPROPERTY() FString Action;
};

// ์†ก์‹ 
TSharedPtr<IMessageBus> Bus = IMessageBusManager::Get()->GetMessageBus();
TSharedRef<IMessageEndpoint> Sender = FMessageEndpoint::Builder("MySender").Build();
Sender->Publish(new FMyCommand{ "DoStuff" });

// ์ˆ˜์‹ 
TSharedRef<IMessageEndpoint> Receiver = FMessageEndpoint::Builder("MyReceiver")
    .Handling<FMyCommand>([](const FMyCommand& Msg, const IMessageContextRef& Ctx){
        UE_LOG(LogTemp, Log, TEXT("Got: %s"), *Msg.Action);
    })
    .Build();
Receiver->Subscribe<FMyCommand>();

๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค ์•ˆ์˜ ๋ชจ๋“ˆ ๊ฐ„ ํ†ต์‹ ์ด๋ผ IPC๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ, ๋ถ„์‚ฐ ๋ฒ„์ „(UDP Messaging ํ”Œ๋Ÿฌ๊ทธ์ธ) ์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๊ฐ™์€ LAN์˜ ๋‹ค๋ฅธ ์–ธ๋ฆฌ์–ผ ์ธ์Šคํ„ด์Šค๋กœ๋„ ๋ฉ”์‹œ์ง€๊ฐ€ ์ „ํŒŒ๋ฉ๋‹ˆ๋‹ค โ€” ์ง„์งœ IPC๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

15.4 Live Coding โ€” ์—๋””ํ„ฐ โ†” ์ปดํŒŒ์ผ๋Ÿฌ

์–ธ๋ฆฌ์–ผ 5์˜ Live Coding์€ ์—๋””ํ„ฐ๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ์ƒํƒœ์—์„œ ์ฝ”๋“œ ๋ณ€๊ฒฝ์„ ํ•ซ๋ฆฌ๋กœ๋“œํ•˜๋Š” ๊ธฐ๋Šฅ์ธ๋ฐ, ์—๋””ํ„ฐ ํ”„๋กœ์„ธ์Šค โ†” Live++ ์ปดํŒŒ์ผ๋Ÿฌ ํ”„๋กœ์„ธ์Šค ์‚ฌ์ด์— ๋ช…๋ช… ํŒŒ์ดํ”„๋กœ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค.

1
2
3
4
5
UE5Editor.exe โ”€โ”€[named pipe]โ”€โ”€โ†’ Live++.exe (๋˜๋Š” LiveCoding subprocess)
     โ†‘                                 โ†“
     โ”‚                            ์†Œ์Šค ์ฝ”๋“œ ์ปดํŒŒ์ผ
     โ”‚                                 โ†“
     โ””โ”€โ”€[ํŒจ์น˜ ์ •๋ณด + DLL]โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€  patch ๊ฒฐ๊ณผ

์—๋””ํ„ฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฝ”๋“œ ๋ณ€๊ฒฝ์„ ์ปดํŒŒ์ผ๋Ÿฌ์— ์•Œ๋ฆฌ๊ณ , ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ฒฐ๊ณผ DLL์„ ์—๋””ํ„ฐ์— ์ „๋‹ฌํ•˜๋ฉด ์—๋””ํ„ฐ๊ฐ€ ๊ทธ๊ฑธ ํ•ซํŒจ์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ ๊ตฌํ˜„์€ ๋น„๊ณต๊ฐœ์ด์ง€๋งŒ ํŒจํ„ด์€ ๋ช…๋ช… ํŒŒ์ดํ”„ + ๋ฉ”์‹œ์ง€ ์ง๋ ฌํ™”.

15.5 ์™ธ๋ถ€ ๋นŒ๋“œ ๋„๊ตฌ์™€์˜ ํ†ต์‹ 

์–ธ๋ฆฌ์–ผ์€ ๋นŒ๋“œยท์…ฐ์ด๋” ์ปดํŒŒ์ผยท๋ผ์ดํŒ… ๋นŒ๋“œ์— ๋ณ„๋„ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
UE5Editor
  โ”œโ”€ UnrealBuildTool.exe              (C# ์ฝ”๋“œ ๋นŒ๋“œ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜)
  โ”œโ”€ ShaderCompileWorker.exe (๋‹ค์ˆ˜)   (์…ฐ์ด๋” ๋ณ‘๋ ฌ ์ปดํŒŒ์ผ)
  โ”œโ”€ SwarmAgent.exe / SwarmCoordinator (๋ผ์ดํŒ… ๋นŒ๋“œ ๋ถ„์‚ฐ)
  โ””โ”€ UnrealLightmass.exe               (๋ผ์ดํŠธ๋งต ๊ณ„์‚ฐ ์›Œ์ปค)

ํ†ต์‹  ๋ฐฉ์‹:
  - UBT: ์ž์‹ ํ”„๋กœ์„ธ์Šค๋กœ ์‹คํ–‰, stdout ํŒŒ์ดํ”„๋กœ ์ง„ํ–‰ ์บก์ฒ˜
  - ShaderCompileWorker: ๋ช…๋ช… ํŒŒ์ดํ”„ ๋˜๋Š” ์ž„์‹œ ํŒŒ์ผ (๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ)
  - Swarm: TCP ์†Œ์ผ“ (๋„คํŠธ์›Œํฌ ๋ถ„์‚ฐ)
  - Lightmass: ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ (๋Œ€์šฉ๋Ÿ‰ ๋ฉ”์‹œ ๋ฐ์ดํ„ฐ)

์ด๊ฒŒ IPC์˜ ์‹ค๋ฌด ์ ์šฉ ์‚ฌ๋ก€ ์ „๋ถ€๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค โ€” ๋ช…๋ น ์ „๋‹ฌ์€ ํŒŒ์ดํ”„, ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋Š” ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ, ๋„คํŠธ์›Œํฌ ๋ถ„์‚ฐ์€ ์†Œ์ผ“.

15.6 ์–ธ๋ฆฌ์–ผ IPC ์ •๋ฆฌ ํ‘œ

์‹œ๋‚˜๋ฆฌ์˜ค๋ฉ”์ปค๋‹ˆ์ฆ˜๋น„๊ณ 
๋นŒ๋“œ ๋„๊ตฌ ์‹คํ–‰ (UBT)CreateProc + stdout ํŒŒ์ดํ”„ํ‘œ์ค€ ์ถœ๋ ฅ ์บก์ฒ˜
์…ฐ์ด๋” ์ปดํŒŒ์ผ ์›Œ์ปค๋ช…๋ช… ํŒŒ์ดํ”„ + ์ž„์‹œ ํŒŒ์ผ๋‹ค์ˆ˜ ์›Œ์ปค ๋ณ‘๋ ฌ
Live Coding๋ช…๋ช… ํŒŒ์ดํ”„ํŒจ์น˜ ๋ฐ์ดํ„ฐ ์–‘๋ฐฉํ–ฅ
๋ผ์ดํŒ… ๋นŒ๋“œ ๋ถ„์‚ฐTCP ์†Œ์ผ“ (Swarm)๋„คํŠธ์›Œํฌ ๋ถ„์‚ฐ
๊ฐ™์€ ๋จธ์‹  ๋ถ„์‚ฐ ํ†ต์‹ UDP Messaging ํ”Œ๋Ÿฌ๊ทธ์ธ๋ฉ€ํ‹ฐ ์—๋””ํ„ฐ ํ˜‘์—…
๋ชจ๋“ˆ ๊ฐ„ ๋ฉ”์‹œ์ง€ (in-proc)MessageBus๊ฐ™์€ ํ”„๋กœ์„ธ์Šค
Slate IPC (๋“œ๋ž˜๊ทธยท๋ณต์‚ฌ)Windows clipboard / OLEOS ์ œ๊ณต ๋ฉ”์ปค๋‹ˆ์ฆ˜

15.7 ๊ฒŒ์ž„ ๋Ÿฐํƒ€์ž„์—์„œ๋Š”?

๊ฒŒ์ž„ ๋Ÿฐํƒ€์ž„ ์ž์ฒด๋Š” ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ธฐ๋ณธ์ด๋ผ IPC๊ฐ€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ๊ฒŒ์ž„์€ IPC๊ฐ€ ์•„๋‹ˆ๋ผ NetDriver(UDP ์†Œ์ผ“ ๊ธฐ๋ฐ˜)๋กœ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ํ†ต์‹ . ๊ทธ๋ž˜์„œ ๋ฉด์ ‘์—์„œ โ€œ์–ธ๋ฆฌ์–ผ ๊ฒŒ์ž„์—์„œ IPC ์–ด๋”” ์“ฐ๋‚˜โ€๋Š” ์งˆ๋ฌธ์€ ๋ณดํ†ต ์—๋””ํ„ฐ ๋„๊ตฌ ์ฒด์ธ ์ชฝ์œผ๋กœ ๋‹ตํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.


16. ๊ผฌ๋ฆฌ์งˆ๋ฌธ ์˜ˆ์ƒ ๊ฒฝ๋กœ

Q1. โ€œํ”„๋กœ์„ธ์Šค๋ผ๋ฆฌ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•(IPC)์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.โ€

IPC(Inter-Process Communication, ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ )๋Š” OS๊ฐ€ ๊ฐ•์ œํ•˜๋Š” ์ฃผ์†Œ ๊ณต๊ฐ„ ๊ฒฉ๋ฆฌ๋ฅผ ๊นจ์ง€ ์•Š์œผ๋ฉด์„œ ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ธฐ๊ฑฐ๋‚˜ ๋™๊ธฐํ™” ์‹ ํ˜ธ๋ฅผ ๊ตํ™˜ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ์ด์นญ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค vs ์Šค๋ ˆ๋“œ(19)์—์„œ ๋ดค๋“ฏ์ด ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค ์•ˆ์˜ ์Šค๋ ˆ๋“œ๋Š” ์ฝ”๋“œยท๋ฐ์ดํ„ฐยทํž™์„ ๊ณต์œ ํ•˜๋ฏ€๋กœ ์ „์—ญ ๋ณ€์ˆ˜๋กœ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํ”„๋กœ์„ธ์Šค๋ผ๋ฆฌ๋Š” ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„์ด ๋‹ค๋ฅด๊ณ  ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”๋„ ๋‹ฌ๋ผ์„œ ๊ฐ™์€ ๊ฐ€์ƒ ์ฃผ์†Œ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฐ˜๋“œ์‹œ ์ปค๋„์ด ํ•œ ๋ฒˆ ์ค‘์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ถ„๋ฅ˜์ถ•์œผ๋กœ ๋ณด๋ฉด โ‘  ๋ฐ์ดํ„ฐ ์ „์†ก์ด๋ƒ ์‹ ํ˜ธ ์ „์†ก์ด๋ƒ(ํŒŒ์ดํ”„ยท๋ฉ”์‹œ์ง€ ํยท๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌยท์†Œ์ผ“ vs ์‹œ๊ทธ๋„ยท์„ธ๋งˆํฌ์–ดยทEvent), โ‘ก ๋งค๋ฒˆ ์ปค๋„์„ ๊ฑฐ์น˜๋А๋ƒ ์‚ฌ์šฉ์ž ๋ชจ๋“œ์—์„œ ๋๋‚˜๋А๋ƒ(ํŒŒ์ดํ”„ยท์†Œ์ผ“ vs ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ), โ‘ข ๊ฐ™์€ ๋จธ์‹ ๋งŒ ๊ฐ€๋Šฅํ•˜๋ƒ ๋„คํŠธ์›Œํฌ๊นŒ์ง€ ๊ฐ€๋А๋ƒ(์ต๋ช… ํŒŒ์ดํ”„ยทshm vs ๋ช…๋ช… ํŒŒ์ดํ”„ยท์†Œ์ผ“ยทRPC)๋กœ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”์ปค๋‹ˆ์ฆ˜๋ณ„๋กœ ๋ณด๋ฉด ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌยท๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ์ด ๊ฐ€์žฅ ๋น ๋ฅด๊ณ (์ˆ˜ ns), ํŒŒ์ดํ”„ยท์†Œ์ผ“ยท๋ฉ”์‹œ์ง€ ํ๊ฐ€ ์ค‘๊ฐ„(์ˆ˜~์ˆ˜์‹ญ ฮผs), RPC์™€ COM์ด ๊ฐ€์žฅ ๋А๋ฆฌ์ง€๋งŒ ์ถ”์ƒํ™”๊ฐ€ ๊ฐ€์žฅ ๋†’์Šต๋‹ˆ๋‹ค(์ˆ˜์‹ญ~์ˆ˜๋ฐฑ ฮผs).

Q2. โ€œ์™œ ํ”„๋กœ์„ธ์Šค๋ผ๋ฆฌ๋Š” ๊ทธ๋ƒฅ ๋ฉ”๋ชจ๋ฆฌ์— ๋ชป ์“ฐ๊ณ  IPC๊ฐ€ ํ•„์š”ํ•œ๊ฐ€์š”?โ€

์ฃผ์†Œ ๊ณต๊ฐ„ ๊ฒฉ๋ฆฌ(address space isolation) ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. OS๋Š” ๊ฐ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ์ž๊ธฐ ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„๊ณผ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์„ ์ค˜์„œ, ๊ฐ™์€ ๊ฐ€์ƒ ์ฃผ์†Œ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. MMU(Memory Management Unit)๊ฐ€ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”๋กœ ์ด ๊ฒฉ๋ฆฌ๋ฅผ ๊ฐ•์ œํ•˜๊ณ , ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ(21)์—์„œ ๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ ํ”„๋กœ์„ธ์Šค ์ „ํ™˜ ์‹œ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” ๋ฒ ์ด์Šค ๋ ˆ์ง€์Šคํ„ฐ(x86 CR3)๋ฅผ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฒฉ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” ์„ธ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์•ˆ์ •์„ฑ โ€” ํ•œ ํ”„๋กœ์„ธ์Šค์˜ ๋ฒ„๊ทธ๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ง๊ฐ€๋œจ๋ฆฌ๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ โ€” ์•…์˜์  ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ๋น„๋ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์œผ๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ž์› ๊ฒฉ๋ฆฌ โ€” ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฃฝ์–ด๋„ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋Š” ์‚ด์•„ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(Chrome์˜ ํƒญ๋ณ„ ํ”„๋กœ์„ธ์Šค ๋ชจ๋ธ์ด ๋Œ€ํ‘œ ์˜ˆ).

๊ฒฉ๋ฆฌ๊ฐ€ ์‚ฌ์šฉ์ž ๋ชจ๋“œ์—์„  ์ ˆ๋Œ€ ๊นจ์ง€์ง€ ์•Š์œผ๋ฏ€๋กœ, ์šฐํšŒํ•˜๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ ์ปค๋„ ๋ชจ๋“œ๋ฅผ ๊ฑฐ์ณ์•ผ ํ•˜๊ณ  ๊ทธ๊ฒŒ ์‹œ์Šคํ…œ ์ฝœ์ž…๋‹ˆ๋‹ค. ์ด๊ฒŒ IPC๊ฐ€ ํ’€์–ด์•ผ ํ•˜๋Š” ํ•ต์‹ฌ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

Q3. โ€œํŒŒ์ดํ”„์™€ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?โ€

๊ฐ€์žฅ ํฐ ์ฐจ์ด๋Š” ๋ฐ์ดํ„ฐ ์ด๋™ ๋ฐฉ์‹๊ณผ ๋น„์šฉ์ž…๋‹ˆ๋‹ค.

ํŒŒ์ดํ”„(pipe) ๋Š” ๋‹จ๋ฐฉํ–ฅ ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์œผ๋กœ, ์ปค๋„์ด ๊ด€๋ฆฌํ•˜๋Š” FIFO ๋ฒ„ํผ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๋งค ์†ก์ˆ˜์‹ ๋งˆ๋‹ค ์‹œ์Šคํ…œ ์ฝœ์ด ์ผ์–ด๋‚˜๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ์šฉ์žโ†’์ปค๋„โ†’์‚ฌ์šฉ์ž๋กœ ๋‘ ๋ฒˆ ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค. ํ•œ ํšŒ ๋น„์šฉ์€ ์ˆ˜ microsecond. ๋ฉ”์‹œ์ง€ ๊ฒฝ๊ณ„๊ฐ€ ์—†์–ด์„œ 4๋ฐ”์ดํŠธ ๋‘ ๋ฒˆ ์“ฐ๋ฉด 8๋ฐ”์ดํŠธ๋กœ ํ•œ ๋ฒˆ์— ์ฝํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ต๋ช… ํŒŒ์ดํ”„(CreatePipe/pipe)๋Š” ๋ถ€๋ชจ-์ž์‹ ํ•œ์ •์ด๊ณ , ๋ช…๋ช… ํŒŒ์ดํ”„(CreateNamedPipe/mkfifo)๋Š” ๋ฌด๊ด€ํ•œ ํ”„๋กœ์„ธ์Šค ๊ฐ„์ด๋‚˜ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ(shared memory) ๋Š” ๋‘ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ™์€ ๋ฌผ๋ฆฌ ํŽ˜์ด์ง€๋ฅผ ์ž๊ธฐ ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„์— ๋งคํ•‘ํ•ด๋‘๊ณ , ๊ทธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง์ ‘ ์ฝ๊ณ  ์“ฐ๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ์„ธํŒ…(CreateFileMapping/MapViewOfFile, shm_open/mmap)์—๋งŒ ์‹œ์Šคํ…œ ์ฝœ์ด ๋“ค๊ณ , ๊ทธ ๋’ค๋กœ๋Š” ์ผ๋ฐ˜ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ์†๋„(์ˆ˜ nanosecond)์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. 1MB ๋ฐ์ดํ„ฐ๋„ ๋ณต์‚ฌ ์—†์ด โ€œ๊ณต์œ โ€๋ฉ๋‹ˆ๋‹ค.

๋‹จ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋Š” OS๊ฐ€ ๋™๊ธฐํ™”๋ฅผ ์•ˆ ํ•ด์ฃผ๋ฏ€๋กœ race condition์„ ์ง์ ‘ ๋ง‰์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค โ€” ๋ณดํ†ต ์ด๋ฆ„ ์žˆ๋Š” MutexยทSemaphoreยทEvent์™€ ์ง์ง€์–ด ์”๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ โ€œ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋น ๋ฅด์ง€๋งŒ ์–ด๋ ต๋‹คโ€, โ€œํŒŒ์ดํ”„๋Š” ๋А๋ฆฌ์ง€๋งŒ ์•ˆ์ „ํ•˜๋‹คโ€๊ฐ€ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„์ž…๋‹ˆ๋‹ค.

Q4. โ€œ์™œ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๋น ๋ฅธ IPC๋ผ๊ณ  ํ•˜๋‚˜์š”?โ€

๋‹ค๋ฅธ IPC๋Š” ๋งค ์†ก์ˆ˜์‹ ๋งˆ๋‹ค ์‹œ์Šคํ…œ ์ฝœ + ๋ชจ๋“œ ์Šค์œ„์น˜ + ์ปค๋„ ์•ˆ ๋ฒ„ํผ ๋ณต์‚ฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ(21)์—์„œ ๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ ์‹œ์Šคํ…œ ์ฝœ ํ•˜๋‚˜๊ฐ€ 100~500 nanosecond, ๊ฑฐ๊ธฐ์— ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ ๋น„์šฉ์ด ๋ฉ”์‹œ์ง€ ํฌ๊ธฐ์— ๋น„๋ก€ํ•ด์„œ ๋ถ™์Šต๋‹ˆ๋‹ค. 1MB๋ฅผ ๋ณด๋‚ด๋ฉด ์‚ฌ์šฉ์žโ†’์ปค๋„ ๋ณต์‚ฌ + ์ปค๋„โ†’์‚ฌ์šฉ์ž ๋ณต์‚ฌ = ์ด 2MB์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ณต์‚ฌ๊ฐ€ ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค.

๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ดˆ๊ธฐ ์„ธํŒ… ํ•œ ๋ฒˆ๋งŒ ์‹œ์Šคํ…œ ์ฝœ์ด๊ณ , ๊ทธ ๋’ค๋กœ๋Š” ๋‘ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ™์€ ๋ฌผ๋ฆฌ ํŽ˜์ด์ง€๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ€์ƒ ์ฃผ์†Œ์— ๊ทธ๋ƒฅ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. 1MB๋ฅผ โ€œ์ „๋‹ฌโ€ํ•˜๋Š” ๊ฒŒ ์‚ฌ์‹ค์€ ๊ทธ ์˜์—ญ์— ์“ฐ๋Š” ๊ฒƒ์ด๋ผ ๋ณต์‚ฌ๋„ ์—†์Šต๋‹ˆ๋‹ค. ๋งค ์ ‘๊ทผ ๋น„์šฉ์ด ์ˆ˜ nanosecond โ€” ์ผ๋ฐ˜ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ์†๋„ ๊ทธ ์ž์ฒด์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ํฐ ๋ฐ์ดํ„ฐยท๊ณ ๋นˆ๋„ IPC์—์„œ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ ˆ๋Œ€์ ์œผ๋กœ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์—”์ง„์˜ ๋ Œ๋” ๋ช…๋ น ๋ฒ„ํผ, DBMS์˜ buffer pool, Chrome์˜ ํ…์Šค์ฒ˜ ๊ณต์œ  ๋ชจ๋‘ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฐ˜์ž…๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๋™๊ธฐํ™”์™€ ๋ฉ”์‹œ์ง€ ๊ฒฝ๊ณ„ ์ฒ˜๋ฆฌ๋ฅผ ์ง์ ‘ ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์„ธ๋งˆํฌ์–ดยท๋ฎคํ…์Šคยทatomic๊ณผ ๊ฑฐ์˜ ํ•ญ์ƒ ๊ฐ™์ด ์”๋‹ˆ๋‹ค.

Q5. โ€œ๋ฉ”์‹œ์ง€ ํ์™€ ํŒŒ์ดํ”„์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?โ€

๊ฐ€์žฅ ํฐ ์ฐจ์ด๋Š” ๋ฉ”์‹œ์ง€ ๊ฒฝ๊ณ„(message boundary) ๊ฐ€ ๋ณด์กด๋˜๋А๋ƒ์ž…๋‹ˆ๋‹ค.

ํŒŒ์ดํ”„๋Š” ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์ด๋ผ ์†ก์‹ ์ž๊ฐ€ 4๋ฐ”์ดํŠธ, 8๋ฐ”์ดํŠธ๋ฅผ ์ฐจ๋ก€๋กœ ์จ๋„ ์ˆ˜์‹ ์ž๊ฐ€ 12๋ฐ”์ดํŠธ๋กœ ํ•œ ๋ฒˆ์— ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€ ๋‹จ์œ„ ๊ตฌ๋ถ„์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ํ—ค๋”์— ๊ธธ์ด ์ •๋ณด).

๋ฉ”์‹œ์ง€ ํ๋Š” ๊ฐ ๋ฉ”์‹œ์ง€๋ฅผ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ํ์— ๋„ฃ๊ณ , ์ˆ˜์‹ ์ž๊ฐ€ ํ•œ ๋ฒˆ์— ํ•œ ๋ฉ”์‹œ์ง€์”ฉ ๋ฐ›์Šต๋‹ˆ๋‹ค. 4๋ฐ”์ดํŠธ + 8๋ฐ”์ดํŠธ๋กœ ๋ณด๋‚ธ ๋‘ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐ›๋Š” ์ชฝ์—์„œ๋„ 4๋ฐ”์ดํŠธ, 8๋ฐ”์ดํŠธ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์˜ต๋‹ˆ๋‹ค.

POSIX ๋ฉ”์‹œ์ง€ ํ(mq_open/mq_send/mq_receive)๋Š” ์ถ”๊ฐ€๋กœ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ง€์›ํ•ด ์šฐ์„ ์ˆœ์œ„ ๋†’์€ ๋ฉ”์‹œ์ง€๊ฐ€ ๋จผ์ € ๋น ์ง‘๋‹ˆ๋‹ค. Windows์—์„  GUI ์Šค๋ ˆ๋“œ ๋ฉ”์‹œ์ง€ ํ(PostMessage/SendMessage)์™€ Mailslot์ด ๋ฉ”์‹œ์ง€ ํ ์—ญํ• ์„ ํ•˜๋Š”๋ฐ, Mailslot์€ ๋‹จ๋ฐฉํ–ฅ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ๋ผ ์‹ ๋ขฐ์„ฑ์ด ์—†๊ณ  PostMessage๋Š” ๊ฐ™์€ ๋ฐ์Šคํฌํ†ฑยท๊ฐ™์€ ๋จธ์‹  GUI ํ•œ์ •์ด๋ผ๋Š” ์ œ์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”์‹œ์ง€ ํ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ์ž‘๊ณ  ๊ฒฝ๊ณ„๊ฐ€ ์ค‘์š”ํ•œ ๋ช…๋ น ์ „๋‹ฌ์— ์ ํ•ฉํ•˜๊ณ , ํฐ ์ŠคํŠธ๋ฆผ ๋ฐ์ดํ„ฐ(ํŒŒ์ผ ์ „์†ก ๋“ฑ)๋Š” ํŒŒ์ดํ”„๋‚˜ ์†Œ์ผ“์ด ๋” ์ž์—ฐ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

Q6. โ€œWindows์—์„œ ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค์— ์“ธ ๋™๊ธฐํ™” ๊ฐ์ฒด์™€ IPC์— ์“ธ ๋™๊ธฐํ™” ๊ฐ์ฒด์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋‚˜์š”?โ€

์ด๋ฆ„์„ ๋ถ€์—ฌํ•˜๋А๋ƒ์™€ ์–ด๋А ๊ฐ์ฒด๋ฅผ ๊ณ ๋ฅด๋А๋ƒ๊ฐ€ ํ•ต์‹ฌ ์ฐจ์ด์ž…๋‹ˆ๋‹ค. ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ(21)์—์„œ ๋ณธ ๋™๊ธฐํ™” ๊ฐ์ฒด๋“ค์„ IPC๋กœ ํ™•์žฅํ•˜๋ ค๋ฉด:

๊ฐ™์€ ํ”„๋กœ์„ธ์Šค ๋‚ด ํ•œ์ • โ€” Critical Section, SRWLock, Condition Variable, std::mutex(SRWLock ๊ธฐ๋ฐ˜). ์ด๋“ค์€ ์‚ฌ์šฉ์ž ๋ชจ๋“œ ์šฐ์„  ๊ฐ์ฒด๋กœ ๋ฌด๊ฒฝํ•ฉ ์‹œ ๋น ๋ฅด์ง€๋งŒ(50~100 ns) ์‚ฌ์šฉ์ž ๋ฉ”๋ชจ๋ฆฌ์— ์นด์šดํ„ฐ๋ฅผ ๋‘๋ฏ€๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ชป ๋ด…๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๊ณต์œ  ๊ฐ€๋Šฅ โ€” Mutex(์ปค๋„ ๊ฐ์ฒด), Semaphore, Event. ์ด๋ฆ„(Global\\MyMutex)์„ ์ฃผ๊ณ  CreateMutex/OpenMutex๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—์„œ๋„ ๊ฐ™์€ ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ ๋ฌด๊ฒฝํ•ฉ์ด๋ผ๋„ ํ•ญ์ƒ ์ปค๋„ ์ง„์ž…์ด๋ผ 1~3 ฮผs๋กœ SRWLock์˜ 20~50๋ฐฐ ๋น„์Œ‰๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค ์•ˆ์—์„  SRWLock/std::mutex๊ฐ€ ๋‹ต์ด๊ณ , ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๊ณต์œ ๊ฐ€ ์ง„์งœ ํ•„์š”ํ•  ๋•Œ๋งŒ Named Mutex/Event/Semaphore๋ฅผ ์”๋‹ˆ๋‹ค. POSIX๋Š” ์•ฝ๊ฐ„ ๋‹ค๋ฅด๊ฒŒ โ€” pthread_mutex๋ฅผ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์— ๋†“๊ณ  PTHREAD_PROCESS_SHARED ์†์„ฑ์„ ์ค˜์„œ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

์ „ํ˜•์  ํŒจํ„ด์ด โ€œ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ + Named Mutex/Event/Semaphoreโ€ ์กฐํ•ฉ์œผ๋กœ, ๋ฐ์ดํ„ฐ๋Š” ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋น ๋ฅด๊ฒŒ, ๋™๊ธฐํ™”๋Š” ์ปค๋„ ๊ฐ์ฒด๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ๋ถ„์—…ํ•ฉ๋‹ˆ๋‹ค.

Q7. โ€œWindows์—๋Š” POSIX ์‹œ๊ทธ๋„ ๊ฐ™์€ ๊ฒŒ ์žˆ๋‚˜์š”?โ€

์ง์ ‘ ๋Œ€์‘์€ ์—†์Šต๋‹ˆ๋‹ค. Windows๋Š” POSIX์˜ ๋น„๋™๊ธฐ ์‹œ๊ทธ๋„ ๋ชจ๋ธ์„ ํ‘œ์ค€์œผ๋กœ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ํ‘œ์ค€ C ์‹œ๊ทธ๋„(SIGINT, SIGTERM)์€ ํ‰๋‚ด๋‚ด์ง€๋งŒ ํ•œ์ •์ ์ด๊ณ , ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ์˜ ๋น„๋™๊ธฐยท์žฌ์ง„์ž… ์˜๋ฏธ๋„ ์ •ํ™•ํžˆ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋Œ€์‹  Windows์—์„  Event ๊ฐ์ฒด + WaitForSingleObject ๊ฐ€ ๊ฐ™์€ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ทธ๋„์„ ๋ณด๋‚ด๋Š” ์ธก์ด SetEvent(hEvent)๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, ๋Œ€๊ธฐ ์ค‘์ธ ์Šค๋ ˆ๋“œ๊ฐ€ WaitForSingleObject์—์„œ ๊นจ์–ด๋‚˜ ํ•ธ๋“ค๋Ÿฌ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ฐจ์ด๋Š” ์‹œ๊ทธ๋„์ด ๋น„๋™๊ธฐ ์ธํ„ฐ๋ŸฝํŠธ๋กœ ๋ผ์–ด๋“œ๋Š” ๋ฐ ๋น„ํ•ด Event๋Š” ๋ช…์‹œ์ ์œผ๋กœ ๋Œ€๊ธฐ ์ค‘์ธ ์Šค๋ ˆ๋“œ๋งŒ ๊นฌ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค โ€” ๊ทธ๋ž˜์„œ async-signal-safe ๊ฐ™์€ ์ œ์•ฝ์ด ์—†๊ณ  ๋” ๋‹ค๋ฃจ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

์ฝ˜์†” ์•ฑ์˜ Ctrl+C๋Š” SetConsoleCtrlHandler(CTRL_C_EVENT)๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค. Access violation ๊ฐ™์€ ํ•˜๋“œ์›จ์–ด ์˜ˆ์™ธ๋Š” SEH(__try/__except) ๋˜๋Š” Vectored Exception Handler๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ž์‹ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ(SIGCHLD)๋Š” WaitForSingleObject(hProcess, INFINITE)๋กœ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ Windows๋กœ ํฌํŒ…ํ•  ๋•Œ POSIX ์‹œ๊ทธ๋„ ํŒจํ„ด์„ ๊ทธ๋Œ€๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์—†๊ณ , ์ด๋ฒคํŠธ ๊ฐ์ฒด ๊ธฐ๋ฐ˜์˜ ํ†ต์ง€ ๋ชจ๋ธ๋กœ ๋‹ค์‹œ ์„ค๊ณ„ํ•˜๋Š” ๊ฒŒ ํ‘œ์ค€ ์ ‘๊ทผ์ž…๋‹ˆ๋‹ค.

Q8. โ€œ๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ๊ณผ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€์š”?โ€

API๊ฐ€ ๊ฑฐ์˜ ๊ฐ™๊ณ , ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ€์ƒ๋งŒ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

Windows์˜ CreateFileMapping์€ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ํŒŒ์ผ ํ•ธ๋“ค์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. INVALID_HANDLE_VALUE๋ฅผ ์ฃผ๋ฉด ํŽ˜์ด์ง• ํŒŒ์ผ ๊ธฐ๋ฐ˜์˜ ์ต๋ช… ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ(์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ™์€ ๋งคํ•‘ ๊ฐ์ฒด๋ฅผ ์ด๋ฆ„์œผ๋กœ ์ฐพ์•„ ๊ณต์œ ), ์‹ค์ œ ํŒŒ์ผ ํ•ธ๋“ค์„ ์ฃผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ(๊ทธ ํŒŒ์ผ์˜ ๋‚ด์šฉ์ด ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋ณด์ž„)์ด ๋ฉ๋‹ˆ๋‹ค. POSIX๋„ shm_open + mmap์ด ์ต๋ช… ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ, open + mmap์ด ๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ๋กœ ํŒจํ„ด์ด ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฐจ์ด๋Š” ์˜์†์„ฑ๊ณผ ํŽ˜์ด์ง€ ์บ์‹œ ๊ณต์œ ์ž…๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ์€ ์‹ค์ œ ํŒŒ์ผ๊ณผ ์ž๋™ ๋™๊ธฐํ™”๋˜๋ฏ€๋กœ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฃฝ์–ด๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ๋””์Šคํฌ์— ๋‚จ๊ณ , OS์˜ ํŽ˜์ด์ง€ ์บ์‹œ(page cache)๋ฅผ ํ™œ์šฉํ•ด์„œ ๊ฐ™์€ ํŒŒ์ผ์„ ๋งคํ•‘ํ•œ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž๋™์œผ๋กœ ๊ฐ™์€ RAM ํŽ˜์ด์ง€๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋Š” ํŽ˜์ด์ง• ํŒŒ์ผ ๊ธฐ๋ฐ˜์ด๋ผ ์˜์†์„ฑ์ด ์—†๊ณ  ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹ซ์œผ๋ฉด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์˜์†ํ™”ํ•˜๋ฉด์„œ IPC๋กœ๋„ ์“ฐ๊ณ  ์‹ถ์„ ๋•Œ(์˜ˆ: DB์˜ ๋ฐ์ดํ„ฐ ํŒŒ์ผ, ๊ฒŒ์ž„์˜ ์• ์…‹ ํŒจํ‚ค์ง€), ๊ทธ๋ฆฌ๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ(page fault ๊ธฐ๋ฐ˜ lazy loading)๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ์ด ์ž์—ฐ์Šค๋Ÿฝ๊ณ , ์ˆœ์ˆ˜ IPC๋กœ๋งŒ ์“ธ ๋•Œ๋Š” ์ต๋ช… ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค.

Q9. โ€œRPC์™€ ์ผ๋ฐ˜ IPC์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ด๊ณ  ๋น„์šฉ์€ ์™œ ๋น„์‹ผ๊ฐ€์š”?โ€

RPC(Remote Procedure Call)๋Š” IPC๋ฅผ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ฒ˜๋Ÿผ ์ถ”์ƒํ™”ํ•œ ๊ณ ์ˆ˜์ค€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ Add(2, 3) ๊ฐ™์€ ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ•˜๋ฉด, ๊ทธ ํ˜ธ์ถœ์ด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค(๋˜๋Š” ๋‹ค๋ฅธ ๋จธ์‹ )์—์„œ ์‹คํ–‰๋˜๊ณ  ๊ฒฐ๊ณผ๊ฐ€ ๋Œ์•„์˜ต๋‹ˆ๋‹ค. Windows์˜ MS-RPC, COM์˜ out-of-proc, gRPCยทThriftยทCapโ€™n Proto ๊ฐ™์€ ํฌ๋กœ์Šคํ”Œ๋žซํผ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋ชจ๋‘ ์ด ํŒจ๋Ÿฌ๋‹ค์ž„์ž…๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๊ธฐ์ˆ ์ด marshalling์ž…๋‹ˆ๋‹ค. IDL(Interface Definition Language)๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๋ฉด midl์ด๋‚˜ protoc ๊ฐ™์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ stub ์ฝ”๋“œ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•˜๊ณ , stub์ด ํ•จ์ˆ˜ ์ธ์ž๋ฅผ ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ง๋ ฌํ™”ํ•ด IPC ์ฑ„๋„(๋ณดํ†ต ๋ช…๋ช… ํŒŒ์ดํ”„๋‚˜ ์†Œ์ผ“)๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€ํŽธ stub์ด ์—ญ์ง๋ ฌํ™”ํ•ด์„œ ์‹ค์ œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๊ฐ™์€ ๊ฒฝ๋กœ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

๋น„์šฉ์ด ๋น„์‹ผ ์ด์œ ๊ฐ€ ์ด marshalling/unmarshalling + IPC ์ฑ„๋„ ๋น„์šฉ + ๋‘ ๋ฒˆ์˜ ์ปจํ…์ŠคํŠธ ์Šค์œ„์น˜ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•œ ํ˜ธ์ถœ์— ์ˆ˜์‹ญ~์ˆ˜๋ฐฑ ฮผs ๊ฑธ๋ฆฌ๋Š”๋ฐ, ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ํ•œ ์ค„ ์ ‘๊ทผ(์ˆ˜ ns)์˜ 1000~10000๋ฐฐ์ž…๋‹ˆ๋‹ค.

๋Œ€์‹  ๊ฐ€์น˜๋Š” ์ถ”์ƒํ™” ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ IPC๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋‹ค๋ฃจ์ง€ ์•Š๊ณ , ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์ •์˜ํ•˜๋ฉด ๋๋‚ฉ๋‹ˆ๋‹ค. ์œ„์น˜ ํˆฌ๋ช…์„ฑ(ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๊ฐ€ ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค์ธ์ง€ ๋‹ค๋ฅธ ๋จธ์‹ ์ธ์ง€ ๋ชฐ๋ผ๋„ ๋จ)๋„ ์–ป์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ˜ธ์ถœ ๋นˆ๋„๊ฐ€ ๋‚ฎ๊ณ  ์ถ”์ƒํ™”๊ฐ€ ์ค‘์š”ํ•œ ๊ณณ(Windows Shell ํ™•์žฅ, COM ๊ฐ์ฒด ๋ชจ๋ธ, ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค)์— ์ ํ•ฉํ•˜๊ณ , ๊ณ ๋นˆ๋„ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์—๋Š” ๋ถ€์ ํ•ฉ์ž…๋‹ˆ๋‹ค.

Q10. โ€œChrome ๊ฐ™์€ ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค ์•ฑ์ด IPC๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋‚˜์š”?โ€

Chrome์€ ๋ณด์•ˆ๊ณผ ์•ˆ์ •์„ฑ์„ ์œ„ํ•ด ํƒญ๋งˆ๋‹ค ๋ณ„๋„ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋„์šฐ๋Š” ์‚ฌ์ดํŠธ ๊ฒฉ๋ฆฌ(site isolation) ๋ชจ๋ธ์„ ์ฑ„ํƒํ–ˆ๊ณ , ๊ทธ ๋น„์šฉ์„ IPC๋กœ ๊ฐ์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ IPC ์‚ฌ์šฉ๋Ÿ‰์ด ์–ด๋งˆ์–ด๋งˆํ•˜๊ณ , ๊ฐ ํ†ต์‹ ์˜ ํŠน์„ฑ์— ๋งž์ถฐ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋‹ค๋ฅด๊ฒŒ ์”๋‹ˆ๋‹ค.

ํฐ ๊ทธ๋ฆผ์œผ๋กœ ๋ณด๋ฉด:

  • ๋ธŒ๋ผ์šฐ์ € ๋ฉ”์ธ โ†” ๋ Œ๋”๋Ÿฌ (์ œ์–ด ์‹ ํ˜ธ) โ€” ๋ฉ”์‹œ์ง€ ํŒจ์‹ฑ(Mojo IPC ํ”„๋ ˆ์ž„์›Œํฌ, ๋‚ด๋ถ€์ ์œผ๋กœ ๋ช…๋ช… ํŒŒ์ดํ”„ ๋˜๋Š” UNIX socket). ๊ฒฉ๋ฆฌ๊ฐ€ ๊ฐ•ํ•˜๊ณ  ์ž…๋ ฅ ๊ฒ€์ฆ์ด ์—„๊ฒฉํ•ฉ๋‹ˆ๋‹ค. ๋ Œ๋”๋Ÿฌ๋Š” Low Integrity Level๋กœ ์ƒŒ๋“œ๋ฐ•์Šค ์•ˆ์— ๊ฐ‡ํ˜€ ์žˆ์–ด์„œ ๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค์˜ ์ž์›์„ ์ง์ ‘ ๋ชป ๋งŒ์ง‘๋‹ˆ๋‹ค.
  • ๋ Œ๋”๋Ÿฌ โ†” GPU ํ”„๋กœ์„ธ์Šค (ํ…์Šค์ฒ˜ยท๋ Œ๋” ๋ช…๋ น) โ€” ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ. ๋งค ํ”„๋ ˆ์ž„ GB ๋‹จ์œ„๋กœ ํ…์Šค์ฒ˜๋ฅผ ์ฃผ๊ณ ๋ฐ›์œผ๋‹ˆ ๋ณต์‚ฌ๋ฅผ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋™๊ธฐํ™”๋Š” ์„ธ๋งˆํฌ์–ด์™€ fence ๊ฐ์ฒด.
  • ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค โ†” ๋ฉ”์ธ (์ข…๋ฃŒยท์„ค์ •) โ€” Event ๊ฐ์ฒด ๋˜๋Š” Mojo ๋ฉ”์‹œ์ง€.

ํ•ต์‹ฌ ์›์น™์ด ์‹ ๋ขฐ ๊ฒฝ๊ณ„์™€ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ์— ๋”ฐ๋ผ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์„ ํƒ์ž…๋‹ˆ๋‹ค. ์‹ ๋ขฐ๊ฐ€ ๋‚ฎ์œผ๋ฉด ๋ฉ”์‹œ์ง€ ํŒจ์‹ฑ(๊ฒฉ๋ฆฌ ๊ฐ•ํ•จ), ๊ฐ™์€ ํŒ€ ์ฝ”๋“œ๋ผ๋ฆฌ ํฐ ๋ฐ์ดํ„ฐ๋Š” ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ(๋น ๋ฆ„). ์ด๊ฒŒ IPC ์˜์‚ฌ๊ฒฐ์ •์˜ ์ผ๋ฐ˜ ์›์น™์ด๊ณ , ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ(21)์—์„œ ๋ณธ ๋™๊ธฐํ™” ๊ฐ์ฒด ์„ ํƒ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

์–ธ๋ฆฌ์–ผ ์—”์ง„๋„ ๋น„์Šทํ•œ ํŒจํ„ด์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๋นŒ๋“œ ๋„๊ตฌ(UBT) ๊ฐ™์€ ๋ช…๋ น ํ†ต์‹ ์€ ํŒŒ์ดํ”„ + stdout ์บก์ฒ˜, ์…ฐ์ด๋” ์ปดํŒŒ์ผ ์›Œ์ปค์ฒ˜๋Ÿผ ๋‹ค์ˆ˜ ์›Œ์ปค์™€์˜ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์€ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ + ์ž„์‹œ ํŒŒ์ผ, ๋ผ์ดํŒ… ๋นŒ๋“œ ๋ถ„์‚ฐ์ฒ˜๋Ÿผ ๋„คํŠธ์›Œํฌ ๋ถ„์‚ฐ์€ TCP ์†Œ์ผ“ โ€” ๊ฐ๊ฐ์˜ ์ž๋ฆฌ์— ๋งž๋Š” IPC๋ฅผ ๊ณ ๋ฆ…๋‹ˆ๋‹ค.


17. ํ•ต์‹ฌ ์š”์•ฝ ์นด๋“œ (์žฌ๊ฒŒ์žฌ)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
IPC = OS์˜ ์ฃผ์†Œ ๊ณต๊ฐ„ ๊ฒฉ๋ฆฌ๋ฅผ ๊นจ์ง€ ์•Š์œผ๋ฉด์„œ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๋ฐ์ดํ„ฐยท์‹ ํ˜ธ๋ฅผ ๊ตํ™˜ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜.
      ๊ฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž๊ธฐ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” โ†’ ๊ฐ€์ƒ ์ฃผ์†Œ๊ฐ€ ๋‹ฌ๋ผ โ†’ ๋ฐ˜๋“œ์‹œ ์ปค๋„์ด ์ค‘์žฌ.

๋ถ„๋ฅ˜์ถ• 3๊ฐœ:
  โ‘  ๋ฐ์ดํ„ฐ vs ์‹ ํ˜ธ       โ€” pipeยทshmยทsocket / signalยทeventยทsemaphore
  โ‘ก ์ปค๋„ ๊ฒฝ์œ  vs ์‚ฌ์šฉ์ž  โ€” ๋งค๋ฒˆ syscall / ์ดˆ๊ธฐ 1ํšŒ๋งŒ (shared memory)
  โ‘ข ๋กœ์ปฌ vs ๋„คํŠธ์›Œํฌ     โ€” anonymous pipeยทshm / named pipeยทsocketยทRPC

๋ฉ”์ปค๋‹ˆ์ฆ˜ (๋น ๋ฆ„ โ†’ ๋А๋ฆผ):
  ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ             โ€” CreateFileMapping/MapViewOfFile, shm_open+mmap
                            ๊ฐ€์žฅ ๋น ๋ฆ„(์ˆ˜ ns), ๋™๊ธฐํ™” ์ง์ ‘ ์ฒ˜๋ฆฌ (Mutex+Sem+Event์™€ ์ง)
  ๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ          โ€” ๋””์Šคํฌ ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ๋กœ (page cache ๊ณต์œ )
  ํŒŒ์ดํ”„                  โ€” ๋‹จ๋ฐฉํ–ฅ ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ
                            ์ต๋ช…: ๋ถ€๋ชจ-์ž์‹๋งŒ / ๋ช…๋ช…: ๋ฌด๊ด€ยท๋„คํŠธ์›Œํฌ ๊ฐ€๋Šฅ (SMB)
  ๋ฉ”์‹œ์ง€ ํ               โ€” ๋ฉ”์‹œ์ง€ ๊ฒฝ๊ณ„ ๋ณด์กด
                            POSIX mq (์šฐ์„ ์ˆœ์œ„), Windows PostMessageยทMailslot
  Mutex/Sem/Event (Named) โ€” ๋™๊ธฐํ™” ์‹ ํ˜ธ, ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๊ณต์œ  (Wait ์‹œ ์ปค๋„)
  ์‹œ๊ทธ๋„ (POSIX)          โ€” ๋น„๋™๊ธฐ ์•Œ๋ฆผ, async-signal-safe ์ œ์•ฝ
                            Windows: Event + WaitForSingleObject๋กœ ๋Œ€์‘
  ์†Œ์ผ“                    โ€” ๊ฐ€์žฅ ๋ฒ”์šฉ
                            UNIX domain (๋กœ์ปฌ, ๋น ๋ฆ„) / TCP/UDP (๋„คํŠธ์›Œํฌ)
  RPC / COM               โ€” ํ•จ์ˆ˜ ํ˜ธ์ถœ์ฒ˜๋Ÿผ, marshalling ๋น„์šฉ ํผ

๋น„์šฉ ์ŠคํŽ™ํŠธ๋Ÿผ (๋‚ฎ์Œ โ†’ ๋†’์Œ):
  ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ            ์ˆ˜ ns
  Mutex/Event signal+wait     1~3 ฮผs
  Anonymous Pipe              ์ˆ˜ ฮผs
  Named Pipe (loopback)       ์ˆ˜ ฮผs
  UNIX domain socket          ์ˆ˜ ฮผs
  TCP loopback                5~30 ฮผs
  PostMessage                 ์ˆ˜ ฮผs
  Mailslot                    ์ˆ˜์‹ญ ฮผs
  MS-RPC (LRPC)               ์ˆ˜์‹ญ ฮผs
  MS-RPC (TCP)                ์ˆ˜์‹ญ~์ˆ˜๋ฐฑ ฮผs
  COM out-of-proc             ์ˆ˜์‹ญ~์ˆ˜๋ฐฑ ฮผs
  DCOM (๋„คํŠธ์›Œํฌ)             ์ˆ˜๋ฐฑ ฮผs~์ˆ˜ ms

์„ ํƒ ๊ธฐ์ค€:
  ํฐ ๋ฐ์ดํ„ฐยท๊ณ ๋นˆ๋„        โ†’ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ + Named ๋™๊ธฐํ™” ๊ฐ์ฒด
  ๋ฉ”์‹œ์ง€ ๊ฒฝ๊ณ„ ํ•„์š”        โ†’ ๋ฉ”์‹œ์ง€ ํ / Mailslot / UDP
  ๋„คํŠธ์›Œํฌ ํ™•์žฅ ๊ฐ€๋Šฅ์„ฑ    โ†’ ์†Œ์ผ“ / ๋ช…๋ช… ํŒŒ์ดํ”„
  ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ถ”์ƒํ™”        โ†’ RPC / COM
  ๋‹จ์ˆœ ์‹ ํ˜ธ               โ†’ Event / ์‹œ๊ทธ๋„
  ์‹ ๋ขฐ ๊ฒฝ๊ณ„ ๊ฐ•ํ•จ          โ†’ ๋ฉ”์‹œ์ง€ ํŒจ์‹ฑยท์†Œ์ผ“ยทRPC (๊ฒฉ๋ฆฌ ๊ฐ•)
  ์‹ ๋ขฐ ๊ฒฝ๊ณ„ ์•ฝํ•จ          โ†’ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ (์†๋„ ์šฐ์„ )

ํŠธ๋ ˆ์ด๋“œ์˜คํ”„:
  ์†๋„        โ†” ๋™๊ธฐํ™” ๋ณต์žก๋„
  ๊ฒฉ๋ฆฌยท์•ˆ์ „์„ฑ โ†” ์ถ”์ƒํ™” ์ˆ˜์ค€
  ๊ฐ™์€ ๋จธ์‹    โ†” ๋„คํŠธ์›Œํฌ ํ™•์žฅ

Windows ํ•ต์‹ฌ API:
  ํŒŒ์ดํ”„            CreatePipe / CreateNamedPipe(\\.\pipe\name)
  ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ       CreateFileMapping(INVALID_HANDLE_VALUE) + MapViewOfFile
  ๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ    CreateFileMapping(real file handle) + MapViewOfFile
  ๋™๊ธฐํ™” ๊ฐ์ฒด       CreateMutex / CreateSemaphore / CreateEvent (์ด๋ฆ„ ๋ถ€์—ฌ)
  ๋Œ€๊ธฐ              WaitForSingleObject / WaitForMultipleObjects
  ๋ฉ”์‹œ์ง€            PostMessage / SendMessage / WM_COPYDATA / Mailslot
  ์†Œ์ผ“              socket / Winsock (AF_INET, AF_UNIX) + IOCP
  RPC               midl IDL โ†’ RpcServerListen / ์ž๋™ stub
  COM               CoCreateInstance + CLSCTX_LOCAL_SERVER

์–ธ๋ฆฌ์–ผ ๋งคํ•‘:
  ์ž์‹ ํ”„๋กœ์„ธ์Šค         FPlatformProcess::CreateProc
  ์ต๋ช… ํŒŒ์ดํ”„           FPlatformProcess::CreatePipe (stdout ์บก์ฒ˜)
  ๋ชจ๋“ˆ ๊ฐ„ ๋ฉ”์‹œ์ง€        IMessageBus (in-proc) / UDP Messaging (๋ถ„์‚ฐ)
  Live Coding           ๋ช…๋ช… ํŒŒ์ดํ”„
  ์…ฐ์ด๋” ์ปดํŒŒ์ผ ์›Œ์ปค     ๋ช…๋ช… ํŒŒ์ดํ”„ + ์ž„์‹œ ํŒŒ์ผ
  ๋ผ์ดํŒ… ๋นŒ๋“œ ๋ถ„์‚ฐ       TCP ์†Œ์ผ“ (Swarm)
  Lightmass            ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ (๋Œ€์šฉ๋Ÿ‰ ๋ฉ”์‹œ ๋ฐ์ดํ„ฐ)

๋ณด์•ˆ:
  ACL                   Named ๊ฐ์ฒด์— SECURITY_DESCRIPTOR
  Integrity Level       Low IL ํ”„๋กœ์„ธ์Šค๋Š” High IL ๊ฐ์ฒด ์ ‘๊ทผ ์ œํ•œ
  ์ž…๋ ฅ ๊ฒ€์ฆ              IPC๋Š” ์‹ ๋ขฐ ๊ฒฝ๊ณ„ โ†’ ๋ชจ๋“  ์ž…๋ ฅ ๊ฒ€์ฆ

๊ธฐ์–ตํ•  ํ•œ ์ค„:
  "IPC ์„ ํƒ = ๋นˆ๋„ยทํฌ๊ธฐยท๊ฒฉ๋ฆฌ์˜ ์˜์‚ฌ๊ฒฐ์ •. ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ OS๊ฐ€ ์ฃผ์ง€๋งŒ ๋น„์šฉ์€ ์—”์ง€๋‹ˆ์–ด๋ง."

18. ํšŒ๊ท€ ๋‹ค๋ฆฌ โ€” ๋‹ค๋ฅธ CS ํŒŒ์ผ ์—ฐ๊ฒฐ

ํŒŒ์ผ์—ฐ๊ฒฐ ์ง€์ 
01_runtime๋ฉ”๋ชจ๋ฆฌ 4์˜์—ญ(Code/Data/Heap/Stack) โ€” ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋‘ ํ”„๋กœ์„ธ์Šค์˜ ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„(Stack์€ ๋ถ„๋ฆฌ, ๊ณต์œ  ์˜์—ญ๋งŒ ๋งคํ•‘)์— ๋™์‹œ ๋งคํ•‘๋˜๋Š” ํŠน์ˆ˜ ์˜์—ญ. ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” ๋งคํ•‘ ๋ณ€๊ฒฝ์ด ๋ณธ์งˆ
03_new_vs_mallocํž™์€ ํ”„๋กœ์„ธ์Šค๋ณ„๋กœ ๋…๋ฆฝ โ€” ํ•œ ํ”„๋กœ์„ธ์Šค์˜ new๋กœ ์žก์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ ‘๊ทผ ๋ชป ํ•จ. IPC๊ฐ€ ๊ทธ ๊ฒฉ๋ฆฌ๋ฅผ ์šฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•
09_rtti_raiistd::lock_guard/std::unique_lock ๊ฐ™์€ RAII๊ฐ€ Named Mutex์—๋„ ๊ทธ๋Œ€๋กœ ์ ์šฉ โ€” ์ปจํ…์ŠคํŠธ ์Šค์œ„์น˜ ํ›„ unlock ๋ˆ„๋ฝ ๋ฐฉ์ง€ (Windows์—์„  CHandle ๋ž˜ํผ ๊ถŒ์žฅ)
11_smart_pointer๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์—์„œ raw pointer ๊นจ์ง โ€” ๋งคํ•‘ ์ฃผ์†Œ ์ฐจ์ด๋กœ P1์˜ ํฌ์ธํ„ฐ๊ฐ€ P2์—์„  ๋ฌด์˜๋ฏธ. shared_ptr ๊ฐ™์€ ์ถ”์ƒํ™”๋„ IPC ๊ฒฝ๊ณ„์—์„  ๋™์ž‘ ์•ˆ ํ•จ (์ œ์–ด ๋ธ”๋ก์ด ํ•œ ํ”„๋กœ์„ธ์Šค ์ฃผ์†Œ์— ์žˆ์Œ)
16_stl_containersSTL ์ปจํ…Œ์ด๋„ˆ๋Š” ํ•œ ํ”„๋กœ์„ธ์Šค ํ•œ์ • โ€” ํฌ์ธํ„ฐยทiterator ๊ธฐ๋ฐ˜์ด๋ผ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์— ๋„ฃ์–ด๋„ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—์„œ ๋ชป ์”€. boost::interprocess ๊ฐ™์€ IPC ์นœํ™” ์ปจํ…Œ์ด๋„ˆ ํ•„์š”
19_process_vs_threadIPC๊ฐ€ ํ”„๋กœ์„ธ์Šค vs ์Šค๋ ˆ๋“œ(19)์˜ ์ง์ ‘ ํšŒ๊ท€ โ€” โ€œ์Šค๋ ˆ๋“œ๋Š” ๊ณต์œ , ํ”„๋กœ์„ธ์Šค๋Š” ๊ฒฉ๋ฆฌโ€์˜ ๊ฒฉ๋ฆฌ ์ชฝ์„ IPC๊ฐ€ ํ’€์–ด์คŒ. PCBยทํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”ยทํ•ธ๋“ค ํ…Œ์ด๋ธ”์ด IPC ๋น„์šฉ์˜ ์ถœ๋ฐœ์ 
20_stack_overflowํ”„๋กœ์„ธ์Šค๋ณ„ ๋…๋ฆฝ ์Šคํƒ โ€” IPC ๋ฉ”์‹œ์ง€๊ฐ€ ๋„ˆ๋ฌด ํฌ๋ฉด ์ˆ˜์‹ ์ธก ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ ์œ„ํ—˜. ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋Š” ์Šคํƒ๊ณผ ๋ณ„๊ฐœ์˜ ๋งคํ•‘์ด๋ผ ์Šคํƒ ๋น„๋ก€ ์•ˆ ํ•จ
21_context_switchingIPC ๋น„์šฉ ํ•ต์‹ฌ ์š”์†Œ โ€” ๋งค ์†ก์ˆ˜์‹  = ๋ชจ๋“œ ์Šค์œ„์น˜ + (๋ธ”๋กœํ‚น IPC๋ฉด) ์ปจํ…์ŠคํŠธ ์Šค์œ„์น˜. ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ(21)์˜ ๋น„์šฉ ์ŠคํŽ™ํŠธ๋Ÿผ์ด ๊ทธ๋Œ€๋กœ ์ ์šฉ. ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋น ๋ฅธ ์ด์œ ๊ฐ€ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ(21)์˜ โ€œ์‚ฌ์šฉ์ž ๋ชจ๋“œ์—์„œ ๋๋‚˜๋ฉด ์ปจํ…์ŠคํŠธ ์Šค์œ„์น˜ ์—†์Œโ€๊ณผ ๊ฐ™์€ ์›๋ฆฌ
์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

ยฉ GoldBoll. ์ผ๋ถ€ ๊ถŒ๋ฆฌ ๋ณด์œ 

Powered by Jekyll with Chirpy theme

์ธ๊ธฐ ํƒœ๊ทธ