๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Programming/๊ธฐ์ˆ  ๋ฉด์ ‘

[๊ฐœ๋ฐœ์ž ๊ธฐ์ˆ  ๋ฉด์ ‘ ๋Œ€๋น„]๐Ÿ’ก ๋ธ”๋กœํ‚น(Blocking)๊ณผ ๋…ผ๋ธ”๋กœํ‚น(Non-blocking)์˜ ์ฐจ์ด

by Mandy's 2025. 7. 25.

๐Ÿ“Œ ๋„คํŠธ์›Œํฌ, ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ ๋ฉด์ ‘์—์„œ ์ž์ฃผ ๋‚˜์˜ค๋Š” ๊ธฐ๋ณธ ๊ฐœ๋…!


1๏ธโƒฃ ๋ธ”๋กœํ‚น(Blocking)์ด๋ž€?

๋ธ”๋กœํ‚น์€ ํ•˜๋‚˜์˜ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋‹ค์Œ ์ž‘์—…์ด ๋Œ€๊ธฐ(์ค‘๋‹จ) ์ƒํƒœ์— ๋“ค์–ด๊ฐ€๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
์ฃผ๋กœ ์ž…์ถœ๋ ฅ(I/O) ์ž‘์—…์—์„œ ๋งŽ์ด ์“ฐ์ด๋ฉฐ, ๊ฒฐ๊ณผ๊ฐ€ ์˜ฌ ๋•Œ๊นŒ์ง€ ๊ฐ€๋งŒํžˆ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ตฌ์กฐ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๐Ÿงช ์˜ˆ์‹œ (Python)

data = socket.recv(1024)  # ๋ฐ์ดํ„ฐ๊ฐ€ ๋„์ฐฉํ•  ๋•Œ๊นŒ์ง€ ํ”„๋กœ๊ทธ๋žจ์ด ์—ฌ๊ธฐ์„œ ๋ฉˆ์ถค
print("๋ฐ›์€ ๋ฐ์ดํ„ฐ:", data)

์œ„ ์ฝ”๋“œ์—์„œ recv() ํ•จ์ˆ˜๋Š” ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ค๊ธฐ ์ „๊นŒ์ง€ ํ”„๋กœ๊ทธ๋žจ ์ „์ฒด๋ฅผ ๋ฉˆ์ถ”๊ฒŒ(block) ํ•ฉ๋‹ˆ๋‹ค.

โœ… ํŠน์ง•

  • ๊ตฌํ˜„์ด ๋‹จ์ˆœํ•˜๊ณ  ์ง๊ด€์ 
  • ์ž‘์—… ์ˆœ์„œ๊ฐ€ ๋ช…ํ™•
  • ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๋ฉด ์„ฑ๋Šฅ ์ €ํ•˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ

2๏ธโƒฃ ๋…ผ๋ธ”๋กœํ‚น(Non-blocking)์ด๋ž€?

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

๐Ÿงช ์˜ˆ์‹œ (Python)

sock.setblocking(False)

try:
    data = sock.recv(1024)
    print("๋ฐ›์€ ๋ฐ์ดํ„ฐ:", data)
except BlockingIOError:
    print("์•„์ง ๋ฐ์ดํ„ฐ ์—†์Œ, ๋‹ค์Œ ์ž‘์—… ์ง„ํ–‰")

setblocking(False)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด recv() ํ˜ธ์ถœ ์‹œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์–ด๋„ ํ”„๋กœ๊ทธ๋žจ์€ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ž‘์—…์„ ๊ณ„์† ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

โœ… ํŠน์ง•

  • ๋‹ค์ค‘ ์ž‘์—… ์ฒ˜๋ฆฌ์— ์œ ๋ฆฌ (ํŠนํžˆ ์›น ์„œ๋ฒ„)
  • ๋…ผ๋ฆฌ์  ํ๋ฆ„์ด ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Œ
  • ์ฃผ๋กœ select, poll, epoll, async/await ๋“ฑ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ

๐Ÿ†š ๋ธ”๋กœํ‚น vs ๋…ผ๋ธ”๋กœํ‚น ๋น„๊ตํ‘œ

ํ•ญ๋ชฉ ๋ธ”๋กœํ‚น (Blocking) ๋…ผ๋ธ”๋กœํ‚น (Non-blocking)

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

๐Ÿ“Œ ์ •๋ฆฌ

  • ๋ธ”๋กœํ‚น: ๋‹จ์ˆœํ•˜์ง€๋งŒ, ๋ณ‘๋ ฌ์„ฑ/์„ฑ๋Šฅ์— ๋ถˆ๋ฆฌ
  • ๋…ผ๋ธ”๋กœํ‚น: ์„ฑ๋Šฅ ์ข‹์ง€๋งŒ, ๊ตฌ์กฐ๊ฐ€ ๋ณต์žก

๋น„๋™๊ธฐ(Async)์™€๋Š” ๋‹ค๋ฅธ ๊ฐœ๋…์ด์ง€๋งŒ, ๋…ผ๋ธ”๋กœํ‚น์€ ์ข…์ข… ๋น„๋™๊ธฐ I/O์˜ ๊ธฐ๋ฐ˜์ด ๋˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.


๐ŸŽฏ ๋ฉด์ ‘์—์„œ ์ด๋ ‡๊ฒŒ ๋‹ต๋ณ€ํ•ด๋ณด์„ธ์š”!

“๋ธ”๋กœํ‚น์€ ์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ํ”„๋กœ๊ทธ๋žจ์ด ๋ฉˆ์ถ”๋Š” ๋ฐฉ์‹์ด๊ณ , ๋…ผ๋ธ”๋กœํ‚น์€ ์š”์ฒญ๋งŒ ๋ณด๋‚ด๊ณ  ๋ฐ”๋กœ ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋ธ”๋กœํ‚น์€ ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜์ง€๋งŒ ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๊ณ , ๋…ผ๋ธ”๋กœํ‚น์€ ์„ฑ๋Šฅ์€ ์ข‹์ง€๋งŒ ๋ณต์žกํ•œ ํ๋ฆ„ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.”