๊ด€๋ฆฌ ๋ฉ”๋‰ด

<Hello Hosung๐Ÿ˜Ž/>

[CS ์ง€์‹]Blocking/Non-Blocking, Sync/Async ๊ฐœ๋… ๋ณธ๋ฌธ

๐Ÿ“– CS Information

[CS ์ง€์‹]Blocking/Non-Blocking, Sync/Async ๊ฐœ๋…

์ขŒ์ถฉ์šฐ๋Œ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž ์ผ๊ธฐ๐Ÿง 2024. 8. 16. 11:29

 

๋ถ„๋ช… ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๋ณด๋ฉด ๋ธ”๋กœํ‚น ๊ตฌ์กฐ๋Š” ์–ด์ฉŒ๊ตฌ ์ €์ฉŒ๊ตฌ~, ๋…ผ๋ธ”๋กœํ‚น  ๊ตฌ์กฐ๋Š” ์–ด์ฉŒ๊ตฌ ์ €์ฉŒ๊ตฌ~
์ด๋Ÿฐ ์ด์•ผ๊ธฐ๋ฅผ ๋“ค์–ด ๋ดค์„๊ฑฐ์—์š”๐Ÿ˜

 

์ € ๋˜ํ•œ ๋ธ”๋กœํ‚น, ๋…ผ๋ธ”๋กœํ‚น์— ๋Œ€ํ•ด์„œ ๊ฐ€๋ณ๊ฒŒ ์•Œ๊ณ ์žˆ์–ด ์ข€ ๋” ๋ณต์Šต ๋ฐ ๊ณต์œ ํ• ๊ฒธ ์˜ค๋Š˜ ์ด๋ ‡๊ฒŒ ์ •๋ฆฌ๋ฅผ ํ•˜๊ฒŒ ๋˜์—ˆ์–ด์š”

๋จผ์ € ๋ธ”๋กœํ‚น๊ณผ ๋…ผ๋ธ”๋กœํ‚น์— ๋Œ€ํ•œ ์ฐจ์ด์— ๋Œ€ํ•ด์„œ ๋ฐฐ์šฐ๊ธฐ์ „ ๊ฐ๊ฐ ์–ด๋–ค ๊ฐœ๋…์ธ์ง€ ๋จผ์ € ์„ค๋ช…์„ ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์•„์š”.

๋ธ”๋กœํ‚น (Blocking)

๋ธ”๋กœํ‚น ๋ชจ๋“œ์—์„œ๋Š” ์–ด๋–ค ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ทธ ์ž‘์—…์„ ์š”์ฒญํ•œ ํ”„๋กœ์„ธ์Šค๋‚˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฉˆ์ถฐ ์žˆ๋‹ค.
์ฆ‰, ์š”์ฒญ์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๋‚˜ ์Šค๋ ˆ๋“œ๋Š” ๋‹ค๋ฅธ ์ž‘์—…์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์—†๋‹ค.

 

๋…ผ๋ธ”๋กœํ‚น (Non-Blocking)

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

 

 

์œ„์— ์ฒ˜๋Ÿผ ๊ธ€๋กœ๋งŒ ๋ณด๋ฉด ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์ฃ ....๐Ÿ˜ 
์•„๋ž˜๋Š” ๋ธ”๋กœํ‚น ๊ณผ ๋…ผ๋ธ”๋กœํ‚น์— ๋Œ€ํ•œ ์ผ์ƒ์ƒํ™œ์—์„œ ๋ฒŒ์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ์˜ˆ์‹œ์—์š” ๋ณด์‹œ๋ฉด ์ข€ ๋” ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ์ˆ˜์›” ํ• ๊ฑฐ์—์š”๐Ÿ˜€

 

 

๋ธ”๋กœํ‚น ์˜ˆ์‹œ ) -  ATM์—์„œ ๋ˆ ์ฐพ๊ธฐ

  • ์ƒํ™ฉ: ATM์—์„œ ๋ˆ์„ ์ฐพ๋Š” ๊ฒฝ์šฐ
  • ๋ธ”๋กœํ‚น: ๋ˆ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ATM์—์„œ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 
    ATM์ด ์ž‘์—…์„ ์™„๋ฃŒํ•˜๊ณ  ๋ˆ์„ ์ฃผ๊ธฐ ์ „๊นŒ์ง€๋Š” ๋‹ค๋ฅธ ์ผ์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์—†๋‹ค.

 

๋…ผ๋ธ”๋กœํ‚น ์˜ˆ์‹œ ) - ์ „ํ™” ํ†ตํ™” ์ค‘ ๋ฌธ์ž ๋ฉ”์‹œ์ง€ ํ™•์ธ 

  • ์ƒํ™ฉ: ์ „ํ™” ํ†ตํ™” ์ค‘ ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•˜๊ณ  ๋‹ต์žฅํ•˜๋Š” ์ƒํ™ฉ
  • ๋…ผ๋ธ”๋กœํ‚น: ์ „ํ™” ํ†ตํ™”๊ฐ€ ์ง„ํ–‰ ์ค‘์ผ ๋•Œ, ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•˜๊ณ  ๋‹ต์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „ํ™” ํ†ตํ™”์™€ ๋ฉ”์‹œ์ง€ ํ™•์ธ ์ž‘์—…์ด ๋™์‹œ์— ์ง„ํ–‰๋˜๋ฏ€๋กœ, ์ „ํ™” ํ†ตํ™”๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋‹ค๋ฆด ํ•„์š”๊ฐ€ ์—†๋‹ค.

์ฒซ๋ฒˆ์งธ ์ƒํ™ฉ์€ ์šฐ๋ฆฌ๊ฐ€ ATM์—์„œ ๋ˆ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ATM์— ์นด๋“œ ๋˜๋Š” ํ†ต์žฅ์„ ๋„ฃ์œผ๋ฉด ATM ํ™•์ธ ์ ˆ์ฐจ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š”๋™์•ˆ ์šฐ๋ฆฌ๋Š” ๋ˆ์„ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ธฐ๋‹ค๋ฆฌ๋ฆฌ๋Š” ์ˆ˜ ๋ฐ–์— ์—†์–ด์š”. ์ด๋กœ์จ "์ œ์–ด๊ถŒ" ์€ ์‚ฌ๋žŒ → ATM์œผ๋กœ ์™„์ „ํžˆ ๋„˜์–ด๊ฐ”๋‹ค ๋ผ๊ณ  ๋ณผ์ˆ˜ ์žˆ์–ด์š”.


๋‹ค๋งŒ ๋‘๋ฒˆ์งธ ์ƒํ™ฉ์€ ์šฐ๋ฆฌ๊ฐ€ ์ „ํ™”ํ†ตํ™” ์ค‘ ๋ฌธ์ž ํ™•์ธ, ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰ ๋“ฑ ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์ฃ  "์ œ์–ด๊ถŒ"์ด ์˜ค๋กœ์ง ํ†ตํ™”๋กœ ๋„˜์–ด๊ฐ€์ง€ ์•Š์•„ ์ƒ๊ธด ๋ฌธ์ œ์—์š”.


์ด ์ฒ˜๋Ÿผ ๋ธ”๋กœํ‚น/๋…ผ๋ธ”๋กœํ‚น์€ ์ œ์–ด๊ถŒ์ด ๋„˜์–ด๊ฐ”๋ƒ ์•ˆ๋„˜์–ด๊ฐ”๋ƒ ๊ฐ€ ์ค‘์š”ํ•ด์š” ๐Ÿ˜€

 

 

์œ„์™€ ๊ฐ™์€ ๋‚ด์šฉ์ด ์ดํ•ด๊ฐ€ ๊ฐ”๋‹ค๋ฉด ๊ฐœ๋ฐœ์„ ํ•ด๋ณธ์‚ฌ๋žŒ๋“ค์€ ์•Œ๊ฑฐ์—์š”
???: ๊ทธ๋Ÿผ sync(๋™๊ธฐ), async(๋น„๋™๊ธฐ) ์™€ ๋ธ”๋กœํ‚น๊ณผ, ๋…ผ๋ธ”๋กœํ‚น์ด ๊ฐ™์€๊ฑฐ ์•„๋‹ˆ์—์š”~?๐Ÿ™

→ ์ด๊ฑด ๋‹ค์Œ์— ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”

 

 

์•„๋ž˜๋Š” ๋ธ”๋กœํ‚น ๊ณผ ๋…ผ๋ธ”๋กœํ‚น์— ๋Œ€ํ•œ ์˜ˆ์ œ ์†Œ์Šค์—์š” ๋ณด์‹œ๋ฉด ์ดํ•ด๊ฐ€ ํŽธํ•˜์‹ค๊ฑฐ์—์š”

 

[Blocking]

-  ๋ˆ ์ฐพ๋Š” ํ–‰์œ„๊ฐ€ ์‹œ์ž‘
-  3์ดˆ ๋™์•ˆ ATM ์ž‘์—…
-   ATM ๋ˆ ์ฐพ๊ธฐ ์„ฑ๊ณต  

public class BlockingExample {
    public static void atmWithdrawal() {
        System.out.println("ATM: ๋ˆ์„ ์ฐพ๋Š” ์ค‘...");
        try {
            Thread.sleep(3000); // 3์ดˆ ๋™์•ˆ ๋ธ”๋กœํ‚น
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("ATM: ๋ˆ์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค!");
    }

    public static void main(String[] args) {
        System.out.println("ATM์—์„œ ๋ˆ์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค...");
        atmWithdrawal();
        System.out.println("๋‹ค๋ฅธ ์ž‘์—…์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.");
    }
}

 

[Non-Blocking]
-  ์ „ํ™”ํ†ตํ™” ์‹œ์ž‘, ๋ฌธ์ž๋ฉ”์‹œ์ง€ ํ™•์ธ ์‹œ์ž‘

-  3์ดˆ๊ฐ„ ํ†ตํ™”์ค‘, ์ด์™€ ๋™์‹œ์— 1์ดˆ๋™์•ˆ 3๊ฑด์˜ ๋ฌธ์ž๋ฉ”์‹œ์ง€ ํ™•์ธ

-  ์ „ํ™”ํ†ตํ™” ์ข…๋ฃŒ

public class NonBlockingExample {
    public static void phoneCall() {
        System.out.println("์ „ํ™” ํ†ตํ™” ์‹œ์ž‘...");
        try {
            Thread.sleep(3000); // 3์ดˆ ๋™์•ˆ ์ „ํ™” ํ†ตํ™” ์ค‘
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("์ „ํ™” ํ†ตํ™” ์ข…๋ฃŒ!");
    }

    public static void checkMessages() {
        System.out.println("๋ฌธ์ž ๋ฉ”์‹œ์ง€ ํ™•์ธ ์‹œ์ž‘...");
        for (int i = 0; i < 3; i++) {
            try {
                Thread.sleep(1000); // 1์ดˆ ๋™์•ˆ ๋ฉ”์‹œ์ง€ ํ™•์ธ ์ค‘
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("๋ฉ”์‹œ์ง€ ํ™•์ธ ์ค‘ " + (i + 1));
        }
        System.out.println("๋ฌธ์ž ๋ฉ”์‹œ์ง€ ํ™•์ธ ์™„๋ฃŒ!");
    }

    public static void main(String[] args) {
        Thread phoneThread = new Thread(NonBlockingExample::phoneCall);
        Thread messagesThread = new Thread(NonBlockingExample::checkMessages);

        phoneThread.start();
        messagesThread.start();

        try {
            phoneThread.join();
            messagesThread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("๋ชจ๋“  ์ž‘์—…์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
    }
}