๐ข Minitalk : ์ ํธ(Signal)๋ก ์์ ์ฌ๋ฆฐ ํต์ ์ ๊ท์ฝ(Protocol)
printf๊ฐ ๋ฐ์ดํฐ์ โํํโ์ ๋ค๋ฃจ๋ ๊ณผ์ ์๋ค๋ฉด, Minitalk๋ ํ ๊ฑธ์ ๋ ๋์๊ฐ, ๋ถ๋ฆฌ๋ ํ๋ก์ธ์ค๋ค ์ฌ์ด์ ์ด๋ป๊ฒ โ์๋ฏธโ๋ฅผ ์ ๋ฌํ ์ ์๋์ง์ ๋ํ ๊ทผ๋ณธ์ ์ธ ์ง๋ฌธ์ ๋์ง๋ค.
์ด ๊ณผ์ ์ ์๊ตฌ์ฌํญ์ ์ง๊ทนํ ๋ฏธ๋๋ฉ๋ฆฌ์ฆํ๋ค: ๋คํธ์ํฌ ์์ผ ์์ด, ์ค์ง ๋ ์ข
๋ฅ์ ์ ๋์ค ์๊ทธ๋(SIGUSR1, SIGUSR2)๋ง์ ์ด์ฉํด ๋ฌธ์์ด์ ์ ์กํ๋ผ.
๋ณธ๋ ์๊ทธ๋์ ํ๋ก์ธ์ค๋ฅผ ์ค๋จ์ํค๊ฑฐ๋(SIGINT), ํน์ ์ํ๋ฅผ ์๋ฆฌ๋ ๋ฑ ๋จ๋ฐฉํฅ์ ๊ฐ์ ์ ์ธ โ์ฌ๊ฑด(Event)โ์ ํต์งํ๊ธฐ ์ํ ์์์ ์ธ ๋ฉ์ปค๋์ฆ์ด์ OS ๋จ์์ ์ ๊ณตํ๋ ์์ ์ฅ์น์ด๋ค.
Minitalk๋ ์ด ์ ์ฝ ์กฐ๊ฑด์ ์ญ์ผ๋ก ์ด์ฉํ์ฌ, ๊ฐ์ฅ ํผ๋์ค๋ฝ๊ณ ์์์ ์ธ ํต์ ์๋จ ์์ ์ด๋ป๊ฒ ์ง์์ ์ฐํ โ๊ท์ฝ(Protocol)โ์ ์ธ์ฐ๊ณ ์์ ์ ์ธ ํต์ ์ฑ๋์ ๊ตฌ์ถํ ์ ์๋์ง ์จ๋ชธ์ผ๋ก ์ฆ๋ช
ํด์ผ ํ๋, ์์คํ
ํ๋ก๊ทธ๋๋ฐ์ ์ ์๊ฐ ๋ด๊ธด ๊ณผ์ ์๋ค.
๐ก ํต์ ์ ์ฒซ ๋จ์ถ: ์ฝ์(Convention)์ ํ์
๋ชจ๋ ํต์ ์ โ์ฝ์โ์์ ์์ํ๋ค. Minitalk์ ์ธ๊ณ์์๋ ๋ ๊ฐ์ ์๊ทธ๋์ด ์ํ๋ฒณ์ ์ญํ ์ ๋งก๋๋ค.
SIGUSR1์ ๋นํธ(bit) 0์ ์๋ฏธํ๋ค.SIGUSR2๋ ๋นํธ(bit) 1์ ์๋ฏธํ๋ค.
์ด ์ง๊ทนํ ๋จ์ํ ์ฝ์ ํ๋๊ฐ ๋ฌด์ง์ํ ์ ํธ์ ์๋ฏธ๋ฅผ ๋ถ์ฌํ๋ ์ฒซ๊ฑธ์์ด๋ค.
์๊ทธ๋์ ๋ฐ์ผ๋ฉด, ์ด์ ๋ฐ๋ผ ํ๋ก์ธ์ค๊ฐ OS ๋จ์ ๊ฐ์ ์ ์ธ์งํ๊ฒ ๋๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ก ์ฝ์๋ ์ ํธ์ ๋ชจ์์ ๋ณด๋ด์ค๋ค.
์๋ฅผ ๋ค์ด ๋ฌธ์ โAโ(ASCII 65, ์ด์ง์ 01000001)๋ฅผ ๋ณด๋ด๋ ํ์๋ก
SIGUSR1,SIGUSR2,SIGUSR1,SIGUSR1,SIGUSR1,SIGUSR1,SIGUSR1,SIGUSR2
์ ๊ฐ์ 8๊ฐ์ ์๊ทธ๋์ ์์ฐจ์ ์ผ๋ก ๋ฐ์ ํ๋ ํ์๋ก ๋ฒ์ญ๋๋ค.
์ด๋ ํ๋ ๋คํธ์ํฌ ํต์ ์ ๊ฐ์ฅ ๋ฐ๋จ์ ์๋ ๋ฌผ๋ฆฌ ๊ณ์ธต(Physical Layer)์์ ์ ๊ธฐ ์ ํธ์ ์ ์ ์ฐจ์ด๋ฅผ 0๊ณผ 1๋ก ํด์ํ๋ ์๋ฆฌ์ ์ ํํ ์ผ์นํ๋ค. ๋๋ ์ด ๊ณผ์ ์์ ์๊ทธ๋์ ํตํด ๊ฐ์ฅ ์์์ ์ธ ํํ์ ๋ฌผ๋ฆฌ ๊ณ์ธต์ ์ง์ ๊ตฌํํ ๊ฒ์ด๋ค.
๐ค ํ๋กํ ์ฝ์ ์ค๊ณ: ์ฃผ์ ์ง์ , ์ง๋ ฌํ, ๊ทธ๋ฆฌ๊ณ ๋๊ธฐํ
๋จ์ํ 0๊ณผ 1์ ๋ณด๋ผ ์ ์๋ค๊ณ ํด์ ํต์ ์ด ์์ฑ๋์ง๋ ์๋๋ค. ๋จ์ํ ํต์ ์ ํ๋ ์ธ์ฝ๋ฉ๊ณผ ๋์ฝ๋ฉ์ ์ ์ฐจ์ผ ํ ๋ฐ, ๊ฒฐ๊ตญ ํต์ ์ด๋ผ๊ณ ํ๋ ๊ฒ์ด ์๋ฏธ ์๋ ๋ฐ์ดํฐ ๊ตํ์ ์ํด์๋ ์ ๊ตํ ํ๋กํ ์ฝ๋ก์ ๊ตฌ์ฑ์ด ํ์์ ๋๋ค.
- ์ฃผ์ ์ง์ (Addressing) -
PID: ์๋ฒ๋ ์์๊ณผ ๋์์ ์์ ์PID(Process ID)๋ฅผ ์ถ๋ ฅํ๋ค. ์ด๋ ๋คํธ์ํฌ์์ ์๋ฒ๊ฐ ์์ ์ IP ์ฃผ์์ ํฌํธ ๋ฒํธ๋ฅผ ์๋ฆฌ๋ ๊ฒ๊ณผ ๊ฐ๋ค.PID๋ ์ด์์ฒด์ ๊ฐ ๊ฐ ํ๋ก์ธ์ค์๊ฒ ๋ถ์ฌํ ๊ณ ์ ํ ์ฃผ์์ด๋ฉฐ, ํด๋ผ์ด์ธํธ๋kill์์คํ ์ฝ์ ํตํด ์ด ์ฃผ์๋ก ์ ํํ๊ฒ ์ ํธ๋ฅผ ๋ณด๋ผ ์ ์๋ค. ํต์ ์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ธ โ๋๊ฐ ๋๊ตฌ์๊ฒโ ๋ณด๋ด๋์ง๋ฅผ ๋ช ํํ ํ๋ ๋จ๊ณ๋ค. - ์ง๋ ฌํ์ ์ญ์ง๋ ฌํ (Serialization & Deserialization) - ๋นํธ ์ฐ์ฐ:
- ํด๋ผ์ด์ธํธ (์ก์ ์): ๋ฌธ์(char)๋ผ๋ ๊ณ ์์ค ๋ฐ์ดํฐ๋ฅผ
(character >> i) & 1๊ณผ ๊ฐ์ ๋นํธ ์ฐ์ฐ์ ํตํด 8๊ฐ์ ๋นํธ ์คํธ๋ฆผ์ผ๋ก ๋ถํด(์ง๋ ฌํ)ํ๋ค. ์ด๋ ํต์ ์ฑ๋(์๊ทธ๋)์ ํตํด ๋ณด๋ผ ์ ์๋ ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๋ ๊ณผ์ ์ด๋ค. - ์๋ฒ (์์ ์):
sigaction์ ํตํด ๋ฑ๋ก๋ ํธ๋ค๋ฌ ํจ์๋ ๋น๋๊ธฐ์ ์ผ๋ก ๋์ฐฉํ๋ ์๊ทธ๋๋ค์ ์์ ํ๋ค. ์ด ํธ๋ค๋ฌ๋char_byte = (char_byte << 1) | bit;์ฝ๋๋ฅผ ํตํด ํฉ์ด์ ธ์ ๋์ฐฉํ ๋นํธ๋ค์ ๋ค์ 8๋นํธ์ ๋ฌธ์(char)๋ก ์กฐ๋ฆฝ(์ญ์ง๋ ฌํ)ํ๋ค. ์ด๋ ์ธ๋ถ์ ๋น๋๊ธฐ์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ ํ๋ก๊ทธ๋๋ฐ(Event-driven programming)์ ํต์ฌ ๋ชจ๋ธ์ ์ง์ ๊ตฌํํ๋ ๊ฒฝํ์ด์๋ค.
- ํด๋ผ์ด์ธํธ (์ก์ ์): ๋ฌธ์(char)๋ผ๋ ๊ณ ์์ค ๋ฐ์ดํฐ๋ฅผ
- ํ๋ฆ ์ ์ด (Flow Control) - ๋๊ธฐํ: ๋ง์ฝ ํด๋ผ์ด์ธํธ๊ฐ ์ผ๋ฐฉ์ ์ผ๋ก ์๊ทธ๋์ ํญ์ฃผ์ํค๋ฉด ์๋ฒ๋ ์ด๋ฅผ ๋ชจ๋ ์ฒ๋ฆฌํ์ง ๋ชปํ๊ณ ์ ์ค๋๋ค. ์ด๋ฅผ ๋ง๊ธฐ ์ํด ํธ๋์
ฐ์ดํฌ(Handshake) ๊ธฐ๋ฐ์ ๋๊ธฐํ ํ๋กํ ์ฝ์ ๋์
ํด์ผ ํ๋ค.
- ํด๋ผ์ด์ธํธ๋ 1๋นํธ๋ฅผ ๋ณด๋ธ ํ
pause()๋ก ์๋ต์ ๊ธฐ๋ค๋ฆฐ๋ค. - ์๋ฒ๋ 1๋นํธ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ฒ๋ฆฌํ ํ,
kill์ ํตํด ํด๋ผ์ด์ธํธ์๊ฒ ACK(Acknowledgement) ์ ํธ๋ฅผ ๋ณด๋ธ๋ค. - ACK ์ ํธ๋ฅผ ๋ฐ์ ํด๋ผ์ด์ธํธ๋ ๋น๋ก์ ๋ค์ ๋นํธ๋ฅผ ๋ณด๋ธ๋ค.
- ์ด โ๋ณด๋ด๊ณ -๋ฐ๊ณ -ํ์ธํ๋โ ๊ณผ์ ์ ์ ๋ขฐ์ฑ ์๋ ํต์ ์ ๋๋ช ์ฌ์ธ TCP ํ๋กํ ์ฝ์ ํ๋ฆ ์ ์ด ์๋ฆฌ์ ์ ํํ ๊ฐ๋ค. ์ด๋ฌํ ๊ตฌ์ฑ์ ๊ฐ์ฅ ์์์ ์ธ ์ฌ๋ฃ๋ก ํ๋์ ์ธ ํต์ ํ๋กํ ์ฝ์ ํต์ฌ ๊ฐ๋ ์ ์ฌ์ฐฝ์กฐํ ๊ฒ์ด๋ค.
- ํด๋ผ์ด์ธํธ๋ 1๋นํธ๋ฅผ ๋ณด๋ธ ํ
โจ ์ฑ์ฐฐ ๋ฐ ๋ฐฐ์ด ์
Minitalk๋ฅผ ํ๋ง๋๋ก ์ ๋ฆฌํ๋ค๋ฉด ์ด์์ฒด์ ์์ ๊น์ ๊ต๊ฐ์ ํตํด ํต์ ์ ๋ณธ์ง์ ํ๊ตฌํ๊ฒ ํ ๊ณผ์ ์๋ค.
- ํ๋กํ ์ฝ ์ค๊ณ์ ๋ณธ์ง: ํต์ ์ ๋จ์ํ ๋ฐ์ดํฐ ์ ์ก์ด ์๋๋ผ, ์์ธก์ด ๋์ํ ์๊ฒฉํ โ๊ท์น์ ์งํฉโ ์์์ ์ด๋ฃจ์ด์ง๋ค. ์ฃผ์ ์ง์ , ๋ฐ์ดํฐ ํํ, ์์ ๋ณด์ฅ, ์ค๋ฅ ์ ์ด ๋ฑ ๋ชจ๋ ํ๋ ๋คํธ์ํฌ ํ๋กํ ์ฝ์ ๋ด๊ธด ์ฒ ํ์ ๊ฐ์ฅ ๋จ์ํ ํํ๋ก ์์ถํด์ ๊ฒฝํํ ์ ์์๋ค. ๋น์ฐํ ์ด๋ฌํ ํต์ ์ ์ดํดํ๊ณ ๋ ๋ค,
์ฐ์ํ ์ข ๋ฃ(graceful termination)์ ๊ฐ๋ ์ ์ดํดํ ์ ์์์ผ๋ฉฐ, ์ด๋ ์ดํ ํ๋ก์ ํธ, ํ์ฌ์์์ ์ ๋ฌด์์๋ ์๋ฒ ์์ ์์๋ ์์ฃผ ํกํกํ ํจ๊ณผ๋ฅผ ํด์ฃผ์๋ค. - ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ์ดํด: ํ๋ก๊ทธ๋จ์ ํ๋ฆ์ด ๋์ ์ฝ๋๊ฐ ์๋ ์ธ๋ถ์ ์ด๋ฒคํธ(์๊ทธ๋)์ ์ํด ๊ฒฐ์ ๋๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ์ ์์ , ์์ฃผ ์์์ ์ด์ง๋ง ๋ง๋ณด๊ธฐ๋ฅผ ํ๊ณ ์ง์ ๋ค๋ฃจ์ด ๋ณผ ์ ์์๋ค.
- ์ถ์ํ์ ๋ํ ๊ฐ์ฌ: ๋งค์ผ ๋น์ฐํ๊ฒ ์ฌ์ฉํ๋
TCP/IP์์ผ ํต์ ์ด ์ผ๋ง๋ ๋ง์ ๋ณต์ก์ฑ์ ๊ฐ์ถ๊ณ ์ฐ๋ฆฌ์๊ฒ ํธ๋ฆฌํจ์ ์ ๊ณตํ๋์ง, ๊ฐ์ฅ ๋ฎ์ ์์ค์ ํต์ ์ ๊ตฌํํด๋ณด๊ณ ๋์์ผ ๋น๋ก์ ์ค๊ฐํ๊ฒ ๋์๋ค.
