๐ OS - CPU Scheduling 2 ์์ ์ด์ด์ง๋ ๋ด์ฉ์ ๋๋ค.
๊ณต์ ๋ฐ์ดํฐ์ ๋์ ์ ๊ทผ
์ ๋ฐ์ดํฐ์ ๋ถ์ผ์น ๋ฌธ์ ๋ฅผ ๋ฐ์์ํฌ ์ ์์Race Condition(๊ฒฝ์ ์ํ)
๋ ์ฌ๋ฌ ํ๋ก์ธ์ค๋ค์ด ๋์์ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ ์ํฉ์์, ์ด๋ค ์์๋ก ๋ฐ์ดํฐ์ ์ ๊ทผํ๋๋์ ๋ฐ๋ผ ๊ฒฐ๊ณผ ๊ฐ์ด ๋ฌ๋ผ์ง๋ ์ํฉ์ ๋งํ๋ค.
๊ณต์ ๋ฐ์ดํฐ์ Concurrent access(๋์ ์ ๊ทผ)
์ ๋ฐ์ดํฐ์ ๋ถ์ผ์น ๋ฌธ์ ๋ฅผ ๋ฐ์์ํฌ ์ ์๋ค. ๋ฐ๋ผ์ Race condition
์ ๋ง๊ณ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ํด์๋ ํ๋ ฅ ํ๋ก์ธ์ค ๊ฐ์ ์คํ ์์๋ฅผ ์ ํด์ฃผ๋ ๋ฉ์ปค๋์ฆ์ธ ๋๊ธฐํ(Synchronization)
์ด ํ์ํ๋ค.
์์ ๊ฐ์ ๊ฒฝ์์ํ๋ ๋ณดํต MultiProcessor system
, ์ฆ CPU๊ฐ ๋ง๊ณ ํ๋์ ๋ฉ๋ชจ๋ฆฌ(๊ณต์ ๋ฉ๋ชจ๋ฆฌ)๋ฅผ ์ฌ์ฉํ ๋ ๋ฒ์ด์ง๋ค.๋ํ ์ด์์ฒด์ ์ปค๋ ๋ด๋ถ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ๋ ๋ฃจํด์ด ๊ฒน์น ๋๋ ๋ฒ์ด์ง๋ค.
์์ชฝ ๋ค ์ปค๋ ์ฝ๋์ด๋ฏ๋ก kernel address space๋ฅผ ๊ณต์
์๋๋ ๋์์ count++์ count--๊ฐ ๋ชจ๋ ๋ฐ์๋์ด count๊ฐ ์ด๊ธฐ๊ฐ์ ์ ์งํ๋ ๊ฒ์ด์ง๋ง, ๋ง์ฝ load ํ ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ ์ธํฐ๋ฝํธ ๊ฒฐ๊ณผ๋ ๋ฐ์๋์ง ์๊ณ count++๋ง ๋ฐ์๋๋ค.
์ด๋ ์ปค๋ ๋ชจ๋์ ์ํ์ด ๋๋๊ธฐ ์ ์๋ ์ธํฐ๋ฝํธ๋ฅผ ๋ฐ์ง ์๋๋ก(disable/enable)์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
๋ ํ๋ก์ธ์ค์ ์ฃผ์ ๊ณต๊ฐ์์๋ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ์ง ์์ง๋ง, ์์คํ
์ฝ์ ์ํํ๋ ๋์์๋ ๋ ๋ค ์ปค๋ ์ฃผ์ ๊ณต๊ฐ์ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ค. ๋ฐ๋ผ์ ์ปค๋ ์ฃผ์ ๊ณต๊ฐ์์ ์์
์ ์ํํ๋ ๋์ค์ CPU๋ฅผ ๋นผ์์ผ๋ฉด race condition
์ด ๋ฐ์ํ๋ค.
์ด๋ ์ปค๋ ๋ชจ๋๋ฅผ ์ํ์ค์ผ๋ CPU๊ฐ preept ๋์ง ์๋๋ก ํ๊ณ , ์ปค๋ ๋ชจ๋์์ ์ ์ ๋ชจ๋๋ก ๋์๊ฐ ๋์๋ preept๋๋๋ก ํจ์ผ๋ก์จ ํด๊ฒฐํ ์ ์๋ค.
์ด๋ค CPU๊ฐ ๋ง์ง๋ง์ผ๋ก Count๋ฅผ ์ ์ฅํ๋์ง์ ๋ฐ๋ผ ๊ฒฐ๊ด๊ฐ์ด ๋ฌ๋ผ์ง๋ค. ์ฑ๊ธ ํ๋ก์ธ์์ธ ๊ฒฝ์ฐ 1๋ฒ์์์ ๊ฐ์ด ์ธํฐ๋ฝํธ disable/enable
๋ฐฉ๋ฒ์ผ๋ก๋ ํด๊ฒฐํ ์ ์์ง๋ง ๋ฉํฐ ํ๋ก์ธ์์ ๊ฒฝ์ฐ ์ธํฐ๋ฝํธ ์ ์ด๋ก๋ ํด๊ฒฐ์ด ์๋๋ค.
ํ ๋ฒ์ ํ CPU๋ง ์ปค๋์ ๋ค์ด๊ฐ ์ ์๋๋ก ํ๋ ๋ฐฉ๋ฒ์ด ์์ผ๋ ์ด๋ ๋นํจ์จ์ ์ด๋ค. ๋ง์ฝ ๋ ํ๋ก์ธ์๊ฐ ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ์ ์ ๊ทผํ์ฌ race condition์ ๊ฐ๋ฅ์ฑ์ด ์์์๋ ๋ถ๊ตฌํ๊ณ ํ ๋ฒ์ ํ CPU๋ง ์ปค๋์ ๋ค์ด๊ฐ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์, ์ปค๋ ๋ด๋ถ์ ์๋ ๊ฐ ๊ณต์ ๋ฐ์ดํฐ์ ์ ๊ทผํ ๋๋ง๋ค ๊ทธ ๋ฐ์ดํฐ์ ๋ํด์๋ง lock/unlock
์ ํ๋ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
์์์ ์ด์ ๋ฌธ์ ์ํฉ๋ค์ ์ดํด๋ณด์๊ณ , ๊ทธ๋ ๋ค๋ฉด ๋ฌธ์ ๊ฐ ์๋ค๋ ์ ์ ํ์, ์ฆ ์๋ก ๋ค๋ฅธ ์ฃผ์ฒด ๋์ด ๊ณต์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ๋ ์๋๋ฅผ ํ๋ค๋ ์ ์ ํ์ ๊ทธ ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํ ๊ฒ์ธ์ง ์ด์ ๋ถํฐ ๋ณผ ๊ฒ์ด๋ค.
Critical section
์ ์ฝ๋ ์์์ race condition
์ด ๋ฐ์ํ ์ ์๋ ํน์ ๋ถ๋ถ์ ๋งํ๋ค. ์ฆ ๊ณต์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ๋ ์ฝ๋ ๋ถ๋ถ์ด๋ค.
Critical section
์ผ๋ก ์ธํด ๋ฐ์ํ๋ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋ค์ ์กฐ๊ฑด๋ค์ ๋ง์กฑํด์ผ ํ๋ค.
Mutual Exclusion (์ํธ ๋ฐฐ์ )
Progress (์งํ)
Bounded Waiting (ํ์ ๋๊ธฐ)
critical section ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋จ์ํ ๋ฐฉ๋ฒ์ Lock
์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ฆ, ํ ํ๋ก์ธ์ค๊ฐ critical section์ ๋ค์ด๊ฐ๋ค๋ฉด lock์ ๊ฑธ์ด๋์ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ๋ค์ด์ค์ง ๋ชปํ๊ฒ ํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ํ๋ก์ธ์ค๊ฐ critical section์์ ๋น ์ ธ๋์ค๊ฒ ๋๋ฉด lock์ ํด์
ํ๊ณ ๋์์ ๋๊ธฐํ ์ ํธ๋ฅผ ๋ณด๋ด๋ ๊ฒ์ด๋ค. ๋๊ธฐํ ์ ํธ๋ ๋ค์ ํ๋ก์ธ์ค์๊ฒ critical section์ ์ฌ์ฉํด๋ ์ข๋ค๋ ์ ํธ๋ฅผ ์ฃผ๋ ๊ฒ์ด๋ค. ์๊ณ๊ตฌ์ญ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ 3๊ฐ์ง ์กฐ๊ฑด์ธ ์ํธ ๋ฐฐ์ , ํ์ ๋๊ธฐ, ์งํ์ ์ตํต์ฑ(progress)์ ๋ชจ๋ ๋ง์กฑํ๋ lock, unlock, ๋๊ธฐํ ๊ตฌํ ๋ฐฉ๋ฒ์ ์์๋ณด๋๋ก ํ์.
#include <stdio.h>
typedef enum { false , true} boolean;
extern boolean lock = false;
extern int balance;
int main(){
while(lock == true);
lock = true;
balance = balance + 10;
lock = false;
}
c ์ธ์ด๋ ๋ถ๋ฆฐํจ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด typedef๋ก ์ ์ํ๋ค.
critical section์ ๋ฌธ์ ๊ฐ ๋๋ ๋ค์ด๊ฐ ๋ณ์๋ balance์ด๊ณ , ์ ๊ธ์ lock์ผ๋ก ๊ฑธ์ด๋๋๋ค. false์ด๋ฉด ํ๋ก์ธ์ค๊ฐ ๋ค์ด๊ฐ balance๋ฅผ ์ธ ์ ์๊ณ , true์ด๋ฉด ๊ธฐ๋ค๋ฆฌ๋๋ก ํ๋ค.
์ด์ ์๋ ์๊ณ ๋ฆฌ์ฆ๋ค์ ์ดํด๋ณด๋ฉฐ ์ ์ํ ํด๊ฒฐ๋ฒ๊ณผ ๋ฌธ์ ์ ์ ํ์ ํด๋ณด์.
๋จผ์ turn
๋ณ์ ํ๋๋ง ์ฌ์ฉํ์ฌ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ์์ ๋์ ๋ชจ์ต์ด๋ค. turn์ด 0์ผ๋ p0
, turn์ด 1์ผ๋ p1
์ด critical section์ ์ง์
ํ ์ ์๋๋ก ํ์๋ค. ๋ํ ๊ฐ์ ํ๋ก์ธ์ค๊ฐ critical section์ ๋์ฌ๋ turn๊ฐ์ ๋ฐ๊ฟ
์๋๋ฐฉ ํ๋ก์ธ์ค์ ์ง์
์ ํ๋ฝํ๋ค.
ํ์ง๋ง, ์์ ์๊ณ ๋ฆฌ์ฆ ๊ฐ์ ๊ฒฝ์ฐ turn ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ mutual exclusion์ ๋ณด์ฅ
ํ์ง๋ง, progress๋ ๋ณด์ฅํ์ง ๋ชปํ๋ค.
๊ทธ ๊ฒฝ์ฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋ฐ๋์ ๊ต๋๋ก critical section์ ์ง์ ํ๊ฒ ๋์ด์๋ค. ๋ฌด์กฐ๊ฑด ์๋ํธ์ด critical section์ ๋ค์ด๊ฐ๋ค๊ฐ ๋์์ผ์ง๋ง ๋ด ์ฐจ๋ก๊ฐ ์ค๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ง๋ง ํ๋ก์ธ์ค๋ง๋ค ์๊ณ๊ตฌ์ญ์ ๋ค์ด๊ฐ๋ ค๋ ๋น๋๊ฐ ๋ค๋ฅผ ์ ์๋ค. ๋จ์ p0 ์ด ๋์ฑ ๋น๋ฒํ๊ฒ ์๊ณ๊ตฌ์ญ์ ๋ค์ด๊ฐ๊ณ ์ถ์ง๋ง, ๊ทธ๋ ๋ค ํ๋๋ผ๊ณ p1์ด ํ๋ฒ ์๊ณ๊ตฌ์ญ์ ๋ฌด์กฐ๊ฑด ๋ค์ด๊ฐ๋ค๊ฐ ๋์์ผ์ง๋ง ๋ค์ด๊ฐ ์ ์๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ progress ์กฐ๊ฑด์ ๋ง์กฑํ์ง ๋ชปํ๋ค๊ณ ๋ณผ ์ ์๋ค.
๋๋ฒ์งธ๋ก flag
๋ณ์๋ง์ ์ฌ์ฉํ์ฌ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ ๊ฒฝ์ฐ์ด๋ค. ์ด ์๊ณ ๋ฆฌ์ฆ์ ๋ค์๊ณผ ๊ฐ์ด ์คํ๋๋ค. ๋จผ์ loop ์ ์ง์
ํ๋ฉด์ flag๋ฅผ true
๋ก ์ค์ ํ์ฌ critical section์ ๋ค์ด๊ฐ๊ฒ ๋ค๊ณ ์๋ฆฐ๋ค.
while(flag[j]);
๋ฅผ ํตํด ์๋ ํ๋ก์ธ์ค์๊ฒ flag๊ฐ true๊ฐ
์ ๊ฐ์ง๋์ง ํ์ธํ๊ณ , true์ผ ๊ฒฝ์ฐ ๋๊ธฐ
ํ๋ค.
์๋ ํ๋ก์ธ์ค์ flag๊ฐ false
๊ฐ ๋์์ ๋, critical section์ ์ง์
ํ๊ฒ ๋๋ค.
critical section์ ์คํํ๊ณ ๋์ค๋ฉด, ์์ ์ flag๋ฅผ false
๋ก ๋ง๋ค์ด critical section์ ๋ค์ด๊ฐ ์๊ฐ์ด ์์์ ์๋ฆฐ๋ค.
์ ์๊ณ ๋ฆฌ์ฆ๋ ๋ฌธ์ ๊ฐ ์์ด๋ณด์ด์ง๋ง ์๋์ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๋ง์ฝ
ํ๋ก์ธ์ค i๊ฐ ๋ณธ์ธ์ flag๋ฅผ true๋ก ๋ง๋ ์ํ์์ CPU๋ฅผ ๋ป๊ธด๋ค.
๊ทธ ์ํฉ์์CPU๊ฐ ํ๋ก์ธ์ค j
์๊ฒ ๊ฐ๋ค. ๊ทธ๋ฌ๋ฉดํ๋ก์ธ์ค j๋ flag๋ฅผ true
๋ก ๋ง๋ ๋ค.
์ด ์ํฉ์์๋ ์ ํ๋ก๊ทธ๋จ ๋ชจ๋flag๋ง true
๋ก ๋ง๋ค๊ณ ์๋ฌด๋ critical section์ ๋ค์ด๊ฐ์ง ์์ ์ํฉ์ด๋ค. ์ด ์ํฉ์์ ์๋กwhile๋ฌธ์ flag
๋ฅผ ๋ค์ฌ๋ค๋ณด๋ฉด ์๋๋ฐฉ์flag๊ฐ ๋ชจ๋ true
์ธ ๊ฒ์ด๋ค. ๋ํ ํ ํ๋ก์ธ์ค๊ฐ critical section์ ๋ค์ด๊ฐ๋ค๊ฐ ๋์์ผ์ง๋ง flag๊ฐ์ ๋ฐ๊พธ์ง๋ง, ์๋ฌด๋ critical section์ ๋ค์ด๊ฐ์ง ๋ชปํ๋ flag๊ฐ์ด ๋ฐ๋ ์ผ์ด ์๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก์๋ฌด๋ critical section์ ๋ค์ด๊ฐ์ง ๋ชปํ๊ณ ๊ณ์ ๋๊ธฐ
ํ๊ฒ ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก mutual exclusion
์ ํด๊ฒฐํ์ง๋ง ์๋ฌด๋ critical section์ ๋ค์ด๊ฐ์ง ๋ชปํ๋ ์ํฉ์ด ๋ฐ์ํ๋ค.
์์ ๋๊ฐ์ง ์๊ณ ๋ฆฌ์ฆ ์๋ฌ๋ฅผ ๋ง๊ธฐ ์ํด, turn๊ณผ flag ๋ณ์
๋ฅผ ํจ๊ป ์ฌ์ฉํ ํผํฐ์จ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์๊ณผ ๊ฐ๋ค.
ํ๋ก์ธ์ค p0๊ณผ p1
์ด ์๋ค. ๋จผ์ p0์ flag๋ฅผ true
๋ก , turn์ 1
๋ก ์ค์ ํ๋ค. while(flag[1] && turn = 1);
์ ๋ณด๋ฉด flag[1] = true์ด๊ณ , turn == 1
์ด๋ฉด ๊ธฐ๋ค๋ ค์ผ ํจ์ ์ ์ ์๋ค. ์ด๋ p1์ด flag๊ฐ true
๋ผ๋ฉด p1์ด ๋จผ์ ์คํ๋๋๋ก ๋๊ธฐํ๊ฒ ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. p1์ flag๊ฐ false
๋ผ๋ฉด, p0์ด critical section์ ์คํํ๊ฒ ๋๋ค.
์ด ์๊ณ ๋ฆฌ์ฆ์ด ์์์ ๋งํ 3๊ฐ์ง ์กฐ๊ฑด์ ๋ถํฉํ๋์ง ์ดํด๋ณด์.
โ๏ธ Mutual exclusion :
p0๊ณผ p1์ด ๋์์ ์๊ณ ์์ญ์ ๋ค์ด๊ฐ๋ค๋ ๊ฒ์ flag[0] = flag[1] = true
๋ผ๋ ๊ฒ์ธ๋ฐ, turn์ 0๋๋ 1์ ๊ฐ
์ ๊ฐ์ง ์ ๋ฐ์ ์์ผ๋ฏ๋ก ๋ฅ๋ฆฌ ๋์์ ์๊ณ๊ตฌ์ญ์ ์ง์
ํ์ง ๋ชปํ๋ค. ๋ฐ๋ผ์ ์ํธ ๋ฐฐ์ ๋ ๋ณด์ฅ
ํ๋ค.
โ๏ธ Progress & bounded waiting :
p1๊ฐ ์๊ณ ๊ตฌ์ญ์ ๋ค์ด๊ฐ ์ค๋น๊ฐ ๋์ง ์์์ ๊ฒฝ์ฐ, flag[1] == false
์ด๋ค. ์ฆ p0์ด ์๊ณ๊ตฌ์ญ์ ๋ค์ด๊ฐ ์ ์๋ค.
p1๊ฐ while๋ฌธ์์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ ๋, turn์ 0์ด๊ฑฐ๋ 1
์ด๋ค. ๋ง์ฝ turn์ด 0์ด๋ฉด, p0์ด ์๊ณ๊ตฌ์ญ์ ๋ค์ด๊ฐ ์ ์์ผ๋ฉฐ, turn์ด 1์ด๋ฉด p1์ด ์๊ณ๊ตฌ์ญ์ ๋ค์ด๊ฐ ์ ์๋ค.
p1๊ฐ ์๊ณ๊ตฌ์ญ์ ๋์ค๊ฒ ๋๋ฉด p1์ flag[1]์ false
๋ก ์ค์ ํ๊ณ , p1๊ฐ turn์ 0์ผ๋ก ์ ํ
ํ๊ธฐ ๋๋ฌธ์ p0๊ฐ ์๊ณ๊ตฌ์ญ์ ๋ค์ด๊ฐ ์ ์๊ฒ ๋๋ค.
โ๏ธ ๋ฐ๋ผ์ ์ธ๊ฐ์ง ์กฐ๊ฑด์ ๋ชจ๋ ๋ถํฉ
ํ๋ค.
ํ์ง๋ง ์ด๋ ๊ฒ ์๋ฒฝํ ๊ฒ ๊ฐ์ ํผํฐ์จ์๊ณ ๋ฆฌ์ฆ์๋ ๋ฌธ์ ๊ฐ ์กด์ฌํ๋ค.
Busy Waiting(spin lock)
๋ง์ฝ ์ด๋ค ํ๋ก์ธ์ค๊ฐ critical section์ ๋ค์ด๊ฐ์๋ ์ํ์์ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ CPU๋ฅผ ์ก์ผ๋ฉด while๋ฌธ์ ๋๊ฒ๋๋ค. ํ์ง๋ง ์ด ์ํฉ์์๋ ์ ๋ ๋น ์ ธ๋๊ฐ ์๊ฐ ์๋ค. ๋ณธ์ธ์ CPUํ ๋น์๊ฐ๋์ ๊ณ์ while๋ฌธ์ ์ฒดํฌํ์ง๋ง ์ ๋ ๋น ์ ธ๋๊ฐ ์๊ฐ ์๋ค.
์ด ๊ฒฝ์ฐ ์๋๋ฐฉ์ CPU๋ฅผ ์ก์ ๋ค์ while๋ฌธ์ ๋น ์ ธ๋๊ฐ ์ ์๋ ์กฐ๊ฑด์ ๋ง๋ค์ด์ค์ผ์ง๋ง ๋น ์ ธ๋์ฌ ์ ์๋ค.
์ด๋ฌํ ์ํฉ์ Busy waiting์ด๋ผ๊ณ ํ๋ค.
์์์๋ ๋ณต์กํ ์ํํธ์จ์ด์ ์ธ ์ ๊ทผ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํ๋ค. ํ์ง๋ง ํ๋์จ์ด์ ์ผ๋ก๋ ํ๋์ instruction๋ง ์ฃผ์ด์ง๋ฉด critical section ๋ฌธ์ ๋ ์์ฃผ ์ฝ๊ฒ ํด๊ฒฐ๋๋ค.
Test & modify
๋ฅผ atomic
ํ๊ฒ ์ํํ ์ ์๋๋ก ์ง์ํ๋ ๊ฒฝ์ฐ ์์ ๋ฌธ์ ๋ ๊ฐ๋จํ ํด๊ฒฐ์์ ๋ฌธ์ ๊ฐ ์๊ฒผ๋ ์ด์ ๋ ์ด๋ ํ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฑฐ๋ ์ฝ๋ ๊ฒ์ ํ๋์ instruction์ผ๋ก ์ฒ๋ฆฌํ์ง ๋ชปํ๊ธฐ
๋๋ฌธ์ด๋ค. ๋ง์ฝ ์ด๋ ํ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ผ๋ฉด์ ๋์์ ์ฐ๋
, ์ฆ ํ๋์ instruction์ผ๋ก ์คํ์ด ๊ฐ๋ฅํ๋ค๋ฉด ์ ์ด๋ instruction ํ๋๊ฐ ์คํ๋๋ ๋์์ CPU๋ฅผ ๋นผ์๊ธธ ์ผ์ ์๋ค.
๋ณดํต ์ด๋ฐ๊ฒ๊ณผ ๊ด๋ จ๋ instruction์ผ๋ก Test_and_set
์ ๊ผฝ๋๋ค. ์ด instruction์ a๋ผ๋ ๊ฐ์ ์ฝ์ด์ค๊ณ ์ด ๊ฐ์ 1
๋ก ๋ฐ๊ฟ์ฃผ๋ instruction์ด๋ค.
ํ๋์จ์ด์ ์ผ๋ก ์ด๊ฒ ์ง์์ด ๋๋ค๋ฉด critical section์ ๋ค์ด๊ฐ๊ธฐ ์ ์ lock์ ๊ฑธ๊ณ , ๋น ์ ธ๋์ฌ ๋ lock์ ํธ๋ ์ฝ๋๊ฐ ๊ฐ๋จํ๊ฒ ๊ตฌํ์ด ๋๋ค.