🌐 CS & Infra/Operating System

[OS] 07. ν”„λ‘œμ„ΈμŠ€ κ°„ 동기화 및 톡신

devCloud 2023. 10. 16. 11:03
728x90

(1) κ°œμš”

Concurrent Processes (병행 ν”„λ‘œμ„ΈμŠ€)

  • 두 개 μ΄μƒμ˜ ν”„λ‘œμ„ΈμŠ€λ“€μ΄ λ™μ‹œμ— μˆ˜ν–‰λ¨μ„ μ˜λ―Έν•œλ‹€.
    • λ…λ¦½μ μœΌλ‘œ μž‘μ—…μ΄ μˆ˜ν–‰λ˜λ©°, λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ™€ ν˜‘λ ₯ν•˜μ—¬ κΈ°λŠ₯ μˆ˜ν–‰λ„ κ°€λŠ₯ν•˜λ‹€.
    • ν˜‘λ ₯ μˆ˜ν–‰ μ‹œμ— ν”„λ‘œμ„ΈμŠ€ κ°„μ˜ *동기화 λ˜λŠ” 톡신이 ν•„μš”ν•˜λ‹€.
    • 곡유 μžμ›μ„ κ°€μ§€κ³  μˆ˜ν–‰ν•œλ‹€.
  • 병행 ν”„λ‘œμ„ΈμŠ€ μ²˜λ¦¬λŠ” μ œν•œλœ μžμ›μ„ κ³΅μœ ν•˜κΈ° μœ„ν•΄ *μƒν˜Έμž‘μš©μ΄ ν•„μš”ν•˜λ‹€.
  • μƒν˜Έ μž‘μš©ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€λ“€μ„ λ™κΈ°ν™”ν•˜μ§€ μ•ŠμœΌλ©΄ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€.
    • Deadlock 문제, Critical Section 문제, κ²°κ³Όλ₯Ό μ˜ˆμΈ‘ν•  수 μ—†λŠ” 상황 등이 λ°œμƒν•  수 μžˆλ‹€.

*동기화 : ν˜‘λ ₯ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€ 간에 μ‹€ν–‰ μˆœμ„œκ°€ ν•„μš”ν•˜λ‹€. ex)μž…κΈˆμ΄ λλ‚˜μ•Ό 좜금이 μˆ˜ν–‰λ˜μ–΄μ•Ό ν•œλ‹€.
*μƒν˜Έμž‘μš© : μ œν•œλœ μžμ›μ„ κ³΅μœ ν•˜κΈ° μœ„ν•¨μ΄λ©°, μƒν˜Έμž‘μš©ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€λŠ” μˆœμ„œμ— 맞게 μ‹€ν–‰λ˜λ„λ‘ 동기화가 λ˜μ–΄μ•Ό ν•œλ‹€.

 

(2) Concurrent Processes Promblem

βœ”  병행 ν”„λ‘œμ„ΈμŠ€ 처리 κ³Όμ •μ—μ„œ OSκ°€ λ°˜λ“œμ‹œ ν•΄κ²°ν•΄μ•Ό ν•  것

  • λ‹€λ₯Έ Processκ°€ κ΄€μ—¬ν•˜μ§€ λͺ»ν•˜λ„둝 곡유 μžμ›μ˜ μƒν˜Έ 배타적인 μ‚¬μš©(Mutual exclusion)을 보μž₯ν•΄μ•Ό ν•œλ‹€.
  • ν•˜λ‚˜μ˜ κΈ°λŠ₯을 κ³΅λ™μœΌλ‘œ μ‚¬μš©ν•˜μ—¬ μˆ˜ν–‰ν•˜λŠ” 두 ν”„λ‘œμ„ΈμŠ€ κ°„μ˜ λ™κΈ°ν™”(Synchronization)문제λ₯Ό ν•΄κ²°ν•΄μ•Ό ν•œλ‹€. -> ν”„λ‘œμ„ΈμŠ€ 간에 μˆœμ„œλ₯Ό μ •ν•΄μ„œ ν•œ ν”„λ‘œμ„ΈμŠ€λ§Œ μ²˜λ¦¬ν•œλ‹€.
  • 두 개 μ΄μƒμ˜ ν”„λ‘œμ„ΈμŠ€μ˜ μ‹€ν–‰ μˆœμ„œμ™€ λ¬΄κ΄€ν•˜κ²Œ 항상 같은 κ²°κ³Όλ₯Ό 얻을 수 μžˆμ–΄μ•Ό ν•œλ‹€.(일관성)
  • Deadlock 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€.
  • ν”„λ‘œμ„ΈμŠ€ 간에 자료 κ΅ν™˜μ„ μœ„ν•œ λ©”μ‹œμ§€ 전달 방식과 같은 톡신 문제(Communication)의 해결이 ν•„μš”ν•˜λ‹€.

 

➀  Critical Section (μž„κ³„ ꡬ역)

  • μ–΄λ–€ ν”„λ‘œμ„ΈμŠ€κ°€ 곡유 μžμ›μ„ μ ‘κ·Όν•˜λ©΄, κ·Έ ν”„λ‘œμ„ΈμŠ€λŠ” μž„계ꡬ역에 μžˆλ‹€κ³  ν•œλ‹€.
  • μž„κ³„κ΅¬μ—­μ— μ ‘κ·Όν•œ ν”„λ‘œμ„ΈμŠ€λŠ” *μƒν˜Έ 배제λ₯Ό 보μž₯λ°›μ•„μ•Ό ν•œλ‹€.
  • μž„κ³„κ΅¬μ—­μ€ κ°€λŠ₯ν•œ ν•œ 빨리 μˆ˜ν–‰λ˜μ–΄μ•Όλ§Œ ν•˜λ©°, ν”„λ‘œμ„ΈμŠ€κ°€ μž„κ³„κ΅¬μ—­μ— λ“€μ–΄κ°„ ν›„ 블둝 μƒνƒœκ°€ λ˜μ–΄μ„œλŠ” μ•ˆ λœλ‹€.

*μƒν˜Έλ°°μ œ(Mutual Exclusion) : ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€λ§Œ 곡유 μžμ›μ— λŒ€ν•΄ λ°°νƒ€μ μœΌλ‘œ μ ‘κ·Όν•˜κ³  λ‚˜λ¨Έμ§€ ν”„λ‘œμ„ΈμŠ€λ“€μ€ 곡유 λ°μ΄ν„°μ˜ μ ‘κ·Όν•  ν•„μš”κ°€ μžˆλ”λΌλ„ κΈ°λ‹€λ €μ•Ό ν•œλ‹€.

 

 

➀  Mutual Exclusion (μƒν˜Έ 배제)

  • λ‹€μˆ˜μ˜ ν”„λ‘œμ„ΈμŠ€λ“€μ΄ ν•˜λ‚˜μ˜ 곡유 μžμ›(μž„κ³„ ꡬ역)을 μƒν˜Έ λ°°νƒ€μ μœΌλ‘œ μ‚¬μš©ν•œλ‹€.(λ™μ‹œ μ‚¬μš© λΆˆκ°€)
  • 곡유 λ³€μˆ˜μ— μ ‘κ·Ό 쀑인 ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ œμ™Έν•œ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€λ“€μ΄ 곡유 λ³€μˆ˜λ₯Ό μ ‘κ·Όν•˜μ§€ λͺ»ν•˜κ²Œ μ œμ–΄ν•˜λŠ” 기법이닀.

μˆ˜ν–‰μ€‘μΈ ν”„λ‘œμ„ΈμŠ€μ—μ„œ saveκ°€ 되기 전에 λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€κ°€ μˆ˜ν–‰λ˜λ©΄ μ˜³μ€ 닡이 λ‚˜μ˜€μ§€ μ•ŠλŠ”λ‹€.

 

βœ”  Mutual Exclusion Algorithm μš”κ΅¬ 쑰건

  • κ³΅μœ μžμ›μ— λŒ€ν•΄μ„œλŠ” μ–΄λŠ ν•œ μˆœκ°„μ— λ°˜λ“œμ‹œ ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€λ§Œμ΄ μž„κ³„κ΅¬μ—­μ— μ§„μž…ν•΄μ•Ό ν•œλ‹€.
  • μž„κ³„κ΅¬μ—­μ— μ ‘κ·Όν•˜κ³ μž ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€μ˜ μˆ˜ν–‰μ΄ λ¬΄ν•œ λŒ€κΈ°ν•˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€.
  • Starvation이 λ°œμƒν•˜μ§€ μ•Šλ„λ‘ ν•΄μ•Ό ν•œλ‹€.
  • Deadlock이 λ°œμƒν•˜μ§€ μ•Šλ„λ‘ ν•΄μ•Ό ν•œλ‹€.
  • μž„κ³„κ΅¬μ—­μ΄ μ‚¬μš© 쀑이 μ•„λ‹ˆλ©΄ μž„κ³„κ΅¬μ—­μ— μ§„μž…ν•˜κΈ°λ₯Ό μ›ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€μ—κ²Œ μ¦‰μ‹œ μ§„μž…ν•˜λ„λ‘ ν—ˆμš©ν•΄μ•Ό ν•œλ‹€.
  • μž„κ³„κ΅¬μ—­μ— μ§„μž…ν•œ ν”„λ‘œμ„ΈμŠ€λŠ” μΌμ •ν•œ μ‹œκ°„ 내에 μž„κ³„κ΅¬μ—­μ„ λΉ μ Έ λ‚˜μ™€μ•Ό ν•œλ‹€.

 

(3) Mutual Exclusion Algorithm (μƒν˜Έ 배제 μ•Œκ³ λ¦¬μ¦˜)

➀  1단계 Mutual Exclusion Primitive(1단계 μ•Œκ³ λ¦¬μ¦˜)

  • ν•œ μˆœκ°„μ— 단지 ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€λ§Œμ΄ μž„κ³„ ꡬ역에 μ§„μž…ν•˜λ„λ‘ 보μž₯ν•΄μ•Ό ν•œλ‹€.(μƒν˜Έλ°°μ œ 보μž₯)
  • ν•œ 개의 곡유 λ³€μˆ˜λ₯Ό μ΄μš©ν•œλ‹€.(processnumber) -> 동기화λ₯Ό μœ„ν•΄ μ‚¬μš©ν•˜λŠ” 곡유 λ³€μˆ˜λ‹€.

Pseduo Code

program mutex1;
var processnumber;

p0(){ //ν”„λ‘œμ„ΈμŠ€ p0의 μž„κ³„κ΅¬μ—­ procedure
    while(true){
        while(processnumber != 0) //p1의 μ§„μž…μ—¬λΆ€ 확인
        ;
        critical_section
        processnumber = 1; //p1μ—κ²Œ μž„κ³„κ΅¬μ—­ μ§„μž…μˆœμ„œ 양보
    }
}
p1(){ //ν”„λ‘œμ„ΈμŠ€ p1의 μž„κ³„κ΅¬μ—­ procedure
    while(true){
        while(processnumber != 1) //p0의 μ§„μž…μ—¬λΆ€ 확인
        ;
        critical_section
        processnumber = 1; //p0μ—κ²Œ μž„κ³„κ΅¬μ—­ μ§„μž…μˆœμ„œ 양보
    }
}
//main
    processnumber = 1; //κ³΅μœ λ³€μˆ˜λ₯Ό p1 μ§„μž… μˆœμ„œλ‘œ μ΄ˆκΈ°ν™”
    parbegin
     p0(); //p0κ³Ό p1의 λ™μ‹œ μˆ˜ν–‰ -> μ–΄λ–€ 것이 λ¨Όμ € μˆ˜ν–‰λ μ§€λŠ” 상황에 따라 λ³€κ²½
     p1();
    Parend

1단계 μ•Œκ³ λ¦¬μ¦˜μ€ μƒν˜Έλ°°μ œλ₯Ό λ§Œμ‘±μ‹œν‚€μ§€λ§Œ 문제점이 μžˆλ‹€.

  • μž„κ³„κ΅¬μ—­ μ§„μž…μ„ κ΅λŒ€λ‘œ μ§„μž…ν•΄μ•Ό ν•˜κ³ , λΉ λ₯Έ ν”„λ‘œμ„ΈμŠ€λŠ” 느린 ν”„λ‘œμ„ΈμŠ€μ˜ 속도에 μ˜μ‘΄ν•œλ‹€.
  • ν•œ ν”„λ‘œμ„ΈμŠ€κ°€ μž„κ³„ ꡬ역 λ‚΄μ—μ„œ μ€‘μ§€λœλ‹€λ©΄ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€λ„ μˆ˜ν–‰μ„ ν•  수 μ—†λ‹€.
  • 곡유 λ³€μˆ˜ 섀정에 따라 μ‹œμž‘λ˜λŠ” μˆœμ„œκ°€ κ²°μ •λœλ‹€.

 

➀  2단계 Mutual Exclusion Algorithm

  • 두 개의 곡유 λ³€μˆ˜(p0_inside, p1_inside)λ₯Ό μ΄μš©ν•˜μ—¬ μƒν˜Έλ°°μ œλ₯Ό ν•΄κ²°ν•˜κ³ μž ν•œλ‹€.

Pseduo Code

program mutex2;
boolean p0_inside, p1_inside;

p0(){ 
    while(true){
        while(p1_inside == TRUE) 
        ;
        p0_inside = TRUE; //p0이 μž„κ³„κ΅¬μ—­ μ§„μž…μ‹œλ„
        critical_section
        p0_inside = FALSE; //p1μ—κ²Œ μ§„μž…μˆœμ„œ 양보
        remainder section 
    }
}
p1(){ 
    while(true){
        while(p0_inside == TRUE) 
        ;
        p0_inside = TRUE; //p1이 μž„κ³„κ΅¬μ—­ μ§„μž…μ‹œλ„
        critical_section
        p0_inside = FALSE; //p0μ—κ²Œ μ§„μž…μˆœμ„œ 양보
        remainder section 
    }
}
//main
    p0_inside = false, p1_inside = false;
    parbegin
     p0();
     p1();
    Parend

2개의 ν”„λ‘œμ„ΈμŠ€κ°€ λ³‘ν–‰ν•˜λ©΄μ„œ ν•œ 쀄씩 μˆ˜ν–‰ν–ˆμ„ λ•Œ 문제점이 생긴닀.

  • λ™μ‹œμ— μž„κ³„κ΅¬μ—­ μ§„μž…μ΄ κ°€λŠ₯ν•œ κ²½μš°κ°€ λ°œμƒν•˜μ—¬ μƒν˜Έλ°°μ œκ°€ 보μž₯λ˜μ§€ μ•ŠλŠ”λ‹€.
  • 1단계와 λ‹€λ₯΄κ²Œ μˆœμ„œκ°€ μ •ν•΄μ Έ μžˆμ§€ μ•Šλ‹€. (p0이 λ¨Όμ € 듀어와도 되고, p1이 λ¨Όμ € 듀어와도 λœλ‹€.)

 

➀  3단계 Mutual Exclusion Algorithm

  • 2λ‹¨κ³„μ˜ 문제점 ν•΄κ²°

Pseduo Code

program mutex3;
boolean p0_inside, p1_inside;

p0(){ 
    while(true){
        p0_inside = TRUE; 
        while(p1_inside == TRUE) 
        ;
        critical_section
        p0_inside = FALSE; 
        remainder section 
    }
}
p1(){ 
    while(true){
        p1_inside = TRUE; 
        while(p0_inside == TRUE) 
        ;
        critical_section
        p1_inside = FALSE; 
        remainder section 
    }
}
//main
    p0_inside = false, p1_inside = false;
    parbegin
     p0();
     p1();
    Parend

whileλ¬Έ μˆ˜ν–‰ 이전에 μžμ‹ μ˜ ν”Œλž˜κ·Έ(px_inside)λ₯Ό true둜 미리 λ³€κ²½ν•œλ‹€.(μƒν˜Έλ°°μ œλŠ” 보μž₯) ν•˜μ§€λ§Œ κ΅μ°©μƒνƒœκ°€ λ°œμƒ(두 ν”„λ‘œμ„ΈμŠ€κ°€ μˆ˜ν–‰μ„ λͺ»ν•˜λŠ” μƒνƒœ)ν•  μœ„ν—˜μ΄ μžˆλ‹€.

  • 두 ν”„λ‘œμ„ΈμŠ€κ°€ whileλ¬Έ 이전에 μ°¨λ‘€λŒ€λ‘œ px_insideλ₯Ό 각각 true둜 λ³€κ²½ν•˜λ©΄, λ‚΄λΆ€μ˜ whileλ¬Έμ—μ„œ 각각 λ¬΄ν•œ 루프λ₯Ό 돌게 λœλ‹€.
  • while(p1_inside == TRUE)κ³Ό while(p0_inside == TRUE)

 

➀  4단계 Mutual Exclusion Algorithm

  • 1단계와 3단계 μ•Œκ³ λ¦¬μ¦˜μ„ κ²°ν•©ν•œ 것이닀.
  • 3개의 곡유 λ³€μˆ˜(p0_inside, p1_inside, processnumber)λ₯Ό μ΄μš©ν•œλ‹€.

Pseduo Code

program mutex3;
boolean p0_inside, p1_inside;
var processesnumber;

p0(){ 
    while(true){
        p0_inside = TRUE;
        processesnumber = 1;
        while(p1_inside == TRUE and processesnumber == 1) 
        ;
        //p0의 μ§„μž…μ—¬λΆ€ 확인
        critical_section
        p0_inside = FALSE; 
        remainder section 
    }
}
p1(){ 
    while(true){
        p1_inside = TRUE; 
        processesnumber = 0;
        while(p0_inside == TRUE and processesnumber == 0) 
        ;
        //p1의 μ§„μž…μ—¬λΆ€ 확인
        critical_section
        p1_inside = FALSE; 
        remainder section 
    }
}
//main
    p0_inside = false, p1_inside = false;
    parbegin
     p0();
     p1();
    Parend

3단계 μƒν˜Έ 배제 μ•Œκ³ λ¦¬μ¦˜μ˜ κ΅μ°©μƒνƒœ λ°œμƒ μœ„ν—˜μ„ μ œκ±°ν•˜κ³ , μƒν˜Έλ°°μ œλ„ λ§Œμ‘±μ‹œν‚¨λ‹€.

 

(4) Synchronization by Hardware (ν•˜λ“œμ›¨μ–΄μ— μ˜ν•œ 동기)

ν•˜λ“œμ›¨μ–΄μ μΈ μž„κ³„κ΅¬μ—­ 문제 ν•΄κ²°

  • 단일 ν”„λ‘œμ„Έμ„œ(CPU) μ‹œμŠ€ν…œμ—μ„œ μž„κ³„κ΅¬μ—­ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” κ³΅μœ λ³€μˆ˜κ°€ λ³€κ²½λ˜λŠ” λ™μ•ˆ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€κ°€ κ³΅μœ λ³€μˆ˜μ— μ ‘κ·Όν•˜μ§€ λͺ»ν•˜λ„둝 ν˜Ήμ€ μΈν„°λŸ½νŠΈ λ°œμƒμ„ ν—ˆμš©ν•˜μ§€ μ•Šλ„λ‘ μ„€μ •ν•˜λ©΄ λœλ‹€.
  • 더 이상 뢄할이 λΆˆκ°€λŠ₯ν•œ νŠΉλ³„ν•œ ν•˜λ“œμ›¨μ–΄ λͺ…령인 *TestAndSet(targer)을 μ΄μš©ν•˜μ—¬ μž„κ³„κ΅¬μ—­ 문제λ₯Ό ν•΄κ²°ν•˜κ³ μž ν•œλ‹€. (ν•˜λ“œμ›¨μ–΄ μΉ© 이용)

*TestAndSet : 일단 μˆ˜ν–‰μ΄ μ‹œμž‘λ˜λ©΄ μΈν„°λŸ½νŠΈ 없이 λͺ¨λ‘ λλ§ˆμ³μ•Ό ν•˜λŠ” ν•˜λ“œμ›¨μ–΄μ  λͺ…λ Ήλ¬ΈμœΌλ‘œ, κ³΅μœ λ³€μˆ˜ 뢀뢄을 ν•˜λ“œμ›¨μ–΄ 칩으둜 κ΅¬ν˜„ν•œλ‹€. λ‹€μ‹œ λ§ν•΄μ„œ TestAndSet이 μˆ˜ν–‰λ˜λŠ” λ™μ•ˆ λ‹€λ₯Έ 것이 μˆ˜ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€.

 

Pseudo Code

boolean TestAndSet(boolean & target){
    boolean temp = target;
    target = true;
    return temp;
    //target이 false인 경우, temp = false둜 μ„€μ •, false λ°˜ν™˜
}
testandsetexample(){
    boolean lock;
    
    p0(){
        while(true){
            while(TestAndSet(lock))
            ;
            critical section
            lock = false;
            remainder section
        }
    }
    p1(){
        while(true){
            while(TestAndSet(lock))
            ;
            critical section
            lock = false;
            remainder section
        }
    }
    lock = false;
    parbegin
    p0();
    p1();
    parend
}

 

(5) Semaphore(μ„Έλ§ˆν¬μ–΄)

βœ”  μ„Έλ§ˆν¬μ–΄(μž„κ³„κ΅¬μ—­μ—μ„œ ν”„λ‘œμ„ΈμŠ€λ“€μ˜ 동기화 방법)μ •μ˜

  • ν”„λ‘œμ„ΈμŠ€ 동기화 문제 해결을 μœ„ν•œ 두 κ°€μ§€ μ—°μ‚°(P, V)이 ν•„μš”ν•˜λ‹€.
    P : λ„€λœλž€λ“œμ–΄λ‘œ 검사(Proberen)λ₯Ό λ‚˜νƒ€λ‚΄λ©°, ν”„λ‘œμ„ΈμŠ€λ₯Ό λŒ€κΈ°μ‹œμΌœμ„œ λ™μž‘μœΌλ‘œ μž„κ³„κ΅¬μ—­μ— μ§„μž…ν•˜κΈ° μœ„ν•œ μ—°μ‚°(wait), S값을 κ°μ†Œμ‹œν‚¨λ‹€. (κ³΅μœ μžμ›μ„ κ°€μ Έκ°„λ‹€)
    V : λ„€λœλž€λ“œμ–΄λ‘œ 증가(Verhogen)λ₯Ό λ‚˜νƒ€λ‚΄λ©°, λŒ€κΈ° 쀑인 ν”„λ‘œμ„ΈμŠ€λ₯Ό 깨우기 μœ„ν•΄ μ‹ ν˜Έλ₯Ό λ³΄λ‚΄λŠ” λ™μž‘μœΌλ‘œ μž„κ³„κ΅¬μ—­μ—μ„œ λ‚˜μ˜€κΈ° μœ„ν•œ μ—°μ‚°(signal), S값을 μ¦κ°€μ‹œν‚¨λ‹€. (κ³΅μœ μžμ›μ„ λ°˜λ‚©ν•œλ‹€)
    S : μ„Έλ§ˆν¬μ–΄λ₯Ό λ‚˜νƒ€λ‚΄λ©° ν‘œμ€€ λ‹¨μœ„ μ—°μ‚° P와 V에 μ˜ν•΄μ„œλ§Œ μ ‘κ·Όλ˜λŠ” μ •μˆ˜ λ³€μˆ˜λ‘œ, 이 S값을 μ΄μš©ν•˜μ—¬ ν”„λ‘œμ„ΈμŠ€λ“€μ˜ μž„κ³„κ΅¬μ—­ 접근을 μ œμ–΄ν•œλ‹€.

 

μ„Έλ§ˆν¬μ–΄ μ‚¬μš©λ²•κ³Ό Pμ—°μ‚° 및 Vμ—°μ‚° μ •μ˜

while(true){
    P(S);
    μž„κ³„κ΅¬μ—­
    while S <= 0 do no-operation; // S = 0 일 λ•Œ 또 λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€κ°€ κ³΅μœ μžμ›μ„ μš”μ²­ν•˜λ©΄ μŒμˆ˜κ°’μ„ λ°©μ§€
    S = S - 1;
    V(S);
    μž”λ₯˜κ΅¬μ—­
    S = S + 1;
}

 

 

βœ”  μ„Έλ§ˆν¬μ–΄λ₯Ό μ΄μš©ν•œ μƒμ‚°μž/μ†ŒλΉ„μž(λ°μ΄ν„°μ˜ μƒμ‚°μž/μ†ŒλΉ„μž) 문제 ν•΄κ²°

  • κ³΅μœ λ³€μˆ˜ semaphore mutex = 1; -> 버퍼 접근에 λŒ€ν•œ μƒν˜Έ 배제λ₯Ό μœ„ν•œ μ„Έλ§ˆν¬μ–΄
  • κ³΅μœ λ³€μˆ˜ semaphore empty = n; -> 버퍼에 λΉ„μ–΄ μžˆλŠ” ν•­λͺ©μ˜ 개수λ₯Ό μœ„ν•œ μ„Έλ§ˆν¬μ–΄
  • κ³΅μœ λ³€μˆ˜ semaphore full = 0; -> 버퍼에 μ±„μ›Œμ Έ μžˆλŠ” λ°μ΄ν„°μ˜ 개수λ₯Ό μœ„ν•œ μ„Έλ§ˆν¬μ–΄
  • μƒμ‚°μž : 버퍼에 데이터λ₯Ό λ„£κΈ° μœ„ν•΄ λ²„νΌμ˜ λΉ„μ–΄ μžˆλŠ” ν•­λͺ©μ˜ 수(empty)λ₯Ό 1κ°μ†Œμ‹œν‚¨λ‹€.
    • empty값이 0이면 ν”„λ‘œμ„ΈμŠ€κ°€ λΈ”λ‘λœλ‹€. λ‹€μ‹œ 말해 μƒμ‚°μžκ°€ 버퍼에 μ ‘κ·Όν•˜μ§€ λͺ»ν•œλ‹€.
  • μ†ŒλΉ„μž : 버퍼에 μ±„μ›Œμ§„ λ°μ΄ν„°μ˜ 개수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” full값을 1κ°μ†Œμ‹œν‚¨λ‹€.
    • full값이 0이면 ν”„λ‘œμ„ΈμŠ€κ°€ λΈ”λ‘λœλ‹€. λ‹€μ‹œ 말해 μ†ŒλΉ„μžκ°€ 버퍼에 μ ‘κ·Όν•˜μ§€ λͺ»ν•œλ‹€.

 

 

βœ”  μ„Έλ§ˆν¬μ–΄λ₯Ό μ΄μš©ν•œ 데이터 읽기/μ“°κΈ° 문제 ν•΄κ²°

  • κ³΅μœ λ³€μˆ˜ semaphore wrt = 1; -> μ“°κΈ° ν”„λ‘œμ„ΈμŠ€ μ ‘κ·Ό μ‹œ 배타적 μ‚¬μš©μ„ μœ„ν•œ μ„Έλ§ˆν¬μ–΄
  • κ³΅μœ λ³€μˆ˜ semaphore mutex = 1; -> readcount λ³€μˆ˜μ˜ μƒν˜Έ 배제λ₯Ό μœ„ν•œ μ„Έλ§ˆν¬μ–΄
  • int readcount = 0; -> 읽기 ν”„λ‘œμ„ΈμŠ€μ˜ 개수 (초기 값은 0이닀)
  • wrt μ„Έλ§ˆν¬μ–΄λŠ” μ“°κΈ° ν”„λ‘œμ„ΈμŠ€κ°€ μž„κ³„κ΅¬μ—­μ— μžˆμ„ 경우, λ‹€λ₯Έ μ“°κΈ°λ‚˜ 읽기 ν”„λ‘œμ„ΈμŠ€κ°€ μž„κ³„κ΅¬μ—­μ— μ ‘κ·Όν•˜μ§€ λͺ»ν•˜λ„둝 ν•œλ‹€.
  • P(wrt) : 읽기 ν”„λ‘œμ„ΈμŠ€κ°€ 1개 이상인 경우 μ“°κΈ° ν”„λ‘œμ„ΈμŠ€κ°€ μ‹€ν–‰λ˜μ§€ λͺ»ν•˜λ„둝 ν•˜λ‹€.
  • readcount-- : 읽기 ν”„λ‘œμ„ΈμŠ€κ°€ 읽기λ₯Ό 마치고 λΉ μ Έ λ‚˜μ˜€λŠ” κ²½μš°μ— μžμ‹ μ„ μ œμ™Έν•œ λ‹€λ₯Έ 읽기 ν”„λ‘œμ„ΈμŠ€κ°€ μ‘΄μž¬ν•˜λŠ” κ²½μš°μ—λŠ” κ·Έλƒ₯ λΉ μ Έ λ‚˜μ˜¨λ‹€.
  • V(wrt) : μžμ‹ μ΄ λ§ˆμ§€λ§‰ 읽기 ν”„λ‘œμ„ΈμŠ€μΈ κ²½μš°μ—λŠ” μ“°κΈ° ν”„λ‘œμ„ΈμŠ€μ˜ μž„κ³„κ΅¬μ—­ μ§„μž…μ„ ν—ˆμš©ν•œλ‹€.

 

(6) Monitor

κ°œμš” 및 μ •μ˜

  • 순차적으둜만 μ‚¬μš©ν•  수 μžˆλŠ” νŠΉμ • κ³΅μœ μžμ›μ΄λ‚˜ κ³΅μœ μžμ› 그룹을 ν• λ‹Ήν•˜λŠ”λ° μ‚¬μš©λœλ‹€.
  • 데이터 및 ν”„λ‘œμ‹œλ“€μ–΄λ₯Ό ν¬ν•¨ν•˜λŠ” 병행성 ꡬ쑰이닀.
  • κ³΅μœ μžμ›μ— μ ‘κ·Όν•˜κ³ μž ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€λŠ” λ°˜λ“œμ‹œ νŠΉμ • λͺ¨λ‹ˆν„°μ˜ μ§„μž…λΆ€(entry)λ₯Ό ν˜ΈμΆœν•΄μ•Ό ν•œλ‹€.
  • 이미 μ‚¬μš© 쀑인 λͺ¨λ‹ˆν„°μ— λ“€μ–΄κ°€λ €κ³  ν•˜λŠ” λ‹€λ₯Έ ν”„λ‘œμ„ΈλŠ” λ°˜λ“œμ‹œ λŒ€κΈ°ν•΄μ•Ό ν•œλ‹€.

 

λͺ¨λ‹ˆν„°

  • μ„Έλ§ˆν¬μ–΄μ˜ P, V연산이 ν”„λ‘œκ·Έλž¨ 전체에 퍼져 μžˆμ–΄ μ΄λ“€μ˜ 연산이 λ―ΈμΉ˜λŠ” 영ν–₯을 μ „μ²΄μ μœΌλ‘œ νŒŒμ•…ν•˜κΈ° 쉽지 μ•Šμ•„ ν”„λ‘œκ·Έλž¨ μž‘μ„±μ΄ μ–΄λ €μš΄ 단점을 κ·Ήλ³΅ν•˜κΈ° μœ„ν•΄ λͺ¨λ‹ˆν„° 방법이 ν•„μš”ν•˜λ‹€.
    • μ„Έλ§ˆν¬μ–΄μ™€ λΉ„μŠ·ν•œ κΈ°λŠ₯을 ν•˜μ§€λ§Œ μ œμ–΄ν•˜κΈ°κ°€ μš©μ΄ν•˜λ‹€.
  • ν”„λ‘œκ·Έλž˜λ° μ–Έμ—₯μ„œ μ§€μ›ν•œλ‹€. 즉, ν”„λ‘œκ·Έλž¨ 라이브러리 ν˜•νƒœλ‘œ μ§€μ›ν•œλ‹€.
  • 데이터와 이듀 데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ” ν”„λ‘œμ‹œλ“€μ–΄μ˜ 집합이닀. (객체지ν–₯ κ°œλ…)
  • λͺ¨λ‹ˆν„° λ‚΄μ˜ λ°μ΄ν„°λŠ” λͺ¨λ‹ˆν„° 내뢀에 μ˜ν•΄μ„œλ§Œ 접근이 κ°€λŠ₯ν•˜λ―€λ‘œ λͺ¨λ‹ˆν„° μ™ΈλΆ€μ˜ ν”„λ‘œμ„ΈμŠ€λŠ” μ ‘κ·Όν•  수 μ—†μ–΄ 정보 은폐(Informaiton Hiding)라고도 ν•œλ‹€. (객체지ν–₯ κ°œλ…)

 

βœ” λͺ¨λ‹ˆν„° μ‚¬μš©

λͺ¨λ‹ˆν„° ꡬ쑰

  • ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€κ°€ λͺ¨λ‹ˆν„° 내뢀에 머물러 있으면, λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ˜ μ§„μž…μ„ ν—ˆμš©ν•  수 μ—†μœΌλ―€λ‘œ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€λŠ” λͺ¨λ‹ˆν„° λ°–μ—μ„œ signal()이 μžˆκΈ°κΉŒμ§€ λŒ€κΈ°ν•΄μ•Ό ν•œλ‹€.
  • 동기화 기법이 ν•„μš”ν•˜λ‹€λ©΄ ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” 쑰건 λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜μ—¬ ν•΄κ²°ν•œλ‹€.
  • condition x에 λŒ€ν•˜μ—¬ x.wait()와 x.signal()이 μ΄μš©λœλ‹€.
  • 쑰건 λ³€μˆ˜μ—μ„œ 호좜될 수 μžˆλŠ” 연산은 wait와 signal이닀.

 

μ—°μ‚° : x.wait() or wait(x)

x.wait() or wait(x) 연산을 ν˜ΈμΆœν•˜λŠ” ν”„λ‘œμ„ΈλŠ” λ‹€λ₯Έ ν”„λ‘œμ„Έλ₯Ό λ‹€μŒ 연산이 호좜될 λ•ŒκΉŒμ§€ μ€‘λ‹¨μ‹œν‚¨λ‹€. μ„Έλ§ˆν¬μ–΄μ˜ Pμ—°μ‚°κ³Ό μœ μ‚¬ν•˜κ³ , xλŠ” μ„Έλ§ˆν¬μ–΄μ˜ S와 μœ μ‚¬ν•˜λ‹€.


μ—°μ‚° : x.signal() or signal(x)
x.signal() or signal(x)은 μ€‘λ‹¨λœ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€λ₯Ό μž¬κ°œμ‹œν‚¨λ‹€. μ„Έλ§ˆν¬μ–΄μ˜ Vμ—°μ‚°κ³Ό μœ μ‚¬ν•˜λ‹€.

 

ν™˜ν˜• λ²„νΌμ—μ„œ μƒμ‚°μž/μ†ŒλΉ„μž λ¬Έμ œμ— λŒ€ν•œ λͺ¨λ‹ˆν„° μ‚¬μš© μ˜ˆμ‹œ

 

(7) Message

  • ν”„λ‘œμ„ΈμŠ€ κ°„μ˜ 톡신 및 동기화에 μ ν•©ν•œ 비ꡐ적 λ‹¨μˆœν•œ λ©”μ»€λ‹ˆμ¦˜μ΄λ‹€.
  • κ³΅μœ λ³€μˆ˜λ₯Ό μ΄μš©ν•œ 방법은 κ³΅μœ λ³€μˆ˜μ—μ„œ 병λͺ©ν˜„상 λ¬Έμ œκ°€ λ°œμƒν•  수 있고, κ³΅μœ λ³€μˆ˜ 파괴 μ‹œ μ‹œμŠ€ν…œ μ„±λŠ₯의 ν˜„μ €ν•œ μ €ν•˜ λ¬Έμ œκ°€ λ°œμƒν•˜μ—¬ 이에 ν”„λ‘œμ„ΈμŠ€ κ°„ 직접 톡신을 ν†΅ν•˜μ—¬ μƒν˜Έ 간에 μˆœμ„œλ₯Ό μ •ν•˜μ—¬ 동기화λ₯Ό ν•΄κ²°ν•˜κ³ μž ν•œλ‹€.
  • λ©”μ‹œμ§€μ˜ μ •μ˜λŠ” 솑신츑 ν”„λ‘œμ„ΈμŠ€μ™€ μˆ˜μ‹ μΈ‘ ν”„λ‘œμ„ΈμŠ€ 간에 κ΅ν™˜λ  수 μžˆλŠ” μ •λ³΄μ˜ 집합이닀.
  • λΆ„μ‚° OSμ—μ„œ λ©”μ‹œμ§€ λ©”μ»€λ‹ˆμ¦˜μ˜ μ‚¬μš©μ΄ λ³΄νŽΈν™” λ˜μ–΄ μžˆλ‹€.

 

λ©”μ‹œμ§€ ν˜•μ‹
솑신츑 및 μˆ˜μ‹ μΈ‘ μ‹λ³„μž(identifier)길이, ν˜•μ‹(type), data둜 κ΅¬μ„±λœλ‹€.


λ©”μ‹œμ§€ λ°œμƒ μ‹œ 고렀사항
naming 문제 : λ©”μ‹œμ§€ κ΅ν™˜μ— κ΄€κ³„λ˜λŠ” ν•΄λ‹Ή ν”„λ‘œμ„ΈμŠ€λ“€μ΄ μƒλŒ€ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ„€μ •ν•˜λŠ” 방법을 κ²°μ •ν•œλ‹€.
직접 넀이밍과 κ°„μ ‘ 넀이밍 λ°©μ‹μ˜ 두 κ°€μ§€ ν˜•νƒœκ°€ μ‘΄μž¬ν•œλ‹€.

 

➀  직접 Naming Method

  • 솑신츑(sender)이 νŠΉμ • μˆ˜μ‹ μΈ‘(recipient)을 μ„€μ •ν•΄μ•Ό ν•˜κ³ , λ°˜λŒ€λ‘œ λ©”μ‹œμ§€ μˆ˜μ‹ μ„ ν¬λ§ν•˜λŠ” μˆ˜μ‹ μΈ‘μ€ 솑신츑을 μ„€μ •ν•œλ‹€.
  • μΌλŒ€μΌ 톡신 κ΄€κ³„λ‘œ μΈν•˜μ—¬ 보닀 μ•ˆμ „ν•˜κ³  ν™•μ‹€ν•œ λ©”μ‹œμ§€ 톡신이 κ°€λŠ₯ν•˜λ‹€.
process A;
..
send(B, message); //Aκ°€ Bμ—κ²Œ λ©”μ‹œμ§€λ₯Ό 보내겠닀.
..
process B;
..
receive(A, message); //Bκ°€ Aλ‘œλΆ€ν„° λ©”μ‹œμ§€λ₯Ό λ°›κ² λ‹€.
..

 

 

➀  κ°„μ ‘ Naming Method

  • λ©”μ‹œμ§€κ°€ νŠΉμ • λͺ©μ λ§Œμ„ μœ„ν•˜μ—¬ μ‚¬μš©λ˜λŠ” μ˜μ—­μ— μ†‘μ‹ λ˜κ³ , κ·Έ μ˜μ—­μ—μ„œ λ‹€λ₯Έ λ©”μ‹œμ§€λ„ μˆ˜μ‹ ν•˜λŠ” λ°©μ‹μœΌλ‘œ νŠΉμ • μ˜μ—­μ„ μš°νŽΈν•¨(mailbox)이라고 λΆ€λ₯Έλ‹€.
  • λͺ¨λ“  ν”„λ‘œμ„ΈμŠ€ κ°„μ˜ λ©”μ‹œμ§€ κ΅ν™˜μ€ 이 μš°νŽΈν•¨μ„ ν†΅ν•˜μ—¬ μˆ˜ν–‰λœλ‹€.
  • 솑신츑과 μˆ˜μ‹ μΈ‘ 간에 μΌλŒ€μΌ, 일 λŒ€ λ‹€μˆ˜, λ‹€μˆ˜ λŒ€ 일, λ‹€μˆ˜ λŒ€ λ‹€μˆ˜μ˜ 톡신 관계가 κ°€λŠ₯ν•˜λ‹€λŠ” μ μ—μ„œ 맀우 μœ μš©ν•˜λ‹€.
process A;
..
send(mailbox1, message); 
..
process B;
..
receive(mailbox1, message);
..

 

 

βœ”  λ©”μ‹œμ§€ λ°©μ‹μ—μ„œμ˜ κ³ λ €ν•΄μ•Ό ν•  사항

볡사(Copying) 문제

  • 전체 λ©”μ‹œμ§€λ₯Ό μˆ˜μ‹ μΈ‘μ˜ μ£Όμ†Œ 곡간에 λ³΅μ‚¬ν•˜μ—¬ λ‘κ±°λ‚˜, λ˜λŠ” 두 ν”„λ‘œμ„ΈμŠ€ κ°„μ˜ λ©”μ‹œμ§€μ— λŒ€ν•œ 포인터λ₯Ό λ‹¨μˆœνžˆ μ „λ‹¬ν•¨μœΌλ‘œμ¨ ν•΄κ²°ν•œλ‹€.
  • ν•œ ν”„λ‘œμ„ΈμŠ€μ—μ„œ 였λ₯˜κ°€ λ°œμƒν•˜λ”λΌλ„ 이둜 μΈν•˜μ—¬ λ©”μ‹œμ§€μ˜ μ§€μ—­ λ³΅μ‚¬λ³Έλ§Œμ΄ μ†μƒλœλ‹€.
  • 솑신츑 ν”„λ‘œμ„ΈμŠ€μ˜ 버퍼에 λ©”μ‹œμ§€ 볡사, μˆ˜μ‹ μΈ‘ ν”„λ‘œμ„ΈμŠ€μ˜ 버퍼에 λ©”μ‹œμ§€ λ‹€μ‹œ λ³΅μ‚¬ν•œλ‹€.
  • 단점은 λ©”μ‹œμ§€ 볡사가 κΈ°μ–΅μž₯μΉ˜μ™€ CPU의 사이클을 λ‚­λΉ„ν•œλ‹€.

 

버퍼링(Buffering) 문제

  • μˆ˜μ‹ μ„ μœ„ν•œ μ€€λΉ„κ°€ λ˜μ–΄ μžˆμ§€ μ•Šμ„ 경우 솑신츑은 λ©”μ‹œμ§€λ₯Ό 일단 버퍼에 솑신(μ €μž₯)ν•˜κ³  λ‚˜μ€‘μ— μˆ˜μ‹ μΈ‘μ΄ μ€€λΉ„λ˜λ©΄ κ·Έ λ•Œ μ „μ†‘λœλ‹€.
  • 비동기적 톡신을 κ°€λŠ₯ν•˜κ²Œ ν•˜κΈ° μœ„ν•΄μ„œλŠ” 버퍼링 방식이 ν•„μš”ν•˜λ‹€.
  • μˆ˜μ‹ μΈ‘ 상황에 관계없이 μžμ‹ μ˜ 싀행을 계속할 수 μžˆλŠ” 과정을 “set and forget” 운영이라 ν•˜λ©°, μ΄λŠ” μ‹œμŠ€ν…œ λ³‘ν–‰μ„±μ˜ 정도λ₯Ό ν–₯μƒμ‹œν‚¨λ‹€.

 

길이(Length) 문제

  • λ©”μ‹œμ§€μ˜ 길이λ₯Ό κ³ μ •μ μœΌλ‘œ ν•  것인지 λ˜λŠ” κ°€λ³€μ μœΌλ‘œ ν•  것인지λ₯Ό κ²°μ •ν•œλ‹€.
  • 고정길이 λ©”μ‹œμ§€: κ΅¬ν˜„μ΄ μš©μ΄ν•˜λ‚˜, λ²„νΌμ˜ 크기에 λΉ„ν•˜μ—¬ λ©”μ‹œμ§€κ°€ μž‘μ„ 경우 λ²„νΌμ˜ λ‚­λΉ„λ₯Ό μ΄ˆλž˜ν•˜λ©°, λ°˜λŒ€λ‘œ λ©”μ‹œμ§€κ°€ 클 κ²½μš°μ—λŠ” λ©”μ‹œμ§€λ₯Ό λΆ„ν• ν•˜μ—¬ 전솑해야 ν•˜λŠ” 문제점이 μžˆλ‹€.
  • 가변길이 λ©”μ‹œμ§€: λ™μ μœΌλ‘œ 버퍼λ₯Ό μƒμ„±ν•˜λŠ” κ²ƒμœΌλ‘œ κ΅¬ν˜„μ΄ λ³΅μž‘ν•˜κΈ°λŠ” ν•˜λ‚˜ 높은 적응λ ₯을 κ°€μ§„λ‹€.
728x90