League Of Legends - Link Select [04] ํ”„๋กœ์„ธ์Šค ๋™๊ธฐํ™”
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿค“ Study/์šด์˜์ฒด์ œ

[04] ํ”„๋กœ์„ธ์Šค ๋™๊ธฐํ™”

by GAMEMING 2024. 3. 24.
728x90

 

 

- ๋™๊ธฐํ™” (synchronization)

 : ๋™์‹œ๋‹ค๋ฐœ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ํ”„๋กฏํ—ค์Šค๋“ค์€ ์‹คํ–‰ ์ˆœ์„œ์™€ ์ž์›์˜ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•ด์•ผ ํ•œ๋‹ค

 : ํ”„๋กœ์„ธ์Šค ๋™๊ธฐํ™” = ํ”„๋กœ์„ธ์Šค ์‚ฌ์ด์˜ ์ˆ˜ํ–‰ ์‹œ๊ธฐ๋ฅผ ๋งž์ถ”๋Š” ๊ฒƒ

 : ์ˆ˜ํ–‰ ์‹œ๊ธฐ๋ฅผ ๋งž์ถ˜๋‹ค = ์‹คํ–‰ ์ˆœ์„œ ์ œ์–ด, ์ƒํ˜ธ ๋ฐฐ์ œ

 : 1) ๋™์‹œ์— ์ ‘๊ทผํ•ด์„œ ์•ˆ๋˜๋Š” ์ž์›์— ๋™์‹œ์— ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก ์ œ์–ดํ•˜๋Š” ๊ฒƒ

 : 2) ํŠน์ • ์กฐ๊ฑด์ด ๋งŒ์กฑ๋˜์–ด์•ผ๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์—์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‹คํ–‰๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ

 

 

- ์ƒํ˜ธ ๋ฐฐ์ œ(mutual exclusion)๋ฅผ ์œ„ํ•œ ๋™๊ธฐํ™”

 : ์ƒํ˜ธ ๋ฐฐ์ œ = ๊ณต์œ ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ž์›์˜ ๋™์‹œ ์‚ฌ์šฉ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

 

- ๊ณต์œ  ์ž์› (shared resource)

 : ๊ณต๋™์˜ ์ž์›(์ „์—ญ๋ณ€์ˆ˜, ํŒŒ์ผ, ์ž…์ถœ๋ ฅ์žฅ์น˜ ๋“ฑ), ์ด ๊ณต์œ  ์ž์›์— ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ž์›์ด ์žˆ์Œ. ์ด ์ž์›์— ์ ‘๊ทผํ•˜๋Š” ์ฝ”๋“œ ์˜์—ญ์„ ์ž„๊ณ„๊ตฌ์—ญ(critical section)์ด๋ผ ํ•จ.

 

 

- Race Condition

 : ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ ๋‹ค๋ฐœ์ ์œผ๋กœ ์ž„๊ณ„ ๊ตฌ์—ญ์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ.

 : ๋”ฐ๋ผ์„œ ์ด๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ์ž„๊ณ„๊ตฌ์—ญ์„ ํ•ด๊ฒฐํ•ด์•ผ ํ•จ.

  1) ์ƒํ˜ธ๋ฐฐ์ œ (mutual exclusion) : ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž„๊ณ„๊ตฌ์—ญ์œผ๋กœ ์ง„์ž…ํ–ˆ๋‹ค๋ฉด, ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋Š” ๋“ค์–ด์˜ฌ ์ˆ˜ ์—†๋‹ค.

  2) ์ง„ํ–‰(progress) : ์ž„๊ณ„ ๊ตฌ์—ญ์— ์–ด๋–ค ํ”„๋กœ์„ธ์Šค๋„ ์ง„์ž…ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ๋“ค์–ด๊ฐ€๊ณ ์ž ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋Š” ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

  3) ์œ ํ•œ ๋Œ€๊ธฐ(bounded waiting) : ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ์— ์ง„์ž…ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ๊ทธ ํ”„๋กœ์„ธ์Šค๋Š” ์–ธ์  ๊ฐ€๋Š” ์ž„๊ณ„ ๊ตฌ์—ญ์— ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. (๋“ค์–ด์˜ค๊ธฐ ์œ„ํ•ด ๋ฌดํ•œ์ • ๋Œ€๊ธฐX)

 

 

 

< ๋™๊ธฐํ™” ๊ธฐ๋ฒ• >

 

1. ๋ฎคํ…์Šค ๋ฝ

 : ๋™์‹œ์— ์ ‘๊ทผํ•ด์„œ ์•ˆ ๋˜๋Š” ์ž์›์— ์ ‘๊ทผํ•˜์ง€ ์•Š๋„๋ก ๋งŒ๋“œ๋Š” ๋™๊ธฐํ™” ๋„๊ตฌ.

 : ์ž๋ฌผ์‡  ์—ญํ•  - ํ”„๋กœ์„ธ๋“ค์ด ๊ณต์œ ํ•˜๋Š” ์ „์—ญ ๋ณ€์ˆ˜ lock.

 : ์ž„๊ณ„ ๊ตฌ์—ญ์„ ์ž ๊ทธ๋Š” ์—ญํ•  : acquire ํ•จ์ˆ˜  -   ์ž ๊ฒจ์žˆ๋Š”์ง€ ์‰ด ์ƒˆ ์—†์ด ๋ฐ˜๋ณตํ•ด ํ™•์ธ (busy wait)

 : ์ž„๊ณ„ ๊ตฌ์—ญ์˜ ์ž ๊ธˆ์„ ํ•ด์ œํ•˜๋Š” ์—ญํ•  : release ํ•จ์ˆ˜

 

acquire(){
	while (lock == true)            // ๋งŒ์•ฝ ์ž„๊ณ„ ๊ตฌ์—ญ์ด ์ž ๊ฒจ์žˆ๋‹ค๋ฉด
    ;                               // ์ž„๊ณ„ ๊ตฌ์—ญ์ด ์ž ๊ฒจ ์žˆ๋Š”์ง€๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ™•์ธ
    lock = true;                    // ๋งŒ์•ฝ ์ž„๊ณ„ ๊ตฌ์—ญ์ด ์ž ๊ฒจ์žˆ์ง€ ์•Š์œผ๋ฉด ์ž ๊ธˆ
}


release(){                           
	lock = false;                   // ์ž„๊ณ„ ๊ตฌ์—ญ ์ž‘์—…์ด ๋๋‚ฌ์œผ๋‹ˆ ์ž ๊ธˆ ํ•ด์ œ
}



// ์ž„๊ณ„ ๊ตฌ์—ญ ์ „ํ›„๋กœ ํ˜ธ์ถœํ•˜์—ฌ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋งŒ ์ž„๊ณ„ ๊ตฌ์—ญ์— ์ง„์ž…ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Œ

acquire();
// ์ž„๊ณ„๊ตฌ์—ญ
release();

 

 

 

2. ์„ธ๋งˆํฌ(semaphore)

 : ๋ฎคํ…์Šค ๋ฝ๊ณผ ๋น„์Šทํ•˜๋‚˜, ์ข€ ๋” ์ผ๋ฐ˜ํ™”๋œ ๋ฐฉ์‹์˜ ๋™๊ธฐํ™”

 : ๊ณต์œ  ์ž์›์ด ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ฒฝ์šฐ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ (counting semaphore)

 : ์ „์—ญ๋ณ€์ˆ˜ S -  ์ž„๊ณ„ ๊ตฌ์—ญ์— ์ง„์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค์˜ ๊ฐœ์ˆ˜(์‚ฌ์šฉ ๊ฐ€๋Šฅ ๊ณต์œ  ์ž์› ์ˆ˜)

 : wail ํ•จ์ˆ˜ - ์ž„๊ณ„ ๊ตฌ์—ญ์— ๋“ค์–ด๊ฐ€๋„ ์ข‹์€์ง€, ๊ธฐ๋‹ค๋ ค์•ผ ํ• ์ง€ ๋Œ€๊ธฐ

 : signal ํ•จ์ˆ˜ - ์ž„๊ณ„ ๊ตฌ์—ญ ์•ž์—์„œ ๊ธฐ๋‹ค๋ฆฌ๋Š” ํ”„๋กœ์„ธ์Šค์— ๊ฐ€๋„ ๋œ๋‹ค๋Š” ์‹ ํ˜ธ ๋ณด๋ƒ„

 

wait()
// ์ž„๊ณ„๊ตฌ์—ญ
signal()


wait()
{
	while (S <= 0)
    ;
    S--;
}


signal()
{
	S++
}


// ์„ธ ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‘ ๊ฐœ์˜ ๊ณต์œ ์ž์›์— ์ˆœ์„œ๋Œ€๋กœ ์ ‘๊ทผ

// ํ”„๋กœ์„ธ์Šค1 wait ํ˜ธ์ถœ, S = 2 ์—์„œ -1 ํ•œ ํ›„ ์ž„๊ณ„ ๊ตฌ์—ญ ์ง„์ž…
// ํ”„๋กœ์„ธ์Šค2 wait ํ˜ธ์ถœ, S = 1 ์—์„œ -1 ํ•œ ํ›„ ์ž„๊ฒŒ ๊ตฌ์—ญ ์ง„์ž…
// ํ”„๋กœ์„ธ์Šค3 wait ํ˜ธ์ถœ, S = 0 ์ด๋ฏ€๋กœ ๋ฌดํ•œํžˆ ๋ฐ˜๋ณตํ•˜๋ฉฐ Sํ™•์ธ
// ํ”„๋กœ์„ธ์Šค1 ์ž„๊ณ„๊ตฌ์—ญ ์ž‘์—… ์ข…๋ฃŒ -> signal() ํ˜ธ์ถœ, S += 1
// ํ”„๋กœ์„ธ์Šค3์ด S=1์ž„์„ ํ™•์ธ, -1ํ•œ ํ›„ ์ž„๊ฒŒ ๊ตฌ์—ญ ์ง„์ž…

// ๋ฌธ์ œ๋ฐœ์ƒ ) ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์ž์›์ด ์—†์„ ๊ฒฝ์šฐ ๋ฌดํ•œ ๋ฐ˜๋ณตํ•˜๋ฉฐ S ํ™•์ธ

// wait -> ์ž์›์ด ์—†์„ ๊ฒฝ์šฐ ํ”„๋กœ์„ธ์Šค ์ƒํƒœ๋ฅผ ๋Œ€๊ธฐ๋กœ ๋ฐ”๊พธ๊ณ ,
//         ํ•ด๋‹น PCB๋ฅผ ์„ธ๋งˆํฌ๋ฅผ ์œ„ํ•œ ๋Œ€๊ธฐํ์— ๋„ฃ์Œ


wait()
{
	while (S < 0)
    add this process to Queue;
    sleep();
}


signal()
{
	S++
    if (S <= 0){
    	remove a process a form Queue
        wakeup(p)
    }
}

// ํ”„๋กœ์„ธ์Šค1 wait ํ˜ธ์ถœ, S = 2 ์—์„œ -1 ํ•œ ํ›„ ์ž„๊ณ„ ๊ตฌ์—ญ ์ง„์ž…
// ํ”„๋กœ์„ธ์Šค2 wait ํ˜ธ์ถœ, S = 1 ์—์„œ -1 ํ•œ ํ›„ ์ž„๊ฒŒ ๊ตฌ์—ญ ์ง„์ž…
// ํ”„๋กœ์„ธ์Šค3 wait ํ˜ธ์ถœ, S = -1 ์ด๋ฏ€๋กœ ๋ณธ์ธ์˜ PCB๋ฅผ ๋Œ€๊ธฐ ํ์— ๋„ฃ์Œ (๋Œ€๊ธฐ ์ƒํƒœ ์ „ํ™˜)
// ํ”„๋กœ์„ธ์Šค1 ์ž„๊ณ„ ๊ตฌ์—ญ ์ข…๋ฃŒ, signal() ํ˜ธ์ถœ, S = 0, ํ”„๋กœ์„ธ์Šค3์„ ์ค€๋น„ํ๋กœ ์˜ฎ๊น€
// ๊นจ์–ด๋‚œ ํ”„๋กœ์„ธ์Šค3 ์ž„๊ณ„๊ตฌ์—ญ์ง„์ž…
// ํ”„๋กœ์„ธ์Šค2 ์ž„๊ณ„ ์ž‘์—… ์ข…๋ฃŒ, signal() ํ˜ธ์ถœ, S = 1
// ํ”„๋กœ์„ธ์Šค3 ์ž„๊ณ„ ์ž‘์—… ์ข…๋ฃŒ, signal() ํ˜ธ์ถœ, S = 2