๐Ÿ“ข 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์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ด์„œ ํ†ต์‹ ์ด ์™„์„ฑ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค. ๋‹จ์ˆœํžˆ ํ†ต์‹ ์„ ํ•˜๋Š” ์ธ์ฝ”๋”ฉ๊ณผ ๋””์ฝ”๋”ฉ์˜ ์ ˆ์ฐจ์ผ ํ…๋ฐ, ๊ฒฐ๊ตญ ํ†ต์‹ ์ด๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์ด ์˜๋ฏธ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ์œ„ํ•ด์„œ๋Š” ์ •๊ตํ•œ ํ”„๋กœํ† ์ฝœ๋กœ์˜ ๊ตฌ์„ฑ์ด ํ•„์š”์‹œ ๋œ๋‹ค.

  1. ์ฃผ์†Œ ์ง€์ • (Addressing) - PID: ์„œ๋ฒ„๋Š” ์‹œ์ž‘๊ณผ ๋™์‹œ์— ์ž์‹ ์˜ PID(Process ID)๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์ด๋Š” ๋„คํŠธ์›Œํฌ์—์„œ ์„œ๋ฒ„๊ฐ€ ์ž์‹ ์˜ IP ์ฃผ์†Œ์™€ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ์•Œ๋ฆฌ๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค. PID๋Š” ์šด์˜์ฒด์ œ๊ฐ€ ๊ฐ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ๋ถ€์—ฌํ•œ ๊ณ ์œ ํ•œ ์ฃผ์†Œ์ด๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๋Š” kill ์‹œ์Šคํ…œ ์ฝœ์„ ํ†ตํ•ด ์ด ์ฃผ์†Œ๋กœ ์ •ํ™•ํ•˜๊ฒŒ ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ํ†ต์‹ ์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ธ โ€˜๋ˆ„๊ฐ€ ๋ˆ„๊ตฌ์—๊ฒŒโ€™ ๋ณด๋‚ด๋Š”์ง€๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๋Š” ๋‹จ๊ณ„๋‹ค.
  2. ์ง๋ ฌํ™”์™€ ์—ญ์ง๋ ฌํ™” (Serialization & Deserialization) - ๋น„ํŠธ ์—ฐ์‚ฐ:
    • ํด๋ผ์ด์–ธํŠธ (์†ก์‹ ์ž): ๋ฌธ์ž(char)๋ผ๋Š” ๊ณ ์ˆ˜์ค€ ๋ฐ์ดํ„ฐ๋ฅผ (character >> i) & 1๊ณผ ๊ฐ™์€ ๋น„ํŠธ ์—ฐ์‚ฐ์„ ํ†ตํ•ด 8๊ฐœ์˜ ๋น„ํŠธ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ถ„ํ•ด(์ง๋ ฌํ™”)ํ•œ๋‹ค. ์ด๋Š” ํ†ต์‹  ์ฑ„๋„(์‹œ๊ทธ๋„)์„ ํ†ตํ•ด ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.
    • ์„œ๋ฒ„ (์ˆ˜์‹ ์ž): sigaction์„ ํ†ตํ•ด ๋“ฑ๋ก๋œ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋„์ฐฉํ•˜๋Š” ์‹œ๊ทธ๋„๋“ค์„ ์ˆ˜์‹ ํ•œ๋‹ค. ์ด ํ•ธ๋“ค๋Ÿฌ๋Š” char_byte = (char_byte << 1) | bit; ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํฉ์–ด์ ธ์„œ ๋„์ฐฉํ•œ ๋น„ํŠธ๋“ค์„ ๋‹ค์‹œ 8๋น„ํŠธ์˜ ๋ฌธ์ž(char)๋กœ ์กฐ๋ฆฝ(์—ญ์ง๋ ฌํ™”)ํ•œ๋‹ค. ์ด๋Š” ์™ธ๋ถ€์˜ ๋น„๋™๊ธฐ์  ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Event-driven programming)์˜ ํ•ต์‹ฌ ๋ชจ๋ธ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝํ—˜์ด์—ˆ๋‹ค.
  3. ํ๋ฆ„ ์ œ์–ด (Flow Control) - ๋™๊ธฐํ™”: ๋งŒ์•ฝ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ผ๋ฐฉ์ ์œผ๋กœ ์‹œ๊ทธ๋„์„ ํญ์ฃผ์‹œํ‚ค๋ฉด ์„œ๋ฒ„๋Š” ์ด๋ฅผ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๊ณ  ์œ ์‹ค๋œ๋‹ค. ์ด๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ํ•ธ๋“œ์…ฐ์ดํฌ(Handshake) ๊ธฐ๋ฐ˜์˜ ๋™๊ธฐํ™” ํ”„๋กœํ† ์ฝœ์„ ๋„์ž…ํ•ด์•ผ ํ–ˆ๋‹ค.
    • ํด๋ผ์ด์–ธํŠธ๋Š” 1๋น„ํŠธ๋ฅผ ๋ณด๋‚ธ ํ›„ pause()๋กœ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
    • ์„œ๋ฒ„๋Š” 1๋น„ํŠธ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ ํ›„, kill์„ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ACK(Acknowledgement) ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ธ๋‹ค.
    • ACK ์‹ ํ˜ธ๋ฅผ ๋ฐ›์€ ํด๋ผ์ด์–ธํŠธ๋Š” ๋น„๋กœ์†Œ ๋‹ค์Œ ๋น„ํŠธ๋ฅผ ๋ณด๋‚ธ๋‹ค.
    • ์ด โ€˜๋ณด๋‚ด๊ณ -๋ฐ›๊ณ -ํ™•์ธํ•˜๋Š”โ€™ ๊ณผ์ •์€ ์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ํ†ต์‹ ์˜ ๋Œ€๋ช…์‚ฌ์ธ TCP ํ”„๋กœํ† ์ฝœ์˜ ํ๋ฆ„ ์ œ์–ด ์›๋ฆฌ์™€ ์ •ํ™•ํžˆ ๊ฐ™๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ์€ ๊ฐ€์žฅ ์›์‹œ์ ์ธ ์žฌ๋ฃŒ๋กœ ํ˜„๋Œ€์ ์ธ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ์˜ ํ•ต์‹ฌ ๊ฐœ๋…์„ ์žฌ์ฐฝ์กฐํ•œ ๊ฒƒ์ด๋‹ค.

โœจ ์„ฑ์ฐฐ ๋ฐ ๋ฐฐ์šด ์ 

Minitalk๋ฅผ ํ•œ๋งˆ๋””๋กœ ์ •๋ฆฌํ•œ๋‹ค๋ฉด ์šด์˜์ฒด์ œ์™€์˜ ๊นŠ์€ ๊ต๊ฐ์„ ํ†ตํ•ด ํ†ต์‹ ์˜ ๋ณธ์งˆ์„ ํƒ๊ตฌํ•˜๊ฒŒ ํ•œ ๊ณผ์ œ์˜€๋‹ค.

  • ํ”„๋กœํ† ์ฝœ ์„ค๊ณ„์˜ ๋ณธ์งˆ: ํ†ต์‹ ์€ ๋‹จ์ˆœํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก์ด ์•„๋‹ˆ๋ผ, ์–‘์ธก์ด ๋™์˜ํ•œ ์—„๊ฒฉํ•œ โ€˜๊ทœ์น™์˜ ์ง‘ํ•ฉโ€™ ์œ„์—์„œ ์ด๋ฃจ์–ด์ง„๋‹ค. ์ฃผ์†Œ ์ง€์ •, ๋ฐ์ดํ„ฐ ํ‘œํ˜„, ์ˆœ์„œ ๋ณด์žฅ, ์˜ค๋ฅ˜ ์ œ์–ด ๋“ฑ ๋ชจ๋“  ํ˜„๋Œ€ ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ์— ๋‹ด๊ธด ์ฒ ํ•™์„ ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ํ˜•ํƒœ๋กœ ์••์ถ•ํ•ด์„œ ๊ฒฝํ—˜ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋‹น์—ฐํžˆ ์ด๋Ÿฌํ•œ ํ†ต์‹ ์„ ์ดํ•ดํ•˜๊ณ  ๋‚œ ๋’ค, ์šฐ์•„ํ•œ ์ข…๋ฃŒ(graceful termination) ์˜ ๊ฐœ๋…์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ์œผ๋ฉฐ, ์ด๋Š” ์ดํ›„ ํ”„๋กœ์ ํŠธ, ํšŒ์‚ฌ์—์„œ์˜ ์—…๋ฌด์—์„œ๋„ ์„œ๋ฒ„ ์ž‘์—…์—์„œ๋„ ์•„์ฃผ ํ†กํ†กํžˆ ํšจ๊ณผ๋ฅผ ํ•ด์ฃผ์—ˆ๋‹ค.
  • ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ดํ•ด: ํ”„๋กœ๊ทธ๋žจ์˜ ํ๋ฆ„์ด ๋‚˜์˜ ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ์™ธ๋ถ€์˜ ์ด๋ฒคํŠธ(์‹œ๊ทธ๋„)์— ์˜ํ•ด ๊ฒฐ์ •๋˜๋Š” ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜์˜ ์ž‘์—…, ์•„์ฃผ ์›์‹œ์ ์ด์ง€๋งŒ ๋ง›๋ณด๊ธฐ๋ฅผ ํ•˜๊ณ  ์ง์ ‘ ๋‹ค๋ฃจ์–ด ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  • ์ถ”์ƒํ™”์— ๋Œ€ํ•œ ๊ฐ์‚ฌ: ๋งค์ผ ๋‹น์—ฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋˜ TCP/IP ์†Œ์ผ“ ํ†ต์‹ ์ด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋ณต์žก์„ฑ์„ ๊ฐ์ถ”๊ณ  ์šฐ๋ฆฌ์—๊ฒŒ ํŽธ๋ฆฌํ•จ์„ ์ œ๊ณตํ•˜๋Š”์ง€, ๊ฐ€์žฅ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ํ†ต์‹ ์„ ๊ตฌํ˜„ํ•ด๋ณด๊ณ  ๋‚˜์„œ์•ผ ๋น„๋กœ์†Œ ์‹ค๊ฐํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.