Programming/Java

F017 - Blocking, Non-Blocking / Synchronous, Asynchronous

osean 2021. 6. 15. 00:36
โœ๏ธ ์˜ˆ์ „์— Node.js๋ฅผ ์ž ๊น ๊ณต๋ถ€ํ•˜๋ฉด์„œ ๊ธฐ์ดˆ ์ง€์‹์„ ์Œ“๋Š”๋‹ค๊ณ  ํ•ด๋‹น ๊ฐœ๋…์„ ์Šค์ณ ์ง€๋‚˜๊ฐ€ ๋“ฏ ์ฐพ์•„ ๋ดค๋˜ ๊ธฐ์–ต์ด ์žˆ๋‹ค.

๋ธ”๋กœ๊ทธ์— ์ •๋ฆฌ๋„ ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™์€๋ฐ, ๋‹น์‹œ์—๋Š” Thread์™€ Process ๊ทธ๋ฆฌ๊ณ  ์ด๋กœ ์ธํ•ด ์šด์˜์ฒด์ œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์กฐ๊ธˆ๋„ ์•Œ์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ „ํ˜€ ์ดํ•ด๊ฐ€ ์•ˆ๋œ ์ƒํƒœ๋กœ ๊ธ€๋งŒ ์ •๋ฆฌํ–ˆ์—ˆ๋‹ค. (๋ณต๋ถ™ ์ˆ˜์ค€)

์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ๊ทธ๋ž˜๋„ ์œ„์˜ ๊ฐœ๋…์— ๋Œ€ํ•ด ๋ฏธ์•ฝํ•˜๊ฒŒ๋‚˜๋งˆ ์ •๋ฆฌ๊ฐ€ ๋˜์—ˆ์œผ๋‹ˆ ์ด๋ฅผ ๋ฐœํŒ์œผ๋กœ ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ, Blocking๊ณผ Non-Blocking์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•ด๋ณด์ž!

Blocking / Non-Blocking

Blocking : ์–ด๋– ํ•œ ํ–‰์œ„์— ์˜ํ•ด ์ž์‹ ์˜ ํ–‰์œ„๋ฅผ ์ด์–ด์„œ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜ ๋ง‰ํžˆ๋Š” ๊ฒƒ.

Non-Blocking : ์–ด๋– ํ•œ ํ–‰์œ„์— ๊ตฌ์•  ๋ฐ›์ง€ ์•Š๊ณ  ์ž์‹ ์˜ ํ–‰์œ„๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ.

Sync / Async

ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ์˜ ๋™๊ธฐ๋ž€ ๋™์‹œ์— ์ผ์–ด๋‚œ๋‹ค๋Š” ๋œป์œผ๋กœ, ์ด๋Š” ์š”์ฒญํ•˜๋Š” ํ•จ์ˆ˜์™€ ์‘๋‹ตํ•˜๋Š” ํ•จ์ˆ˜ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๋™๊ธฐ๋ฅผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค.
์ž‘์—…์˜ ๋‹จ์œ„ (Transaction)์„ ๋™๊ธฐํ™”ํ•˜๋ฉด Sync, ๋™๊ธฐํ™”ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด Async์ด๋‹ค.

๊ฒฐ๊ตญ ๋‘˜์€ ๋น„์Šทํ•œ ๊ฐœ๋… ์•„๋‹Œ๊ฐ€?

๋ถ„๋ช… ๋™๊ธฐ์™€ ๋ธ”๋ฝํ‚น์€ ์–ธ๋œป ๋ณด๋ฉด ๋งˆ์น˜ ๋™์ผํ•œ ๊ฐœ๋…์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋‘˜์€ ๋ฐ”๋ผ๋ณด๋Š” ์‹œ์ ์— ๋”ฐ๋ผ ๊ทธ ์˜๋ฏธ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.
Blocking, Non-Blocking์˜ ๊ธฐ์ค€์€ ์ œ์–ด๊ถŒ์„ ์–ด๋Š ์ชฝ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š๋ƒ๋กœ ๋‚˜๋‰˜์–ด์ง€์ง€๋งŒ, Sychronous, Asynchronous ๋Š” ์ž‘์—…์˜ ๋ฐ˜ํ™˜์— ๋Œ€ํ•ด ์˜ํ–ฅ์„ ๋ฐ›๋Š”์ง€ ๋ฐ›์ง€ ์•Š๋Š”์ง€๋กœ ๋‚˜๋‰˜์–ด์ง„๋‹ค.

๊ฐ„๋‹จํ•œ ์„ค๋ช…์„ ํ†ตํ•ด ์ดํ•ดํ•ด๋ณด์ž.

๐Ÿ“ Blocking
: A ๋ฉ”์†Œ๋“œ๊ฐ€ B ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ˆœ๊ฐ„, A ๋ฉ”์†Œ๋“œ๋Š” B ๋ฉ”์†Œ๋“œ๊ฐ€ ์ž‘์—…์„ ๋งˆ๋ฌด๋ฆฌํ•˜์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด A ๋ฉ”์†Œ๋“œ๋Š” ๋‚˜๋จธ์ง€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•œ๋‹ค.
์ฆ‰, A ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•œ ๊ถŒํ•œ์ด B ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•จ๊ณผ ๋™์‹œ์— ์ œ์–ด๊ถŒ์ด ๋„˜์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.

๐Ÿ“Non-Blocking
: Blocking์˜ ๊ฒฝ์šฐ B ๋ฉ”์†Œ๋“œ์— ์˜ํ•ด A ๋ฉ”์†Œ๋“œ์˜ ์ž‘์—…์„ ์ด์–ด๊ฐˆ์ง€, ์ข…๋ฃŒ๋ ์ง€๊ฐ€ ๊ฒฐ์ •๋˜์—ˆ๋‹ค.
ํ•˜์ง€๋งŒ Non-Blocking์€ B ๋ฉ”์†Œ๋“œ์˜ ์ž‘์—… ์ˆ˜ํ–‰์— ๋Œ€ํ•ด ๊ด€์—ฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— B ๋ฉ”์†Œ๋“œ๊ฐ€ ๋น„์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜๊ฑฐ๋‚˜ ์ž‘์—…์„ ๋งˆ๋ฌด๋ฆฌ ํ–ˆ๋‹ค๊ณ  ํ•ด๋„ ์ด์— ๋Œ€ํ•ด ๊ฐ„์„ญ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

๐Ÿ“ Synchronous
: ์ด์ „์— ๋ฐฐ์šด synchronized ์˜ˆ์•ฝ์–ด๋‚˜ AtomicType ํด๋ž˜์Šค๋ฅผ ์งš์–ด๋ณด์ž.
Java์—์„œ๋Š” ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ํŠน์ • ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•ด์•ผ ํ•  ๋•Œ ๋™์‹œ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฐ์ดํ„ฐ์— ๋จผ์ € ์ ‘๊ทผํ•œ ์Šค๋ ˆ๋“œ์˜ ์ž‘์—…์ด ์ข…๋ฃŒ๋˜์–ด์•ผ ๋‹ค์Œ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด๋ฅผ ํ†ตํ•ด Synchronous ๊ฐœ๋…์€ ๋งˆ์ง€ Queue ์ž๋ฃŒ๊ตฌ์กฐ์™€ ๊ฐ™์ด ์„ ์ž…์„ ์ถœ์„ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“ Asynchronous
: ์š”์ฒญ์— ๋Œ€ํ•œ return ์— ๊ตฌ์•  ๋ฐ›์ง€ ์•Š๊ณ  ํ•จ๊ป˜ ๊ทธ๋ฆฌ๊ณ  ๊ฐ์ž ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐœ๋…์ด๋‹ค.
์ฆ‰, A ์Šค๋ ˆ๋“œ๊ฐ€ B ์Šค๋ ˆ๋“œ์—๊ฒŒ ์–ด๋–ค ์ž‘์—…์„ ์š”์ฒญํ•˜์ง€๋งŒ, A ์Šค๋ ˆ๋“œ๋Š” ํ•ด๋‹น ์ž‘์—…์— ๋Œ€ํ•œ B ์Šค๋ ˆ๋“œ์˜ return ์— ๊ด€์—ฌํ•˜์ง€ ์•Š๊ณ  B ์Šค๋ ˆ๋“œ์—๊ฒŒ ์š”์ฒญํ•จ๊ณผ ๋™์‹œ์— ์ž์‹ ์˜ ๋‚˜๋จธ์ง€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ ๋‹ค๋ฐœ์ ์œผ๋กœ ๊ฐ์ž ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜์—ฌ ์ž‘์—…ํ•˜๋Š” ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์ด ์˜ˆ์ƒ๊ฐ’๊ณผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

Blocking, Synchronous

๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” I/O ๋ชจ๋ธ๋กœ, Read์™€ Write ๊ฐ™์€ I/O์˜ System Call์„ ์˜๋ฏธํ•œ๋‹ค.
์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๋Š” ์–ธ์–ด๋กœ๋Š” Java๊ฐ€ ๋Œ€ํ‘œ์ ์ด๋‹ค.
Stream์„ ํ†ตํ•ด Java Application ์™ธ๋ถ€์™€ ํ†ต์‹  ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ๋•Œ Stream์€ ๋‹จ๋ฐฉํ–ฅ ํ†ต๋กœ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ Input ํ˜น์€ Output Stream์œผ๋กœ๋งŒ ํ๋ฅด๊ฒŒ ๋˜์–ด ํ•ด๋‹น Stream์ด ๋‹ซํžˆ์ง€ ์•Š์œผ๋ฉด (Closeable ๊ตฌํ˜„) ์ดํ›„์˜ ์ž‘์—…์ด ๋ถˆ๊ฐ€๋Šฅ ํ•œ ์ ์ด Blocking, Synchronous ์˜ ์˜ˆ์‹œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

 

Closing Streams in Java

Why do we need to close a FileInputStream (and streams in general) in any case before we leave the program? What would happen otherwise? If the program stops before the input stream is closed expli...

stackoverflow.com

Non-Blocking, Synchronous

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ System Call์„ ์š”์ฒญํ•˜๋ฉด Kernel ์—์„œ๋Š” ํ•ด๋‹น ์š”์ฒญ์— ๋Œ€ํ•œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์•˜์ง€๋งŒ, ํ˜„์ƒํƒœ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ฐ˜ํ™˜ํ•˜๋ฉด์„œ ๋™๊ธฐ์ ์œผ๋กœ ์„œ๋กœ ํ†ต์‹ ํ•œ๋‹ค.
์ด ๋•Œ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ Kernel์— ์š”์ฒญํ•œ ์ดํ›„๋กœ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๋‚˜๋จธ์ง€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ, ์š”์ฒญ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ์ƒํƒœ๋ฅผ ์ง€์†์ ์œผ๋กœ ํ™•์ธํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ ๋ฐ˜๋ณต์ ์ธ System Call๋กœ ์ธํ•ด์„œ CPU ๋‚ญ๋น„๋ฅผ ์•ผ๊ธฐํ•œ๋‹ค.

Blocking, Asynchronous

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ดˆ๊ธฐ System Call์— ์˜ํ•ด Kernel์€ ํ•ด๋‹น ์š”์ฒญ์— ๋Œ€ํ•ด ๋๋‚˜์ง€ ์•Š์•˜์ง€๋งŒ ์ด๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์‘๋‹ตํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ œ์–ด๊ถŒ์ด Kernel๋กœ ๋„˜์–ด๊ฐ„ ์ƒํƒœ์ด๋‹ˆ Blocking ์ƒํƒœ๋กœ ์œ ์ง€๋œ๋‹ค.

์ดํ›„์— Kernel์—์„œ ์š”์ฒญ์— ๋Œ€ํ•œ ์ž‘์—…์„ ์™„๋ฃŒํ•œ ๋’ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์‘๋‹ต์„ ํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ Blocking ์ƒํƒœ๊ฐ€ ํ•ด์ œ๋œ๋‹ค.

๋Œ€ํ‘œ์ ์œผ๋กœ Ajax ๊ฐ€ ์žˆ๋‹ค.

Non-Blocking, Asynchronous

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ดˆ๊ธฐ System Call์„ Kernel์— ์š”์ฒญํ•จ๊ณผ ๋™์‹œ์— Kernel์€ ์ด์— ๋Œ€ํ•œ ์‘๋‹ต์„ ํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์— ๊ด€๊ณ„์—†์ด ์ž์‹ ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ Web Socket์ด Non-Blocking, Asynchronous์— ์†ํ•œ๋‹ค.


์ฐธ๊ณ  ์‚ฌ์ดํŠธ

 

Sync VS Async, Blocking VS Non-Blocking

1. Sync VS Async ๋จผ์ € Synchronous์™€ Asynchronous์˜ ์–ด์›์„ ๋ณด์ž. Synchronous์˜ Syn๋Š” together์ด๋ž€ ๋œป์ด๊ณ , chrono๋Š” time์ด๋‹ค. ๋”ฐ๋ผ์„œ Synchronous๋Š” ํ•จ๊ป˜ ์‹œ๊ฐ„์„ ๋งž์ถ˜๋‹ค๋ผ๋Š” ๋œป์œผ๋กœ ํ•ด์„๋œ๋‹ค. ๋ฐ˜๋ฉด์— A

velog.io

 

http://wiki.plateer.com/pages/viewpage.action?pageId=7767390

ํŽ˜์ด์ง€ PLATEER OPEN WIKI ๊ธฐํƒ€๋“ฑ๋“ฑ ๋ฐฐ๋„ˆ์˜ ๋งจ ๋์œผ๋กœ ๋ฐฐ๋„ˆ์˜ ๋งจ ์ฒ˜์Œ์œผ๋กœ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ์˜ ๋์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ ์•Œ ์ˆ˜ ์—†๋Š” ์‚ฌ์šฉ์ž (sonnsk87)๋‹˜์ด ์ž‘์„ฑ, 1์›” 17, 2018์— ์ตœ์ข… ๋ณ€๊ฒฝ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ์˜ ์‹œ์ž‘์œผ๋กœ ์ด๋™

wiki.plateer.com

 

'Programming > Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

F019 - Socket  (0) 2021.06.22
F018 - Serializable (์ง๋ ฌํ™”, ์—ญ์ง๋ ฌํ™”)  (0) 2021.06.16
F016 - File, I/O, Stream  (0) 2021.06.14
F015 - Set (์ž‘์„ฑ ์ค‘)  (0) 2021.05.31
F014 - List (ArrayList, LinkedList, Vector, Stack)  (0) 2021.05.30