ํฐ์คํ ๋ฆฌ ๋ทฐ
์ด์์ฒด์ : ํ๋ก์ธ์ค ๋๊ธฐํ - ์ธ๋งํฌ์ด
dirmathfl 2020. 6. 19. 23:02ํ๋ก์ธ์ค ๊ฐ์ ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ๊ฑฐ๋, ํ๋์ ๊ณต์ ๋ ์์ญ์ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ ์ฃผ์๊ฐ ํ์ํ๋ค. ์๋ฅผ ๋ค์ด ํ๋ก์ธ์ค A๋ 1๋ฒ์ง ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ 10์ด๋ผ๋ ๊ฐ์ ์ฝ์ด ์ค๊ณ ์ํ์์ผ๋, ํ๋ก์ธ์ค B๊ฐ ํ๋ก์ธ์ค A๊ฐ ์ฝ๋ ์ง์ ์ 20์ด๋ผ๋ ๊ฐ์ผ๋ก ๋ณ๊ฒฝํด ๋ฒ๋ฆฌ๋ฉด ์ํ์ง ์๋ ๊ฐ์ด ๋ฐํ๋๋ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ๋ค. ์ด๋ ๊ฒ ์ํธ์ ์ผ๋ก ์ํฅ์ ๋ฏธ์น๋ ํ๋ก์ธ์ค๋ค์ Cooperating Process๋ผ๊ณ ํ๋ค. ์ด์ ๋ฐ๋์ธ ๊ฒฝ์ฐ Independent Process๋ผ๊ณ ํ๋ค.
๊ฐ ํ๋ก์ธ์ค๋ก ์ธํด ๊ณต์ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ์ง ๋ชปํ๋ ๊ฒ์ ๋ง๊ธฐ ์ํด ๋๊ธฐํ(Synchronization)๊ฐ ํ์ํ๋ค. ์์ ๋งํ ๊ฐ๋จํ ์์์์ ์์น ์๋ ๊ฐ์ ๋ฐํ๋ฐ์ง ์์ผ๋ ค๋ฉด, ํ๋ก์ธ์ค A โ ํ๋ก์ธ์ค B์ ์์๋ฅผ ๋ณด์ฅํ ๊ฒฝ์ฐ ์ด์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค. ์ด ๋ฟ๋ง ์๋๋ผ, ๊ณต์ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ์ ํ๋์ ํ๋ก์ธ์ค๋ง ์ ๊ทผํ ์ ์๋ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ๋ ์๋ค.
Bank Account Problem (์ํ ๊ณ์ข ๋ฌธ์ )
๋๊ธฐํ ๋ฌธ์ ์ค ์ง๊ด์ ์ผ๋ก ์ดํดํ ์ ์๊ณ , ๋ํ์ ์ธ ๋ฌธ์ ๊ฐ ์ํ ๊ณ์ข์ ๊ธ์ก์ด ์ ์ถ๊ธ ๋ ๊ฒฝ์ฐ์ด๋ค. ๋ง์ฝ ์ ์ถ๊ธ ๊ณผ์ ์ ์์๊ฐ ๋ณด์ฅ๋์ง ์๋๋ค๋ฉด, ์์น ์๋ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ๊ฒ ๋ ๊ฒ์ด๋ค.
class BankAccount {
int balance;
void deposit(int amount) {
balance += amount;
}
void withdraw(int amount) {
balance -= amount;
}
int getBalance() {
return balance;
}
}
class Parent extends Thread {
BankAccount b;
int count;
Parent(BankAccount b, int count) {
this.b = b;
this.count = count;
}
public void run() {
for (int i = 0; i < count; i++)
b.deposit(1);
}
}
class Child extends Thread {
BankAccount b;
int count;
Child(BankAccount b, int count) {
this.b = b;
this.count = count;
}
public void run() {
for (int i = 0; i < count; i++)
b.withdraw(1);
}
}
public class Test {
static final int MAX = 100;
public static void main(String[] args) throws InterruptedException {
// ์ํ ๊ณ์ข ๊ฐ์ฒด ์์ฑ
BankAccount b = new BankAccount();
// ์ฐ๋ ๋ ๊ฐ์ฒด ์์ฑ
Parent p = new Parent(b, MAX);
Child c = new Child(b, MAX);
// ์ฐ๋ ๋ ์คํ
p.start();
c.start();
p.join();
c.join();
// ์์ก ์ถ๋ ฅ
System.out.println("Final balance = " + b.getBalance());
}
}
์์ ๊ฐ๋จํ ์๋ฐ ์ฝ๋์ ๊ฐ์ด ์ ๊ธ์ ํ๋ ๊ฐ์ฒด์ธ Parent์ ์ถ๊ธ์ ํ๋ ๊ฐ์ฒด์ธ Child๊ฐ BanckAccount๋ผ๋ ๊ณต์ฉ์์์ ์ฌ์ฉํ๊ณ ์๋ค. ์์ ์ฝ๋๋ ์ฌํํ์ฌ ๋๊ฐ์ ์ฐ๋ ๋๊ฐ ๊ณต์ฉ์์์ ์ฌ์ฉํ๋ฉฐ ์ํฉ์ ๋ฐ๋ผ ์์น์๋ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์๋ค. ์ธ์ ๊ฐ์ ์ด์ ๋ ์ ์ถ๊ธ์ ๋ํ ์์๊ฐ ๋ณด์ฅ๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. (์ฝ๋๋ฅผ ์คํํ๋ฉด ๋งค ์คํ๋ง๋ค ์ ์ถ๊ธ์ ์์๊ฐ ๋ค๋ฅด๊ฒ ์ถ๋ ฅ๋๋ ๊ฒ์ ์ ์ ์๋ค.)
์๊ณ ๊ตฌ์ญ (Critical Section)
์ฌ๋ฌ ํ๋ก์ธ์ค(์ฐ๋ ๋)๊ฐ ์ฌ์ฉํ๋ ๊ณต์ ์์์ ๋ํ ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋ ์ฝ๋ ์์ญ์ ์๊ณ ๊ตฌ์ญ์ด๋ผ๊ณ ํ๋ค. ์ํ ๊ณ์ข ๋ฌธ์ ์ฝ๋์์๋ deposit, withdraw ๋ฉ์๋๊ฐ ์ด์ ํด๋นํ๋ค.
์๊ณ ๊ตฌ์ญ์ ์ฌ๋ฌ ํ๋ก์ธ์ค(์ฐ๋ ๋)๊ฐ ์ง์ ํ๋๋ผ๋ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ์กฐ๊ฑด์ ๋ง์กฑ์ํฌ ํ์๊ฐ ์๋ค.
-
Mutual Exculsion : ์๊ณ ๊ตฌ์ญ์ ํ๋์ ํ๋ก์ธ์ค(์ฐ๋ ๋)๊ฐ ์ง์ ํ ์ํ๋ผ๋ฉด ๋ค๋ฅธ ์ฐ๋ ๋๋ ์ง์ ํ ์ ์๋ค.
-
Progess : 1์ ์กฐ๊ฑด์ ์ถฉ์กฑ์ํค๊ธฐ ์ํด, ์๊ณ ๊ตฌ์ญ์ ์ ๊ทผํ๊ธฐ ์ํ ๋ค๋ฅธ ํ๋ก์ธ์ค(์ฐ๋ ๋)๋ค์ ๋๊ธฐ๊ฐ ํ์ํ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์๊ณ ๊ตฌ์ญ์ ๋์์ ๊ฐ๋จํ๊ณ ์งง์ ์๊ฐ ๋ด์ ์ด๋ฃจ์ด์ ธ์ผ ํ๋ค.
-
Bounded Wating : ์๊ณ ๊ตฌ์ญ์ ์ง์ ํ๋ ํ๋ก์ธ์ค(์ฐ๋ ๋)๋ ์ผ์ ์๊ฐ ๋ด์ ์ง์ ํ ์ ์์ด์ผ ํ๋ค.
ํ๋ก์ธ์ค(์ฐ๋ ๋) ๋๊ธฐํ
์์ ๋ฐ์ํ๋ ๋์์ ์๊ณ๊ตฌ์ญ์ ์ ๊ทผํ๋ ๋ฌธ์ ๋ก ์ธํด ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋๊ธฐํ๊ฐ ํ์ํ๋ค. ๋๊ธฐํ๋ฅผ ํตํด ํ๋ก์ธ์ค์ ์คํ ์์๋ฅผ ์ ์ด ํ ์ ์์ผ๋ฉฐ, ์๊ณ ๊ตฌ์ญ ์ง์ ์ ์ํ ๋ถํ์ํ Wating์ ์ ๊ฑฐํ ์ ์๋ค.
Semaphore (์ธ๋งํฌ์ด)
์๊ณ ๊ตฌ์ญ์ ์ง์ ํ๊ธฐ ์ํด, ์๊ณ ๊ตฌ์ญ์ ์ง์ ํ ์ ์๋ ๊ถํ์ ํ๋ํ๊ณ ๊ถํ์ ํ๋ํ ๊ฒฝ์ฐ์๋ง ์๊ณ ๊ตฌ์ญ์ ์ง์ ํ ์ ์๋๋ก ํ๋ ๋๊ธฐํ ๋ฐฉ์์ ๋งํ๋ค. ์๋ฐ์ ๊ฒฝ์ฐ ์ฐ๋ ๋ ์ฌ์ฉ ์ java.util.concurrent.Semaphore๋ฅผ ํตํด ์ธ๋งํฌ์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ, ์๊ณ ๊ตฌ์ญ์ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
BankAccount Problem (USE Semaphore)
import java.util.concurrent.Semaphore;
class BankAccount {
int balance;
Semaphore s;
BankAccount() {
s = new Semaphore(1);
}
void deposit(int amount) {
try {
s.acquire();
} catch (InterruptedException e) { }
balance += amount;
s.release();
}
void withdraw(int amount) {
try {
s.acquire();
} catch (InterruptedException e) { }
balance -= amount;
s.release();
}
int getBalance() {
return balance;
}
}
๋์์ ์ฌ๋ฌ ์ฐ๋ ๋๊ฐ ์๊ณ ๊ตฌ์ญ์ ์ ๊ทผํ๋ ๊ฒ์ ๋ง๊ธฐ ์ํด ์๋ฐ์์๋ ์์ ๊ฐ์ด ๊ตฌํํ ์ ์๋ค. ๊ธฐ์กด ์ฝ๋์ ๋ฌ๋ฆฌ BackAccount Generator์์ ์ธ๋ชจํฌ์ด ๊ฐ์ฒด๋ฅผ ํ ๋นํ๊ณ , ํ๋์ ์ฐ๋ ๋๋ง ์ ๊ทผํ ์ ์๊ฒ permits์ ๊ฐ์ 1๋ก ์ค์ ํ๋ค. ๋ํ, deposit๊ณผ withdraw ํจ์๊ฐ ํธ์ถ๋๋ฉด, ์ธ๋ชจํฌ์ด๋ฅผ ํ๋/ ํด์ ํ๋ ์ฝ๋๋ฅผ ํตํด ์๊ณ ๊ตฌ์ญ์ ํ๋์ ์ฐ๋ ๋๋ง ์ ๊ทผํ ์ ์๋๋ก ํ ์ ์๋ค.
Ordering
๋จ์ํ ์ธ๋ชจํฌ์ด๋ฅผ ์ ์ฉํ ๊ฒฝ์ฐ์ ๋ฌธ์ ์ ์ ์ฌ์ ํ ์ ์ถ๊ธ์ ๋ํ ์์๋ฅผ ๋ณด์ฅํ์ง ์๋๋ค. ๋ฐ๋ผ์ ์ค์ ์ํฉ์ ๋น์ทํ๊ฒ ์ ์ถ๊ธ์ ๋ฐ๋ฅธ ์์๋ฅผ ๋ณด์ฅ์ํค๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ด ํ์ํ๋ค.
class BankAccount {
int balance;
Semaphore critical;
Semaphore order;
BankAccount() {
critical = new Semaphore(1);
order = new Semaphore(0);
}
void deposit(int amount) {
try {
critical.acquire();
} catch (InterruptedException e) { }
balance += amount;
critical.release();
order.release();
}
void withdraw(int amount) {
try {
order.acquire();
critical.acquire();
} catch (InterruptedException e) { }
balance -= amount;
critical.release();
}
int getBalance() {
return balance;
}
}
์๊ณ ๊ตฌ์ญ์ ๋ํ ์ ๊ทผ์ ์ธ๋ชจํฌ์ด ํ๋ / ํด์ ๋ฅผ ํตํด ๋ณด์ฅํ์๋ค. ์์๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด์๋ ์ธ๋ชจํฌ์ด๋ฅผ 0์ผ๋ก ์ค์ ํ๊ณ , ์ ๊ธํ ๋ ํด์ ํ๊ณ ์ถ๊ธ ํ ๋ ํ๋ํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์์๋ฅผ ๋ณด์ฅํ ์ ์๋ค.
'๐๏ธโโ๏ธ ๊ธฐ๋ฐ ๋ค์ง๊ธฐ > ์ด์์ฒด์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ด์์ฒด์ : ํ๋ก์ธ์ค ๋๊ธฐํ - ๊ต์ฐฉ์ํ (0) | 2020.06.20 |
---|---|
์ด์์ฒด์ : ํ๋ก์ธ์ค ๋๊ธฐํ - ์์ฑ์ โ ์๋น์ (0) | 2020.06.20 |
์ด์์ฒด์ : ํ๋ก์ธ์ค์ ์ฐ๋ ๋ (0) | 2020.06.19 |
์ด์์ฒด์ : CPU ์ค์ผ์ค๋ง (0) | 2020.06.19 |
์ด์์ฒด์ : ํ๋ก์ธ์ค ๊ด๋ฆฌ (0) | 2020.06.18 |