STUDY/OS

[OS] ํ”„๋กœ์„ธ์Šค ๋™๊ธฐํ™” - ์ž„๊ณ„๊ตฌ์—ญ ๋ฌธ์ œ

ozllzL 2022. 4. 7. 19:05

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์˜ˆ์‹œ๋กœ ์‹œ์ž‘ํ•˜๊ฒ ๋‹ค.

๐Ÿ’ฒ์€ํ–‰ ๊ณ„์ขŒ ๋ฌธ์ œ (Bank Account Problem)

๋งŒ์›์ด ๋“ค์–ด์žˆ๋Š” ๊ณ„์ขŒ์— ๋‘ ๋ช…์ด ๋™์‹œ์— ๋งŒ ์›์”ฉ ์ธ์ถœํ•œ๋‹ค๋ฉด?

์ฒซ๋ฒˆ์งธ ์‚ฌ๋žŒ์ด ๋งŒ์›์„ ์ธ์ถœํ•˜์—ฌ ๊ณ„์ขŒ ์ž”์•ก์ด 0์œผ๋กœ ์„ค์ •๋˜๊ธฐ ์ „

๋‘ ๋ฒˆ์งธ ์‚ฌ๋žŒ์ด ๋งŒ์›์„ ์ธ์ถœํ•˜์—ฌ ๊ณ„์ขŒ ์ž”์•ก์„ 0์œผ๋กœ ์„ค์ •ํ•˜๋ ค ํ•œ๋‹ค๋ฉด?

์ž”์•ก์€ 0์ด์ง€๋งŒ ์ด๋งŒ์›์ด ์ธ์ถœ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹๊นŒ?

 

์ข€๋” ์ปด๊ณผ๊ฐ™์ด ๋งํ•ด๋ณด๊ธฐ

๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ์€ํ–‰ ๊ณ„์ขŒ ์ž”์•ก ๋ณ€์ˆ˜ balance๋Š” ํ˜„์žฌ ๊ฐ’์ด 10000์ด๋‹ค.

ํ”„๋กœ์„ธ์Šค A์™€ B๋Š” balance๋ฅผ -10000 ์‹œํ‚ค๋Š” ์ผ์„ ํ•œ๋‹ค.

A๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ balance ๊ฐ’์„ ์ฝ์–ด 10000์„ ๋บ€ ํ›„, ๊ฒฐ๊ณผ ๊ฐ’ 0์„ balance์— ์ €์žฅํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

์ €์žฅํ•˜๊ธฐ ์ „ ๊นŒ์ง€ balance๋Š” 10000์ด๋‹ค.

B ์—ญ์‹œ balance๊ฐ’ 10000์„ ์ฝ์–ด 10000์„ ๋บ€ ๊ฒฐ๊ณผ ๊ฐ’ 0์„ balance์— ์ €์žฅํ•˜๊ณ ์ž ํ•œ๋‹ค.

๊ทธ ์‚ฌ์ด A๊ฐ€ balance๋ฅผ 0์œผ๋กœ ๋งŒ๋“ค์—ˆ์ง€๋งŒ, B๋Š” balance๊ฐ’์„ ๋‹ค์‹œ 0์œผ๋กœ ๋ฎ์–ด์”Œ์šด๋‹ค.

์ด๊ฒŒ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์€ํ–‰์€ ๊ฑฐ๋œ๋‚  ๊ฒƒ์ด๋‹ค.

 

=> ๊ณต์œ  ์ž์›์— ๋™์‹œ์— ์ ‘๊ทผํ•จ์œผ๋กœ์จ ์ƒ๊ธฐ๋Š” ์ž„๊ณ„๊ตฌ์—ญ ๋ฌธ์ œ

 

(๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ์˜ˆ์‹œ ๊ฐ™๊ธด ํ•˜์ง€๋งŒ) ๋น„์Šทํ•œ ๋ฌธ์ œ ์ฝ”๋“œ

public class Main {
    public static void main(String[] args)  {
       SharedBoard board = new SharedBoard();

       Thread th1 = new StudentThread("bin", board);
       Thread th2 = new StudentThread("sanha", board);

       th1.start();
       th2.start();
    }
}

class SharedBoard {
    private int sum = 0;

    /*synchronized*/ public void add(){
        int n = sum;
        Thread.yield();
        n += 10;
        sum = n;
        System.out.println(Thread.currentThread().getName() + " : " + sum);
    }
    public int getSum(){return sum;}
}

class StudentThread extends Thread{
    private SharedBoard board;

    public StudentThread(String name, SharedBoard board){
        super(name);
        this.board = board;
    }

    public void run(){
        for(int i=0; i<10; i++){
            board.add();
        }
    }
}
1. synchronized ์žˆ์„ ๋•Œ

bin : 10
bin : 20
bin : 30
bin : 40
bin : 50
bin : 60
bin : 70
bin : 80
bin : 90
bin : 100
sanha : 110
sanha : 120
sanha : 130
sanha : 140
sanha : 150
sanha : 160
sanha : 170
sanha : 180
sanha : 190
sanha : 200

Process finished with exit code 0
2. synchronized ์—†์„ ๋•Œ

bin : 10
bin : 30
sanha : 20
sanha : 40
sanha : 50
sanha : 60
sanha : 70
sanha : 80
sanha : 90
sanha : 100
sanha : 110
sanha : 120
bin : 40
bin : 50
bin : 60
bin : 70
bin : 80
bin : 90
bin : 100
bin : 110

Process finished with exit code 0

 

๐ŸŒ€๋ณ‘ํ–‰ ํ”„๋กœ์„ธ์Šค์™€ ๋™๊ธฐํ™”

 

  • ๊ฒŒ์ž„์„ ํ•  ๋•Œ ์บ๋ฆญํ„ฐ๊ฐ€ ์›€์ง์ด๋ฉด์„œ, ๋…ธ๋ž˜๋„ ๋‚˜์˜ค๊ฒŒ ํ•˜๋ ค๋ฉด ์—ฌ๋ ค ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•œ๋‹ค.
  • ํ•˜์ง€๋งŒ ํ•˜๋‚˜์˜ CPU๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋ฐ–์— ์‹คํ–‰ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ํ”„๋กœ์„ธ์Šค๋ผ๋ฆฌ ์—ฌ๋Ÿฌ๋ฒˆ ๋ฌธ๋งฅ๊ตํ™˜ํ•˜์—ฌ ๋™์‹œ์— ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•œ๋‹ค.
  • ๋ณ‘ํ–‰ ํ”„๋กœ์„ธ์Šค ๊ฐ„์€ ๋น„๋™๊ธฐ์ ์ด๋‹ค.
    - ๋™๊ธฐ์  : ํ•œ ํ”„๋กœ์„ธ์Šค์˜ ์ž‘์—…์„ ๋๋‚ด๋ฉด ๋‹ค์Œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. (JAVA Sync)
    - ๋น„๋™๊ธฐ์ : ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ฒˆ๊ฐˆ์•„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
                   ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋“ค์ด ์–ด๋–ค ์ƒํƒœ์— ์žˆ๋Š”์ง€, ์–ด๋–ค ์ž์›์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€,
                   ์–ด๋””๊นŒ์ง€ ์‹คํ–‰๋๋Š”์ง€ ๋“ฑ์— ๋Œ€ํ•ด ๋ชจ๋ฅธ ์ฑ„ ์‹คํ–‰๋˜๊ณ  ์žˆ๋‹ค.
  • ๊ณต์œ  ์ž์›์ด ์—†์œผ๋ฉด ์•„๋ฌด ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
    ๊ฒฝ์Ÿ ์ƒํƒœ(Race Condition) : ํ”„๋กœ์„ธ์Šค๋“ค์ด ๊ณต์œ  ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์„œ๋กœ ์ ‘๊ทผ์„ ์‹œ๋„ํ•˜๋Š” ์ƒํ™ฉ
                                         ์ด๋กœ ์ธํ•ด ์ƒํ˜ธ๋ฐฐ์ œ, ๊ต์ฐฉ์ƒํƒœ, ๊ธฐ์•„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  • ์ž„๊ณ„ ์ž์›(Critical Resource) : ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ž์›
    ์ž„๊ณ„ ์˜์—ญ(Critical Section) : ์ž„๊ณ„ ์ž์›์— ์ ‘๊ทผํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ์ฝ”๋“œ ๋ถ€๋ถ„
  • ์ž„๊ณ„ ์˜์—ญ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”
    1. ์ƒํ˜ธ ๋ฐฐ์ œ๋ฅผ ์ž˜ ์ง€์ผœ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค ๋งŒ์ด ์ž„๊ณ„ ์˜์—ญ์— ๋“ค์–ด๊ฐ€์•ผ ํ•œ๋‹ค.(Mutual exclusion)
    2. ์ž„๊ณ„ ์˜์—ญ์— ์žˆ์ง€ ์•Š์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ์ž„๊ณ„์˜์—ญ ์ง„์ž…์„ ๋ง‰์•„์„œ๋Š” ์•ˆ๋œ๋‹ค.(Progress requirement)
    3. ๋น„์–ด์žˆ๋Š” ์ž„๊ณ„ ์˜์—ญ์— ๋Œ€ํ•œ ์ง„์ž…์€ ๋ฐ”๋กœ ํ—ˆ์šฉํ•œ๋‹ค. ํŠน์ • ํ”„๋กœ์„ธ์Šค์˜ ์ง„์ž… ์‹œ๋„๋งŒ ๊ณ„์† ๋ฌด์‚ฐ๋˜์–ด ๊ธฐ์•„๋ฅผ ๊ฒฉ์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.(Bounded-waiting requirement)
    4. ์ž„๊ณ„ ์˜์—ญ์„ ๋ฒ—์–ด๋‚  ๋•Œ๋Š” ์ž์‹ ์ด ๋‚˜์˜ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๋ ค ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
    => ์ด๊ฒŒ ์ง€์ผœ์ง€๊ฒŒ ์ ์ ˆํžˆ ์ฝ”๋”ฉํ•ด์•ผ ํ•œ๋‹ค.

๐ŸฅŠ์ƒํ˜ธ ๋ฐฐ์ œ

  • ์†Œํ”„ํŠธ์›จ์–ด ๊ธฐ๋ฒ•๋“ค
  • Peterson ์•Œ๊ณ ๋ฆฌ์ฆ˜
    - ๊ฒ๋‚˜ ๋ฒ„ํ‹ฐ๋‹ค๊ฐ€ ์ƒ๋Œ€๊ฐ€ ๋๋‚˜๋ฉด ๋„˜์–ด๊ฐ„๋‹ค.
    - ํ˜„์žฌ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ฅผ ์ง€์›ํ•˜๋Š” ์ปดํ“จํ„ฐ์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.
      ์ข…์†์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. -> ๋ฉ”๋ชจ๋ฆฌ ์žฅ๋ฒฝ ์‚ฌ์šฉ

  • Lamport ๋ฒ ์ด์ปค๋ฆฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜
    - ๋ฒˆํ˜ธํ‘œ ๋ฐ›๊ธฐ
    - ๋ฒˆํ˜ธํ‘œ๋ฅผ ๋ฐ›์•˜์œผ๋ฉด์„œ, ๋‚˜๋ณด๋‹ค ์•ž ๋ฒˆํ˜ธ๋ฅผ ๋ฐ›์€ ํ”„๋กœ์„ธ์Šค ์ค‘ ์‹คํ–‰์ค‘์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ๋‚˜ ํ™•์ธ

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

 

๊น€์ฃผ๊ท , ใ€ŒOS? Oh Yes!ใ€, ํœด๋จผ์‹ธ์ด์–ธ์Šค

ํ™ฉ๊ธฐํƒœ ๊น€ํšจ์ˆ˜, ๋ช…ํ’ˆ JAVA Programming ๊ฐœ์ • 4ํŒ, ์ƒ๋Šฅ์ถœํŒ