์ฌ๋ฌ ํ๋ก์ธ์ค๋ค์ด ๋์์ critical section์ ์ง์ ํ๋ ๊ฒ์ ๋ง๊ธฐ์ํด ํ์ํ๋ค.
critical section(์๊ณ ๊ตฌ์ญ)
์ ์ฝ๋ ์์์ race condition์ด ๋ฐ์ํ ์ ์๋ ๋ถ๋ถ์ด๋ค
race condition(๊ฒฝ์ ์ํ)๋ ๋ ๊ฐ ์ด์์ concurrentํ ํ๋ก์ธ์ค(ํน์ ์ค๋ ๋)๋ค์ด ํ๋์ ์์(๋ฆฌ์์ค)์ ์ ๊ทผํ๊ธฐ ์ํด ๊ฒฝ์ํ๋ ์ํ
- Mutal Exclusion(์ํธ ๋ฐฐ์ )
์ด๋ค ํ๋ก์ธ์ค๊ฐ critical section์ ์ํ ์ค์ด๋ฉด ๋ค๋ฅธ ๋ชจ๋ ํ๋ก์ธ์ค๋ค์ critical section์ ์ง์ ํ ์ ์๋ค.
- Progress
์๋ฌด๋ critical section์ ์์ ๊ฒฝ์ฐ critical section์ ๋ค์ด๊ฐ๊ณ ์ ํ๋ ํ๋ก์ธ์ค๊ฐ ์์ผ๋ฉด ๋ค์ด๊ฐ๊ฒ ํด์ฃผ์ด์ผํ๋ค.
- Bounded Waiting(์ ํ ๋๊ธฐ)
crtical section์ ๋ค์ด๊ฐ๊ณ ์ ํ๋ ํ๋ก์ธ์ค์ ๋๊ธฐ์๊ฐ์ด ์ ํ์ ์ด์ด์ผ ํ๋ค.
- ์ฆ, ํ๋ก์ธ์ค๊ฐ critical section์ ๋ค์ด๊ฐ๊ธฐ ์ํด ๋ฌดํ๋๊ธฐ๋ฅผ ํ๋ฉด ์๋๋ค.
๋ ๊ฐ์ ํ๋ก์ธ์ค P_i, P_j๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์.
Synchronization variable
int turn;
intially turn=0; -> turn==i๋ฉด P_i๋ critical section์ ๋ค์ด๊ฐ ์ ์๋ค
P_i's code
do{
while(turn!=i); // my turn?
critical section
turn =j; // now it's your turn
remainder section
}while(1);
๋ฐ๋์ ํ ๋ฒ์ฉ ๊ต๋๋ก ๋ค์ด๊ฐ์ผ ํ๊ธฐ ๋๋ฌธ์ ํน์ ํ๋ก์ธ์ค๊ฐ ๋ ์์ฃผ critical section์ ๋ค์ด๊ฐ์ผ ํ๋ค๋ฉด ๋๊ธฐ์๊ฐ์ด ๊ธธ์ด์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๋ ๊ฐ์ ํ๋ก์ธ์ค P_i, P_j๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์.
Synchronization variable
boolean flag[2]; -> ์ด๋ค ํ๋ก์ธ์ค๊ฐ critical section์ ๋ค์ด๊ฐ ์ง ๊ฒฐ์ intially falg[all]=false; -> ์ด๋ค ํ๋ก์ธ์ค๋ critical section์ ๋ค์ด๊ฐ ์ ์์
- flag[i]==true๋ฉด Pi๋ critical section์ ๋ค์ด๊ฐ ์ ์๋ค.
P_i's code
do{
flag[i]=true; // critical section ์ง์
์๊ตฌ
while(flag[j]); // P_j์ flag ํ์ธ
critical section
flag[i]=false; // crtical section ์ข
๋ฃ
remainder section
}while(1);
flag[i], flag[j]๊ฐ ๋ชจ๋ true๋ผ๋ฉด ๋ ํ๋ก์ธ์ค ๋ชจ๋ critical section์ ๋ค์ด๊ฐ์ง ๋ชปํ๊ณ ๋์์์ด ๋๊ธฐํ๋ ์ํฉ์ด ๋ฐ์ํ๋ค.
์์ ๋ ์๊ณ ๋ฆฌ์ฆ์ ํฉ์น ๋ฐฉ๋ฒ์ผ๋ก turn, flag ๋ณ์ ๋ชจ๋ ์ฌ์ฉํ๋ค.
P_i's code
do{
flag[i]=ture; // critical section ์ง์
์๊ตฌ
turn=j; // ์๋๋ฐฉ turn์ผ๋ก ๋ณ๊ฒฝ
while(flag[j]&&turn==j); // ์๋๋ฐฉ์ turn์ด๊ณ , ์๋๋ฐฉ์ด critical section ์ง์
์ ์๊ตฌํ๋ฉด ๋๊ธฐํ๋ค
critical section
flag[i]=false;
remainder section
}while(1);
ํ์ง๋ง ๊ณ์ CPU์ Memory๋ฅผ ์ฌ์ฉํ๋ฉด์ critical section ์ง์ ์ ๋๊ธฐํ๊ธฐ ๋๋ฌธ์
Busy Waiting(spin lock)
์ด ๋ฐ์ํ๋ค
ํ๋์จ์ด์ ์ผ๋ก Test & Modify๋ฅผ atomicํ๊ฒ ์ํํ ์ ์๋๋ก ์ง์ํ๋ ๊ฒฝ์ฐ ์์ ๋ฌธ์ ๋ค์ ๊ฐ๋จํ ํด๊ฒฐํ ์ ์๋ค.
atomic hardware instruction์ ๋ํ์ ์ธ ์๋ก๋ Test_and_set ๋ฑ์ด ์๋ค.
์ด์ ๊น์ง์ ์๊ณ ๋ฆฌ์ฆ๋ค์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ฐ๋ ๊ฒ์ ํ๋์ ๋ช ๋ น์ด๋ก ์ฒ๋ฆฌํ ์ ์์์ง๋ง, Test_and_set ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ์ฝ์ผ๋ฉด์ ์ฐ๋ ๊ฒ๊น์ง ํ๋์ ๋ช ๋ น์ด๋ก ๋์์ ์ํ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋จํ๊ฒ lock์ ๊ฑธ๊ณ ํ ์ ์๋ค.
๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ด๊ณผ ๋์์ lock์ ๊ฑด๋ค
Synchronization variable
boolean lock=false;
P_i's code
do{
while(Test_and_Set(lock)); // ์ด๋ฏธ lock์ด ๊ฑธ๋ ค์๋์ง ํ์ธ
critical section
lock=false;
remainder section
}while(1);
์ธ๋งํฌ์ด(Semaphores)๋ Busy Waiting์ด ํ์ ์๋ ๋๊ธฐํ ๋๊ตฌ์ด๋ฉฐ ์ฌ๋ฌ ํ๋ก์ธ์ค๋ ์ค๋ ๋๊ฐ critical section์ ์ง์ ํ ์ ์๋ signaling ๋ฉ์ปค๋์ฆ์ด๋ค.
์์ ๋ฐฉ์๋ค์ ์ถ์ํํจ์ผ๋ก์จ lock์ด๋ ๊ณต์ ์์ counting์ ๊ฐ๋จํ๊ฒ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
P(S){
while(S<=0 do no-ops);
S--;
}
์์ S๊ฐ ์์๋ผ๋ฉด ์์์ ํ ๋น๋ฐ๊ณ ์์์ ๊ฐ์ ๊ฐ์
V(S){
S++;
}
Synchronization variable
semaphore mutex; -> intially 1: 1๊ฐ์ ํ๋ก์ธ์ค๊ฐ critical section์ ๋ค์ด๊ฐ ์ ์๋ค.
P_i's code
do{
P(mutex);
critical section
V(mutex);
remainder section
}while(1);
๋๊ธฐํ๋ ๊ณผ์ ์์ Busy Waiting์ ๋ฐ์์ผ๋ก ๋นํจ์จ์ ์ด๊ธฐ ๋๋ฌธ์ Block & Wakeup
๋ฐฉ์์ ์ฌ์ฉํ๋ค.
Block
- ์ปค๋์ block์ ํธ์ถํ ํ๋ก์ธ์ค๋ฅผ suspend ์ํด
- ํด๋น ํ๋ก์ธ์ค์ PCB๋ฅผ semaphore์ ๋ํ wait queue์ ์ฝ์
wakeup(P)- block๋ ํ๋ก์ธ์ค์ P๋ฅผ wakeup ์ํด
- ํด๋น ํ๋ก์ธ์ค์ PCB๋ฅผ ready queue์ ์ฝ์
typedef struct{
int value; // ์ธ๋งํฌ์ด ๋ณ์
struct process *L; // block๋ ํ๋ก์ธ์ค๋ค์ ๋๊ธฐ Queue
}semaphore
void P(semaphore S){
S.value--;
if(S.value<0){
add this process to S.L; // block queue์ ์ถ๊ฐ
block(); // ์์์ด ์๋ค๋ฉด block ์ํ๋ก ์ง์
}
}
void V(semaphore S){
S.value++;
if(S.value<=0){
remove a process P from S.L;
wakeup(P); // ์์์ ๊ธฐ๋ค๋ฆฌ๋ ํ๋ก์ธ์ค๋ฅผ ๊นจ์์ค
}
}
S.value++ ๋ก ์์์ ๋ด๋์์์๋ ๋ถ๊ตฌํ๊ณ ์์์ด 0์ดํ๋ผ๋ฉด ์์์ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ ํ๋ก์ธ์ค๊ฐ ์กด์ฌํ๋ค๋ ์๋ฏธ์ด๋ค.
- critical section์ ๊ธธ์ด๊ฐ ๊ธด ๊ฒฝ์ฐ block & Wakeup์ด ์ ๋น
- critical section์ ๊ธธ์ด๊ฐ ๋งค์ฐ ์งง์ ๊ฒฝ์ฐ block & wakeup ์ค๋ฒํค๋๊ฐ busy-wait ์ค๋ฒํค๋๋ณด๋ค ์ปค์ง ์ ์๋ค.
- ์ผ๋ฐ์ ์ผ๋ก๋ block & wakeup์ด ๋ ์ข๋ค
์ธ๋งํฌ์ด์๋ ๋ ๊ฐ์ง์ ํ์ ์ด ์กด์ฌํ๋๋ฐ
- Counting semaphore
- ๋๋ฉ์ธ์ด 0 ์ด์์ธ ์์์ ์ ์๊ฐ
- ์ฃผ๋ก resources counting์ ์ฌ์ฉ๋๋ค.
- Binary semaphore(mutex)
- bool ๊ฐ๋ง ๊ฐ์ง ์ ์๋ค
- ์ฃผ๋ก mutual exclusion(lock/unlock)์ ์ฌ์ฉ๋๋ค.
Producer-Buffer-Consumer ๊ตฌ์กฐ์ผ ๋ ์๊ธฐ๋ ๋ฌธ์ ์
- ๋ ์ด์์ ์์ฐ์๊ฐ ๋น์ด์๋ ๋ฒํผ์ ๋์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๋ ๊ฒฝ์ฐ
- ๋ ์ด์์ ์๋น์๊ฐ ๋์ผํ ๋ฒํผ์ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ
๋ ๊ฒฝ์ฐ ๋ชจ๋ ๋ฒํผ์ ์ ๊ทผํ ์ ์๋๋ก ๋ฝ์ ๊ฑธ์ด์ฃผ์ด์ผ ํ๋ค.
- ๋ฒํผ๊ฐ ๊ฝ ์ฐฌ ๊ฒฝ์ฐ
- ์์ฐ์๋ ์๋น์๊ฐ ๋ฒํผ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋น์ด์๋ ๋ฒํผ๊ฐ ์๊ธธ ๋๊น์ง ๋๊ธฐ
- ๋ฒํผ๊ฐ ๋ชจ๋ ๋น์ด์๋ ๊ฒฝ์ฐ
- ์๋น์๋ ์์ฐ์๊ฐ ๋น์ด์๋ ๋ฒํผ์ ์์ฐ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ ๋๊น์ง ๋๊ธฐ
Synchronization variable
mutual exclusion: binary semaphore
resource count: integer semaphore(full/empty ๋ฒํผ์ ๊ฐ์)
semaphore full=0, empty=n, mutex=1(lock)
do{
produce an item in x
P(empty); // ๋น ๋ฒํผ๊ฐ ์์ผ๋ฉด ํ๋ ์์ผ๋ฉด wait
P(mutex); // lock
...
add x to buffer // ๋ฒํผ์ ๋ฐ์ดํฐ ์ฝ์
...
V(mutex); // unlock
V(full); // full buffer count++
}while(1);
do{
P(full); // ๋ฐ์ดํฐ๊ฐ ๋ค์ด์๋ ๋ฒํผ๊ฐ ์์ผ๋ฉด ํ๋ ์์ผ๋ฉด wait
P(mutex); // lock
...
remove an item from buffer to y // ๋ฐ์ดํฐ ์ถ์ถ
...
V(mutex); // unlock
V(empty); // empty buffer count++
...
consume the item in y
...
}while(1);
ํ ํ๋ก์ธ์ค๊ฐ ๋ฐ์ดํฐ์ ๋ํด write ์์ ์ ์ํํ ๋ ๋ค ๋ฅธ ํ๋ก์ธ์ค๊ฐ ์ ๊ทผํ๋ฉด ์๋๊ณ read ์์ ์ ๋์์ ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ์ํ ๊ฐ๋ฅํ๋๋ก ํ๋ ๋ฌธ์
solution
- writer๊ฐ ๋ฐ์ดํฐ์ ์ ๊ทผ ํ๊ฐ๋ฅผ ์ป๋ ๋ชปํ ์ํ์์๋ ๋๊ธฐ์ค์ธ reader๋ค์ ๋ฐ์ดํฐ์ ๋ํ ์ ๊ทผ์ ํ๊ฐํ๋ค
- writer๋ ๋๊ธฐ์ค์ธ reader๊ฐ ํ๋๋ ์์ ๋ ๋ฐ์ดํฐ์ ์ ๊ทผ์ด ํ์ฉ๋๋ค
- writer๊ฐ ๋ฐ์ดํฐ์ ์ ๊ทผ์ค์ด๋ฉด reader๋ค์ ์ ๊ทผ์ด ๊ธ์ง๋๋ค
- writer๊ฐ ๋ฐ์ดํฐ์ ๋น ์ ธ๋๊ฐ์ผ๋ง reader๋ค์ ์ ๊ทผ์ด ํ์ฉ๋๋ค
Synchronization variable
shared data
- int readcount=0, data semaphore mutex=1, db=1
- db: ๊ณต์ data์ ๋ํ lock/unclok
- mutex: ๊ณต์ ๋ณ์ readcount์ ๋ํ lock/unlock
do{
P(db); // reader๊ฐ ์๋ค๋ฉด lock
...
writing data is perforemd
...
V(db); // unlock
}while(1);
do{
P(mutex); // readcount lock
readcount++;
if(readcount==1) P(db); // ์ต์ด์ reader๋ผ๋ฉด data lock
V(mutex); // readcount unlcok
...
reading data is performed
...
P(mutex); // readcount lock
readcount--;
if(readcount==0) V(db); // ๋ง์ง๋ง reader๋ผ๋ฉด data unlock
V(mutex); // readcount unlock
}while(1);
๊ณ์ํด์ writer๋ reader๊ฐ ๋ค์ด์ค๋ ๊ฒฝ์ฐ ํ ์ชฝ์ด ๊ณ์ ๋๊ธฐํ๋ starvation
์ด ๋ฐ์ํ ์ ์๋ค
ํ์ ์ฐ์ ์์๋ฅผ ๋๊ฑฐ๋ timer๋ฅผ ํตํด write์ read๋ฅผ ๋ฒ๊ฐ์๊ฐ๋ฉด์ ํ๋๋ก ๊ตฌํํ๋ค๋ฉด ํด๊ฒฐํ ์ ์๋ค.
5๋ช ์ ์ฒ ํ์๊ฐ ์ํ์ ๋๋ฌ์์์๊ณ , 5๊ฐ์ ์ ๊ฐ๋ฝ์ด ์๋ค
- ์ฒ ํ์๋ ๋ ๊ฐ์ง ํ๋์ ํ ์ ์*๋ค
- ์์ฌ
- ์๊ฐ
Synchronization variables
semaphore chopstick[5];
- intially all values are 1
do{
P(chopstick[i]); // ์ผ์ชฝ ์ ๊ฐ๋ฝ์ ์ก๋๋ค
P(chopstick[(i+1)%5]); // ์ค๋ฅธ์ชฝ ์ ๊ฐ๋ฝ์ ์ก๋๋ค
...
eat();
...
V(chopstick[i]); // ์ผ์ชฝ ์ ๊ฐ๋ฝ์ ๋ด๋ ค๋๋๋ค
V(chopstick[(i+1)%5]); // ์ค๋ฅธ์ชฝ ์ ๊ฐ๋ฝ์ ๋ด๋ ค๋๋๋ค
...
think();
...
}while(1);
์์ ๊ฐ์ด ๊ตฌํํ๋ฉด ๋งค์ฐ ์ํํ ๋ถ๋ถ์ด ์๋ค.
Deadlock์ ๊ฐ๋ฅ์ฑ
๋ชจ๋ ์ฒ ํ์๊ฐ ๋์์ ๋ฐฐ๊ฐ ๊ณ ํ์ ์ผ์ชฝ ์ ๊ฐ๋ฝ์ ์ง์ ๊ฒฝ์ฐ
- ๋ค๋ฅธ ์ฒ ํ์๊ฐ ์ค๋ฅธ์ชฝ ์ ๊ฐ๋ฝ์ ์ง์ ์ ์๋ค.
solution
- 4๋ช ์ ์ฒ ํ์๋ง์ด ํ ์ด๋ธ์ ๋์์ ์์ ์ ์๋๋ก ํ๋ค.
- ์ ๊ฐ๋ฝ์ ๋ ๊ฐ ๋ชจ๋ ์ง์ ์ ์์ ๋์๋ง ์ ๊ฐ๋ฝ์ ์ง์ ์ ์๊ฒ ํ๋ค
- ์ง์/ํ์ ์ฒ ํ์๋ ์ผ์ชฝ/์ค๋ฅธ์ชฝ ์ ๊ฐ๋ฝ์ ๋จผ์ ์ง๋๋ก ํ๋ค.
์ธ๋งํฌ์ด์ ๋ฌธ์ ์
- ์ฝ๋ฉํ๊ธฐ๊ฐ ํ๋ค๊ณ
- ์ ํ์ฑ์ ์ ์ฆํ๊ธฐ๊ฐ ์ด๋ ต๋ค
- ์๋ฐ์ ํ๋ ฅ์ด ํ์ํ๋ค
- ํ๋ฒ์ ์ค์๊ฐ ๋ชจ๋ ์์คํ ์ ์น๋ช ์ ์ํฅ
V(mutex)์ P(mutex)์ ์์์ ๋ฐ๋ผ deadlock์ด ์๊ธฐ๊ฑฐ๋ mutual exclusion์ด ๊นจ์ง ์ ์๋ค.
Monitor(๋ชจ๋ํฐ)๋ ์ด๋ฌํ ์ธ๋งํฌ์ด์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก
- ๋์ ์ํ์ค์ธ ํ๋ก์ธ์ค ์ฌ์ด์์ ์ถ์ ๋ฐ์ดํฐ์ ์์ ํ ๊ณต์ ๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํ High-level ๋๊ธฐํ ๊ตฌ์กฐ์ด๋ค.
- ๊ณต์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ๊ธฐ ์ํด์๋ ๋ชจ๋ํฐ ๋ด๋ถ procedure๋ฅผ ํตํด์๋ง ์ ๊ทผํ ์ ์๋ค.
- lock์ ๊ฑธ ํ์๊ฐ ์๋ค.
- ๊ณต์ ๋ฐ์ดํฐ ๊ตฌ์กฐ
- ๊ณต์ ๋ฐ์ดํฐ์ ๋ํ ์ฐ์ฐ์ ์ ๊ณตํ๋ ํ๋ก์์ (Precedure)
- ํ์ฌ ํธ์ถ๋ ํ๋ก์์ ๊ฐ์ ๋๊ธฐํ๋ฅผ ์บก์ํํ ๋ชจ๋(module)
ํ๋ก์ธ์ค๋ ์ค์ง ๋ชจ๋ํฐ ๋ด๋ถ์ ํ๋ก์์ ๋ฅผ ํตํด์๋ง ๊ณต์ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋ค. ๋ํ ํ ๋ฒ์ ํ๋์ ํ๋ก์ธ์ค, ์ค๋ ๋๋ง ๋ชจ๋ํฐ์ ์ ๊ทผํ ์ ์๋ค
๋ชจ๋ํฐ์ ์ ๊ทผ์ค์ธ ํ๋ก์ธ์ค๊ฐ ์์ผ๋ฉด ๋ค๋ฅธ ํ๋ก์ธ์ค๋ค์ ๋ชจ๋ํฐ ํ(Monitor Queue)
์์ ๋๊ธฐํ๋ค.
- ์ด ๋ ์กฐ๊ฑด๋ณ์๊ฐ ์ฌ์ฉ๋๋ค
์กฐ๊ฑด ๋ณ์๋ ์ด๋ค ๊ฐ์ ๊ฐ์ง๋๊ฒ ์๋๋ผ ํ๋ก์ธ์ค๋ฅผ sleep ํน์ wakeup ์ํค๋ ์ญํ ์ ํ๋ค
์กฐ๊ฑด ๋ณ์๋ ์ค์ง wait์ signal ์ฐ์ฐ์ ์ํด์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋ค
๊ณต์ ๋ ์์์ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ํ๋ก์ธ์ค์์ ์ ๊ทผํ๋ ๊ฒ์ ๋ง๊ธฐ ์ํ ์ถ์ ๋ฐ์ดํฐ.
- ์ธ๋งํฌ์ด์ ๊ฐ์ ์์์ ์ํ๋ฅผ ๋ํ๋ด๋ ๊ฐ๋จํ ์นด์ดํฐ์ด๋ค.
์ํธ๋ฐฐ์ ๋ผ๊ณ ๋ ํ๋ฉฐ crtical section์ ๊ฐ์ง ์ค๋ ๋์ runnig time์ด ์๋ก ๊ฒน์น์ง ์๋๋ก ๊ฐ๊ฐ ๋จ๋ ์ผ๋ก ์คํํ๊ฒ ํ๋ ๊ธฐ์ .
- ํ๋ก์ธ์ค๋ ์ธ๋งํฌ์ด๋ฅผ ์ฌ์ฉํ๊ณ ์ค๋ ๋๋ ๋ฎคํ ์ค๋ฅผ ์ฌ์ฉํ๋ค
๊ฐ์ฅ ํฐ ์ฐจ์ด๋ ๋๊ธฐํ ๋์์ ๊ฐ์์ด๋ค
- ๋ฎคํ ์ค๋ ๋์์ด ํ๋
- ์ธ๋งํฌ์ด๋ ๋์์ด ํ๋ ์ด์์ผ ๋
์ฐธ๊ณ )
- KOCW ๊ณต๊ฐ๊ฐ์ (2014-1. ์ดํ์ฌ์๋ํ๊ต - ๋ฐํจ๊ฒฝ)