Skip to content

Latest commit

 

History

History
553 lines (412 loc) · 20.5 KB

보충3__교착상태.md

File metadata and controls

553 lines (412 loc) · 20.5 KB

보충3__교착상태


보충3.1 🍂 시스템 모델 secho

0번. 다음은 교착상태에 대한 설명입니다 빈칸을 채워주세요

충분한 한정된

교착상태란 프로세스에게 ___자원이 분배되었을 때 프로세스들이 자원의 부족으로 더이상 실행할 수 없어 끝낼수도 없으며, 자원이 프로세스에게 묶여 다른 작업을 시작하는 것도 불가능한 상태를 말한다.

1번. 프로세스는 다음 순서로만 자원을 사용할 수 있습니다. 간단하게 채워주세요

  1. 요청 :
  2. 사용 :
  3. 방출 :
📄 답지

0번. 다음은 교착상태에 대한 설명입니다 빈칸을 채워주세요 충분한 한정된 교착상태란 프로세스에게 한정된자원이 분배되었을 때 프로세스들이 자원의 부족으로 더이상 실행할 수 없어 끝낼수도 없으며, 자원이 프로세스에게 묶여 다른 작업을 시작하는 것도 불가능한 상태를 말한다.

1번. 프로세스는 다음 순서로만 자원을 사용할 수 있습니다. 간단하게 채워주세요

  1. 요청 : 쓰레드의 자원 요청, 요청이 혀용되지 않으면 대기
  2. 사용 : 자신의 임계구역에 접근해 작업을 수행함
  3. 방출 : 자원 방출



보충3.2 🍂 다중 스레드 응용에서의 교착상태 jehong

문제 1

다음 코드를 보고 질문에 답하세요. (필요한 경우 보기를 참고하세요)

//mutex 락 생성
pthread_mutex_t first_mutex;
pthread_mutex_t second_mutex;

//mutex 락 초기화
pthred_mutex_init(&first_mutex,NULL);
pthred_mutex_init(&second_mutex,NULL);

//thread_one
void *do_work_one(void *param)
{
  pthread_mutex_lock(&first_mutex);
  pthread_mutex_lock(&second_mutex);
  /**
   * Do some work
   */
  pthred_mutex_unlock(&second_mutex);
  pthred_mutex_unlock(&first_mutex);
}

//thread_two
void *do_work_two(void *param)
{
  pthread_mutex_lock(&second_mutex);
  pthread_mutex_lock(&first_mutex);
  /**
   * Do some work
   */
  pthred_mutex_unlock(&first_mutex);
  pthred_mutex_unlock(&second_mutex);
}

<보기>

first_mutex, second_mutex

1) first_mutex, 2) second_mutex

1) second_mutex, 2) first_mutex

  1. 위 코드에서 thread_one은 _________________________ 순서로 mutex 락을 획득하려고 하고 동시에 thread_two는 _________________________ 순서로 mutex 락을 획득하려고 한다.

  2. thread_one이 ____________를 획득하고 thread_two가 ____________를 획득하면 교착 상태가 가능하다.

  3. 위 코드에서 교착 상태가 발생하지 않는 경우는 어떤 경우인가요?

문제 2

  1. 다음 코드가 라이브락으로 이어질 수 있도록 (A), (B), (C)를 채워주세요.

    <보기>

    done, True, False, first_mutex, second_mutex

    //thread_one
    void *do_work_one(void *param)
    {
    	int done = 0;
      
      while (!👉👉🏻👉🏼👉🏽👉🏾👉🏿(A)👈🏿👈🏾👈🏽👈🏼👈🏻👈) {
        pthread_mutex_lock(&first_mutex);
        if (pthread_mutex_trylock(&👉👉🏻👉🏼👉🏽👉🏾👉🏿(B)👈🏿👈🏾👈🏽👈🏼👈🏻👈)) {
          /**
     		   * Do some work
           */
          pthred_mutex_unlock(&second_mutex);
          pthred_mutex_unlock(&first_mutex);
          done = 1;
        }
        else
          pthread_mutex_unlock(&first_mutex);
      }
      pthread_exit(0);
    }
    
    //thread_two
    void *do_work_two(void *param)
    {
    	int done = 0;
      
      while (!👉👉🏻👉🏼👉🏽👉🏾👉🏿(A)👈🏿👈🏾👈🏽👈🏼👈🏻👈) {
        pthread_mutex_lock(&second_mutex);
        if (pthread_mutex_trylock(&👉👉🏻👉🏼👉🏽👉🏾👉🏿(C)👈🏿👈🏾👈🏽👈🏼👈🏻👈)) {
          /**
     		   * Do some work
           */
          pthred_mutex_unlock(&first_mutex);
          pthred_mutex_unlock(&second_mutex);
          done = 1;
        }
        else
          pthread_mutex_unlock(&second_mutex);
      }
      pthread_exit(0);
    }
📄 답지

문제 1

다음 코드를 보고 질문에 답하세요. (필요한 경우 보기를 참고하세요)

//mutex 락 생성
pthread_mutex_t first_mutex;
pthread_mutex_t second_mutex;

//mutex 락 초기화
pthred_mutex_init(&first_mutex,NULL);
pthred_mutex_init(&second_mutex,NULL);

//thread_one
void *do_work_one(void *param)
{
  pthread_mutex_lock(&first_mutex);
  pthread_mutex_lock(&second_mutex);
  /**
   * Do some work
   */
  pthred_mutex_unlock(&second_mutex);
  pthred_mutex_unlock(&first_mutex);
}

//thread_two
void *do_work_two(void *param)
{
  pthread_mutex_lock(&second_mutex);
  pthread_mutex_lock(&first_mutex);
  /**
   * Do some work
   */
  pthred_mutex_unlock(&first_mutex);
  pthred_mutex_unlock(&second_mutex);
}

<보기>

first_mutex, second_mutex

1) first_mutex, 2) second_mutex

1) second_mutex, 2) first_mutex

  1. 위 코드에서 thread_one은 1) first_mutex, 2) second_mutex 순서로 mutex 락을 획득하려고 하고 동시에 thread_two는 1) second_mutex, 2) first_mutex 순서로 mutex 락을 획득하려고 한다.

  2. thread_one이 first_mutex를 획득하고 thread_two가 second_mutex를 획득하면 교착 상태가 가능하다.

  3. 위 코드에서 교착 상태가 발생하지 않는 경우는 어떤 경우인가요?

    thread_two가 락을 획득하려고 시도하기 전에 thread_one이 first_mutex와 second_mutex를 획득하고 방출할 수 있다면 교착 상태는 발생하지 않는다.

문제 2

  1. 다음 코드가 라이브락으로 이어질 수 있도록 (A), (B), (C)를 채워주세요.

    <보기>

    done, True, False, first_mutex, second_mutex

    (A) done

    (B) second_mutex

    (C) first_mutex

    //thread_one
    void *do_work_one(void *param)
    {
    	int done = 0;
      
      while (!👉👉🏻👉🏼👉🏽👉🏾👉🏿(A)done👈🏿👈🏾👈🏽👈🏼👈🏻👈) {
        pthread_mutex_lock(&first_mutex);
        if (pthread_mutex_trylock(&👉👉🏻👉🏼👉🏽👉🏾👉🏿(B)second_mutex👈🏿👈🏾👈🏽👈🏼👈🏻👈)) {
          /**
     		   * Do some work
           */
          pthred_mutex_unlock(&second_mutex);
          pthred_mutex_unlock(&first_mutex);
          done = 1;
        }
        else
          pthread_mutex_unlock(&first_mutex);
      }
      pthread_exit(0);
    }
    
    //thread_two
    void *do_work_two(void *param)
    {
    	int done = 0;
      
      while (!👉👉🏻👉🏼👉🏽👉🏾👉🏿(A)done👈🏿👈🏾👈🏽👈🏼👈🏻👈) {
        pthread_mutex_lock(&second_mutex);
        if (pthread_mutex_trylock(&👉👉🏻👉🏼👉🏽👉🏾👉🏿(C)first_mutex👈🏿👈🏾👈🏽👈🏼👈🏻👈)) {
          /**
     		   * Do some work
           */
          pthred_mutex_unlock(&first_mutex);
          pthred_mutex_unlock(&second_mutex);
          done = 1;
        }
        else
          pthread_mutex_unlock(&second_mutex);
      }
      pthread_exit(0);
    }



보충3.3 🍂 교착상태 특성 taelee

교착상태가 발생되기 위해서는 다음의 네가지 조건이 전부 성립해야 한다.

  1. _________: 하나의 자원을 두개 이상의 스레드가 자원을 점유할 수 없다.

  2. _________: 스레드가 특정 자원을 점유하고 있는 상태에서 새로운 자원을 요청할 때 기존 자원을 보유하면서 대기한다.

  3. _________: 자원들을 선점할 수 없다. 즉 자원이 강제적으로 방출될 수 없고 스레드가 종료될 때 스레드에 의해 자발적으로만 방출된다.

  4. __________: T1-> R1->T2->R2->T1 과 같은 식으로 스레드와 자원들이 서로 꼬리에 꼬리르 물고 있어야 한다.

  5. 다음 그림이 데드락인지 아닌지 판단해 주세요(네모박스안에 점이 없는경우 리소스가 1개입니다)

1번그림:
2번그림:
3번그림:
4번그림:

📄 답지
  1. 상호 배제(mutual exclusion): 하나의 자원을 두개 이상의 스레드가 자원을 점유할 수 없다.

  2. 점유하며 대기(hold-and-wait): 스레드가 특정 자원을 점유하고 있는 상태에서 새로운 자원을 요청할 때 기존 자원을 보유하면서 대기한다.

  3. 비선점(no preemption): 자원들을 선점할 수 없다. 즉 자원이 강제적으로 방출될 수 없고 스레드가 종료될 때 스레드에 의해 자발적으로만 방출된다.

  4. 순환 대기(circular wait): T1-> R1->T2->R2->T1 과 같은 식으로 스레드와 자원들이 서로 꼬리에 꼬리르 물고 있어야 한다.

  5. 다음 그림이 데드락인지 아닌지 판단해 주세요(네모박스안에 점이 없는경우 리소스가 1개입니다)

1번그림: 데드락 아님,싸이클이 없음

2번그림: 데드락, 싸이클이 형성되어 있고 r3를 미혜스레드가 획득하지 못함

3번그림: 데드락 아님, 싸이클이 있지만 P3가 점유하고 있는 r2를 반환하면 p1이 r2를 획득하면서 데드락이 아니게 됨

4번그림: 데드락, p2가 제일 오른쪽 위 리소스를 할당받지 못함



보충3.4 🍂 교착상태 처리 방법 yeosong

1. 교착 상태 문제를 처리하는 4가지 방법 중 하나인 "Deadlock Ignorance 교착상태 무시(교착 상태가 시스템에서 절대 발생하지 않는 척하기" 는 Windows, Linux가 사용하는 방법이다. (O/X)

2. 스레드가 평생 요구하고 사용할 자원에 대한 부가적인 정보를 미리 제공할 것을 요구하여, 스레드가 기다려야 할지 아닐지를 결정하는 방식은 교착상태 회피avoidence / 예방prevention 방식이다.

3. 상호배제, 점유하며 대기, 비선점, 순환 대기 4가지의 필요조건 중 적어도 하나가 성립하지 않도록 보장하는 방식은 교착상태 회피avoidence / 예방prevention 방식이다.

4. Deadlock Detection and recovery는 데드락(교착상태) 발생은 허용하되 그에 대한 감지Detection 루틴을 두어 발견시 회복시키는 방법이다. (O/X)

📄 답지

1. 교착 상태 문제를 처리하는 4가지 방법 중 하나인 "Deadlock Ignorance 교착상태 무시(교착 상태가 시스템에서 절대 발생하지 않는 척하기" 는 Windows, Linux가 사용하는 방법이다.(O)

O. 교착 상태가 드물게 발생하고, 무시가 다른 처리 방법과 비교해 비용이 적게 든다고 판단될 경우 이런 선택을 내릴 수도 있다.

2. 스레드가 평생 요구하고 사용할 자원에 대한 부가적인 정보를 미리 제공할 것을 요구하여, 스레드가 기다려야 할지 아닐지를 결정하는 방식은 교착상태 회피avoidence 방식이다.

3. 상호배제, 점유하며 대기, 비선점, 순환 대기 4가지의 필요조건 중 적어도 하나가 성립하지 않도록 보장하는 방식은 교착상태 예방prevention 방식이다.

4. Deadlock Detection and recovery는 데드락(교착상태) 발생은 허용하되 그에 대한 감지Detection 루틴을 두어 발견시 회복시키는 방법이다. (O)



보충3.5 🍂 교착상태 예방 kukim

교착 상태가 발생하는 조건은 앞 8.3에서 살펴본 4가지 필요 조건이 있습니다.
이 4가지 조건은 무엇이었나요?

📄 4가지

네! 바로
Mutual Exclusion(상호배제), Hold & Wait(점유 대기), No Preemption(비선점), Circular Wait(순환 대기) 입니다.



교착상태에 빠지는 조건을 알았으니 빠지지 않으려면 4가지 필요조건과 반대(!(필요조건))되면 됩니다 그 방법은 무엇일까요? 보기를 참고하여 짝지어 주세요!

[보기]
1. 여러 개의 프로세스가 공유 자원을 사용할 수 있도록 한다.
2. 자원을 점유하고 있는 프로세스가 다른 자원을 요구할 때 점유하고있는 자원을 모두 반납하고 요구한 자원을 사용하기 위해 대기한다.
3. 자원에 교유한 번호를 할당하고, 프로세스에게 자원의 번호 순서대로 자원을 요구하라고 한다.
4. 프로세스가 실행되기 전에 필요한 모든 자원을 할당한다.
  • 정답
    • 상호배제 -
    • 점유 대기 -
    • 비선점 -
    • 순환대기 -
📄 답지

교착 상태가 발생하는 조건은 앞 8.3에서 살펴본 4가지 필요 조건이 있습니다.
이 4가지 조건은 무엇이었나요?

📄 4가지

네! 바로
Mutual Exclusion(상호배제), Hold & Wait(점유 대기), No Preemption(비선점), Circular Wait(순환 대기) 입니다.



교착상태에 빠지는 조건을 알았으니 빠지지 않으려면 4가지 필요조건과 반대(!(필요조건))되면 됩니다 그 방법은 무엇일까요? 보기를 참고하여 짝지어 주세요!

[보기]
1. 여러 개의 프로세스가 공유 자원을 사용할 수 있도록 한다.
2. 자원을 점유하고 있는 프로세스가 다른 자원을 요구할 때 점유하고있는 자원을 모두 반납하고 요구한 자원을 사용하기 위해 대기한다.
3. 자원에 교유한 번호를 할당하고, 프로세스에게 자원의 번호 순서대로 자원을 요구하라고 한다.
4. 프로세스가 실행되기 전에 필요한 모든 자원을 할당한다.
  • 정답
    • 상호배제 - 1
    • 점유 대기 - 4
    • 비선점 - 2
    • 순환대기 - 3


보충3.6 🍂 교착상태 회피 mihykim

[문제1] 개요

<보기>
saffy, safe, saint, unsafe, unstable, safe sequalizer, safe sequence
최소필요량, 햄최몇, 최대사용량
문채원 알고리즘, 은행원 알고리즘,  자원봉사그래프 알고리즘, 자원할당그래프 알고리즘
  • [1-1] 교착상태 회피(Deadlock Avoidance)는 쉽게 말해 시스템이     상태가 되지않도록 보장하는 방법이다.
  • [1-2] 이 때 사용되는 안전하냐(safe/unsafe)는 개념은 시스템 내의 프로세스들에 대한       유무로 결정된다.
  • [1-3] 가장 일반적인 방법은 프로세스들이 필요로 하는 각 자원별       을 미리 선언하도록 하고, 이 정보로 자원할당이 안전한지 동적으로 조사해서 안전한 경우에만 할당하는 방식이다.
  • [1-4] 자원의 종류별로 하나의 인스턴스만 있다면 사용하는 알고리즘은        이다.
  • [1-5] 자원의 종류별로 여러 개의 인스턴스만 있다면 위의 알고리즘을 사용할 수 없고,        을 사용한다.
  • [1-6] 만약 시스템이 safe 상태라면 절대 deadlock이 아니다. (O / X)
  • [1-7] 만약 시스템이 unsafe 상태라면 무조건 deadlock이다. (O / X)

문제2 자원할당그래프 알고리즘 (Resource Allocation Graph Algorithm)

- 실선 (assignment edge)
  - 프로세스가 해당 자원을 점유함
- 점선 (claim edge)
  - 프로세스 Pᵢ가 자원 Rᵢ를 미래에 요청할 수 있음을 뜻함.
  - 실제 요청시 실선으로 바뀜
  • [2-1] 다음 그림은 데드락 상태일까요? 그 이유는 무엇일까요?
    • 답변 :             

image

  • [2-2] 그렇다면 다음 그림은 데드락 상태일까요? 그 이유는 무엇일까요?
    • 답변 :             

image

  • [2-3] 프로세스가 n개일 때 사이클 생성여부 조사 시간복잡도는 얼마일까요? : O( )

문제3 은행원 알고리즘 (Banker's Algorithm)

- 다익스트라 알고리즘을 개발한 다익스트라가 개발한 알고리즘
- 프로세스는 시작할때 필요한 자원의 총 개수를 종류별로 미리 신고해야 함
- 자원을 요청했을 때 그 요청을 받아들일 것인지 결정
- '지금 몇 개 요청했느냐'가 아니라 '최대요청이 현재 가용자원으로 할당가능한지'로 판단함
- 최대요청할 것을 걱정해 자원이 남아도는데도 안주는 것이기 때문에 비효율적임
  • 은행원 알고리즘에 따라 아래 그림에서 추가요청이 받아들여질 프로세스를 모두 골라주세요 (+111,111점)
    • process_jehong, process_daelee, process_yeosong, process_kukim, process_taelee

image

📄 답지

[문제1] 개요

<보기>
saffy, safe, saint, unsafe, unstable, safe sequalizer, safe sequence
최소 필요량, 최햄몇, 최대 사용량
문채원 알고리즘, 은행원 알고리즘,  자원봉사그래프 알고리즘, 자원할당그래프 알고리즘
  • [1-1] 교착상태 회피(Deadlock Avoidance)는 쉽게 말해 시스템이 unsafe 상태가 되지않도록 보장하는 방법이다.
  • [1-2] 이 때 사용되는 안전하냐(safe/unsafe)는 개념은 시스템 내의 프로세스들에 대한 safe sequence 유무로 결정된다.
  • [1-3] 가장 일반적인 방법은 프로세스들이 필요로 하는 각 자원별 최대 사용량을 미리 선언하도록 하고, 이 정보로 자원할당이 안전한지 동적으로 조사해서 안전한 경우에만 할당하는 방식이다.
  • [1-4] 자원의 종류별로 하나의 인스턴스만 있다면 사용하는 알고리즘은 자원할당그래프 알고리즘이다.
  • [1-5] 자원의 종류별로 여러 개의 인스턴스만 있다면 위의 알고리즘을 사용할 수 없고, 은행원 알고리즘을 사용한다.
  • [1-6] 만약 시스템이 safe 상태라면 절대 deadlock이 아니다. (O)
  • [1-7] 만약 시스템이 unsafe 상태라면 무조건 deadlock이다. (X)
    • deadlock 가능성이 있는 것일 뿐 반드시 deadlock인 것은 아님

image

문제2 자원할당그래프 알고리즘 (Resource Allocation Graph Algorithm)

- 실선 (assignment edge)
  - 프로세스가 해당 자원을 점유함
- 점선 (claim edge)
  - 프로세스 Pᵢ가 자원 Rᵢ를 미래에 요청할 수 있음을 뜻함.
  - 실제 요청시 실선으로 바뀜
  • [2-1] 다음 그림은 데드락 상태일까요? 그 이유는 무엇일까요? (+111점)
    • 데드락이 아니다. 사이클이 형성되지 않았기 때문이다.

image

  • [2-2] 그렇다면 다음 그림은 데드락 상태일까요? 그 이유는 무엇일까요? (+111점)
    • 반드시 데드락 상태인 것은 아니고, 데드락 상태일 수 있다. 사이클이 형성되었기 때문이다.

image

  • [2-3] 프로세스가 n개일 때 사이클 생성여부 조사 시간복잡도는 얼마일까요? : O(n²)

문제3 은행원 알고리즘 (Banker's Algorithm)

  • 은행원 알고리즘에 따라 아래 그림에서 추가요청이 받아들여질 프로세스를 모두 골라주세요 (+111,111점)
    • process_daelee, process_kukim


image