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/SendMessage | Windows GUI ์ค๋ ๋ ๋ฉ์์ง ํ์ ๋ฉ์์ง ์ ์ก. ๊ฐ์ ๋ฐ์คํฌํฑยท๊ฐ์ ๋จธ์ ํ์ |
| ย | Mailslot | Windows์ ์ ๋ขฐ์ฑ ์๋ ๋จ๋ฐฉํฅ ๋ธ๋ก๋์บ์คํธ(์์ ๋ฉ์์ง, ๊ฐ์ ๋๋ฉ์ธ). \\.\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/ResetEvent | Event ๊ฐ์ฒด ์ํ ์ ์ด |
| ์๊ทธ๋ | ์๊ทธ๋ (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 ์ฐํ |
| ย | Winsock | Windows์ BSD socket ๊ตฌํ. WSAStartup/socket/bind/listen |
| RPC/COM | RPC (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 COM | COM ์๋ฒ๊ฐ ๋ค๋ฅธ ํ๋ก์ธ์ค(๋๋ ๋ค๋ฅธ ๋จธ์ )์ ์๋ ๊ฒฝ์ฐ โ ๋ด๋ถ์ ์ผ๋ก 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 ๊ธฐ๋ฐ) |
๋ชฉ์ฐจ
- ํต์ฌ ์์ฝ ์นด๋
- ํ ์ค ์ ์ โ IPC๋ ๋ฌด์์ด๊ณ ์ ํ์ํ๊ฐ
- ๋ถ๋ฅ์ถ 3๊ฐ์ง โ ๋ฐ์ดํฐ/์ ํธยท์ปค๋ ๊ฒฝ์ /์ฌ์ฉ์ยท๋ก์ปฌ/๋คํธ์ํฌ
- ํ์ดํ โ ์ต๋ช ํ์ดํ์ ๋ช ๋ช ํ์ดํ
- ๋ฉ์์ง ํ โ POSIX
mqยทWindowsPostMessageยทMailslot - ๊ณต์ ๋ฉ๋ชจ๋ฆฌ โ ๊ฐ์ฅ ๋น ๋ฅธ IPC
- ๋ฉ๋ชจ๋ฆฌ ๋งต ํ์ผ โ
CreateFileMapping๊ณผ ํ์ด์ง ์บ์ - ์ธ๋งํฌ์ดยท๋ฎคํ ์คยทEvent โ ๋๊ธฐํ ๊ฐ์ฒด๋ก์์ IPC
- ์๊ทธ๋ โ POSIX์ Windows Event ๋์
- ์์ผ โ UNIX domainยทTCPยทUDPยทWinsock
- RPC์ COM โ ํจ์ ํธ์ถ์ฒ๋ผ ๋ณด์ด๋ IPC
- ๋น์ฉ ์คํํธ๋ผ ์ ๋ฆฌ โ ์ด๋ ๋ฐฉ์์ด ์ผ๋ง๋ ๋น ๋ฅธ๊ฐ
- ํธ๋ ์ด๋์คํ โ ์๋ vs ์์ ์ฑ vs ๋๊ธฐํ ๋ณต์ก๋
- ๋ณด์ โ ์ ๋ขฐ ๊ฒฝ๊ณ์ ACL
- ์ธ๋ฆฌ์ผ์์์ IPC โ
FPlatformProcessยทMessageBusยทHot Reload - ๊ผฌ๋ฆฌ์ง๋ฌธ ์์ ๊ฒฝ๋ก
- ํต์ฌ ์์ฝ ์นด๋ (์ฌ๊ฒ์ฌ)
- ํ๊ท ๋ค๋ฆฌ โ ๋ค๋ฅธ 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 ์ ์ฉ |
| ๋คํธ์ํฌ | X | O (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 mq | Windows PostMessage | Windows Mailslot |
|---|---|---|---|
| ๋ฐฉํฅ | ์๋ฐฉํฅ(๋ณ ํ) | ์๋ฐฉํฅ | ๋จ๋ฐฉํฅ |
| ๋ฉ์์ง ๊ฒฝ๊ณ | O | O | O |
| ์ฐ์ ์์ | O | X (FIFO) | X |
| ํฌ๊ธฐ ์ ํ | mq_msgsize | WPARAM/LPARAM (8B+8B) ๋๋ WM_COPYDATA | ๋ฌด์ ํ (๋จ, ๋ธ๋ก๋์บ์คํธ ์ 424B) |
| ๋คํธ์ํฌ | X | X | O (๋๋ฉ์ธ ๋ธ๋ก๋์บ์คํธ) |
| ์ฌ์ฉ์ฒ | 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๋ง ์๋ฏธ) |
PulseEvent | Set ํ ์ฆ์ Reset (๋จ๋ฐ ์ ํธ, ์ ์ ์ โ ๊ฒฝํฉ ์ ๋๋ฝ ๊ฐ๋ฅ) |
8.4 ๋๊ธฐํ ๊ฐ์ฒด์ IPC ๋ถ๋ฅ
| ๊ฐ์ฒด | ๋ฐ์ดํฐ | ์ ํธ | ํ๋ก์ธ์ค ๊ฐ ๊ณต์ | ์ฌ์ฉ ํจํด |
|---|---|---|---|---|
| Named Mutex | X | ๋ฐฐํ ๋ฝ | O (์ด๋ฆ) | ์์ ๋ณดํธ, single-instance |
| Named Semaphore | X | ์นด์ดํฐ | O (์ด๋ฆ) | ์์ฐ์-์๋น์ ์ฌ๋กฏ ์นด์ดํ |
| Named Event | X | ์ํ ์๊ทธ๋ | 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 dump | Segmentation 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+C | SetConsoleCtrlHandler(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 domain | AF_UNIX (POSIX) | ๊ฐ์ ๋จธ์ | ํ์ผ ์์คํ ๊ฒฝ๋ก๋ก ์๋ณ, TCP๋ณด๋ค ๋น ๋ฆ |
| TCP | AF_INET + SOCK_STREAM | ๋คํธ์ํฌ | ์ ๋ขฐ์ฑ ์๋ ๋ฐ์ดํธ ์คํธ๋ฆผ |
| UDP | AF_INET + SOCK_DGRAM | ๋คํธ์ํฌ | ๋น์ ๋ขฐ ๋ฐ์ดํฐ๊ทธ๋จ, ๋ฉ์์ง ๊ฒฝ๊ณ ๋ณด์กด |
| IPv6 TCP/UDP | AF_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 ํค๋ยท์ํ์ค ๋ฒํธยท์ฒดํฌ์ฌ)์ ํต๊ณผํฉ๋๋ค.
| ์ต์ | TCP | UDP |
|---|---|---|
| ์ ๋ขฐ์ฑ | O (์ฌ์ ์ก) | X |
| ์์ ๋ณด์ฅ | O | X |
| ๋ฉ์์ง ๊ฒฝ๊ณ | X (๋ฐ์ดํธ ์คํธ๋ฆผ) | O (๋ฐ์ดํฐ๊ทธ๋จ) |
| ์ฐ๊ฒฐ ์งํฅ | O | X |
| ๋น์ฉ | ํธ๋์ ฐ์ดํฌ + 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์ ์ ์ก ํ๋กํ ์ฝ ์ต์ :
| ํ๋กํ ์ฝ | ์ฉ๋ |
|---|---|
ncalrpc | Local RPC (LPC) โ ๊ฐ์ ๋จธ์ , ๊ฐ์ฅ ๋น ๋ฆ |
ncacn_ip_tcp | TCP |
ncacn_np | Named Pipe |
ncacn_http | HTTP (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 ๋ฉ์ปค๋์ฆ | ํ ํ ๋น์ฉ | ์๋ ๋น์ฉ | ๋น๊ณ |
|---|---|---|---|
| ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ | ์ ns | 1ร | ์ด๊ธฐ ์ธํ ํ, ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ๊ทธ ์์ฒด |
std::atomic (๊ณต์ ๋ฉ๋ชจ๋ฆฌ์์) | ์ ns | 1ร | CPU ๋ช ๋ น |
| Named Mutex/Event signal+wait | 1~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/recv | 5~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) ์ผ๋ก ์ถ๊ฐ ๊ฒฉ๋ฆฌ๋ฅผ ํฉ๋๋ค.
| ์์ค | ์ฌ์ฉ์ฒ |
|---|---|
| System | OS ์ฝ์ด |
| 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 / OLE | OS ์ ๊ณต ๋ฉ์ปค๋์ฆ |
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_raii | std::lock_guard/std::unique_lock ๊ฐ์ RAII๊ฐ Named Mutex์๋ ๊ทธ๋๋ก ์ ์ฉ โ ์ปจํ
์คํธ ์ค์์น ํ unlock ๋๋ฝ ๋ฐฉ์ง (Windows์์ CHandle ๋ํผ ๊ถ์ฅ) |
| 11_smart_pointer | ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์์ raw pointer ๊นจ์ง โ ๋งคํ ์ฃผ์ ์ฐจ์ด๋ก P1์ ํฌ์ธํฐ๊ฐ P2์์ ๋ฌด์๋ฏธ. shared_ptr ๊ฐ์ ์ถ์ํ๋ IPC ๊ฒฝ๊ณ์์ ๋์ ์ ํจ (์ ์ด ๋ธ๋ก์ด ํ ํ๋ก์ธ์ค ์ฃผ์์ ์์) |
| 16_stl_containers | STL ์ปจํ ์ด๋๋ ํ ํ๋ก์ธ์ค ํ์ โ ํฌ์ธํฐยทiterator ๊ธฐ๋ฐ์ด๋ผ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฃ์ด๋ ๋ค๋ฅธ ํ๋ก์ธ์ค์์ ๋ชป ์. boost::interprocess ๊ฐ์ IPC ์นํ ์ปจํ ์ด๋ ํ์ |
| 19_process_vs_thread | IPC๊ฐ ํ๋ก์ธ์ค vs ์ค๋ ๋(19)์ ์ง์ ํ๊ท โ โ์ค๋ ๋๋ ๊ณต์ , ํ๋ก์ธ์ค๋ ๊ฒฉ๋ฆฌโ์ ๊ฒฉ๋ฆฌ ์ชฝ์ IPC๊ฐ ํ์ด์ค. PCBยทํ์ด์ง ํ ์ด๋ธยทํธ๋ค ํ ์ด๋ธ์ด IPC ๋น์ฉ์ ์ถ๋ฐ์ |
| 20_stack_overflow | ํ๋ก์ธ์ค๋ณ ๋ ๋ฆฝ ์คํ โ IPC ๋ฉ์์ง๊ฐ ๋๋ฌด ํฌ๋ฉด ์์ ์ธก ์คํ ์ค๋ฒํ๋ก ์ํ. ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ ์คํ๊ณผ ๋ณ๊ฐ์ ๋งคํ์ด๋ผ ์คํ ๋น๋ก ์ ํจ |
| 21_context_switching | IPC ๋น์ฉ ํต์ฌ ์์ โ ๋งค ์ก์์ = ๋ชจ๋ ์ค์์น + (๋ธ๋กํน IPC๋ฉด) ์ปจํ ์คํธ ์ค์์น. ์ปจํ ์คํธ ์ค์์นญ(21)์ ๋น์ฉ ์คํํธ๋ผ์ด ๊ทธ๋๋ก ์ ์ฉ. ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋น ๋ฅธ ์ด์ ๊ฐ ์ปจํ ์คํธ ์ค์์นญ(21)์ โ์ฌ์ฉ์ ๋ชจ๋์์ ๋๋๋ฉด ์ปจํ ์คํธ ์ค์์น ์์โ๊ณผ ๊ฐ์ ์๋ฆฌ |