새소식

인기 검색어

컴퓨터공학/운영체제

7장 교착상태

  • -

Q1 : 식사하는 철학자란 어떤 문제를 다루기 위한 문제 제기인가? 누가 처음 든 예이며, 이를 공식화한 사람은 누구인가? 제기된 문제와 해결하는 방법은 무엇인지 설명하라.

 

A1 : 병렬 처리에서의 동기화 문제와 해결 방법을 다루기 위한 문제. Edsger Dijkstra가 처음든 예이고 Prentice Hall출판사에서 공식화 하였다.

 

 

Q2 : 교착상태를 정의해보라.

 

A2 : 자원을 소유한 스레드들 사이에서 각 스레드는 다른 스레드가 소유한 자원을 요청하여 무한정 대기하고 있는 현상.

 

 

Q3 : 교착상태가 발생할 필요조건 4가지를 무엇이라고 하는가, 그리고 4가지의 조건은?

 

A3 :

상호배제 : 각 자원은 한번에 하나의 스레드에게만 할당
소유하면서 대기 : 스레드가 한 자원을 소유하면서 다른 자원을 기다리기
강제 자원 반환 불가 : 스레드에게 할당된 자원을 강제로 빼앗지 못함
환형 대기 : 한 그룹의 스레드들에 대해 각 스레드는 다른 스레드가 요청하는 자원을 소유하는 원형고리 형성

 

 

Q4 : 자원할당 그래프에서 사이클(cycle)은 무엇을 나타내는 것이며, 이 그래프가 중요한 이유는 무엇인가?

 

A4 : 교착상태를 나타낸다. 자원할당 그래프를 통해 교착상태를 판단하기때문에 중요하다.

 

 

Q5 : 교착상태를 다루는 방법 4가지를 간단히 기술하라. 그 중에서 가장 많이 사용되는 방법과 그 이유는 무엇인가?

 

A5 :

교착상태 예방 : 교착상태에 빠지는 4가지 조건중 하나 이상의 조건이 성립하지 못하도록 시스템 구성
교착상태 회피 : 자원 할당시마다 교착상태 가능성을 검사하여 교착상태가 발새아지 않을 것이라고 확신하는 경우에만 자원 할당.
교착상태 감지 및 복구 : 교착상태를 감지하는 프로그램 구동, 발견 후 교착상태 해제.
교착상태 무시 : 교착상태는 없다고 단정, 사용자가 이상을 느끼면 재실행할 것이라고 믿는 방법.

교착상태 무시가 가장 많이 사용된다. 나머지 방법들은 교착상태가 일어나지 않을대에도 시스템이 돌아가기 때문에 성능저하가 발생하기 때문이다.

 

 

Q6 : 교착상태의 예방책으로 제안된 방법의 문제점은?

 

A6 : 상호배제조건을 없애면 자원을 훼손할 수 있고 소유하면서 대기 조건을 없애면 자원 활용률이 떨어지고 다른 스레드는 자원을 할당 받지 못하는 대기상태가 발생한다. 강제 자원 반환 불가조건을 선점 허용으로 바꾸면 자원을 강제로 반환하게 된 스레드가 다시 자원을 사용하게되면 이전 상태로 되돌아갈 수 잇도록 관리가 필요하다는 문제점이 있다.

 

 

Q7 : 자원을 요청할 때마다 교착 상태를 탐지하는 것의 단점과 그의 해결책은?

 

A7 : 자원을 할당할때마다 환형대기가 발생할 것인지 판단하는 작업이 실행되는 단점이 있다.
banker's 알고리즘이 있지만 비현실적인 알고리즘이다.

 

 

Q8 : 교착상태가 발생한 것을 탐지한 후 회복하는 3가지 방법을 제시해보라.

 

A8 :

자원 강제 선점 : 교착상태에 빠진 스레드중 하나의 자원을 강제로 빼앗아 다른 스레드에게 할당
롤백 : 교착상태가 발생하면 마지막으로 저장된 상태로 돌아감
스레드 강제 종료 : 교착상태에 빠진 스레드 중 하나를 강제 종료

 

 

Q9 : 교착상태 해결을 위해 범용 운영체제인 Unix, Linux, Windows의 기본 해결법은 무엇인가? 그리고 그렇게 하는 이유는 무엇인가?

 

A9 : 교착상태를 무시하는 방법인 ostrich알고리즘을 사용한다. 교착상태의 발생 가능성이 극히 적기때문에 교착상태를 피하기 위해 시스템을 만든다면 비용이 많이 들어가기때문이다. 교착상태가 발생하면 시스템을 재시작하거나 특정 스레드를 강제 종료시키는 방법으로 교착상태를 해결한다.

 

 

Q10 : 탐구 7-1를 직접 입력하여 실행해보라. 교착상태가 발생하면 ^C 키를 입력하여 프로그램 을 종료시키면 된다. 코드와 실행 결과를 캡쳐하여 제출하라.

 

A10 :

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

int x = 0;  int y = 0; 
pthread_mutex_t lock1;  pthread_mutex_t lock2;  

void* worker1(void* arg) { 
    pthread_mutex_lock(&lock1); 
    printf("%s lock1 잠금\n", (char*)arg);
    x++; 
    sleep(2);  
    pthread_mutex_lock(&lock2)
    printf("%s lock2 잠금\n", (char*)arg);
    y++;
    pthread_mutex_unlock(&lock2); 
    printf("%s lock2 해제\n", (char*)arg);
    pthread_mutex_unlock(&lock1); 
    printf("%s lock1 해제\n", (char*)arg);
}

void* worker2(void* arg) { 
    pthread_mutex_lock(&lock2); 
    printf("%s lock2 잠금\n", (char*)arg);
    y++;
    sleep(2); 
    pthread_mutex_lock(&lock1); 
    printf("%s lock1 잠금\n", (char*)arg);
    x++;    
    pthread_mutex_unlock(&lock1); 
    printf("%s lock1 해제 \n", (char*)arg);
    pthread_mutex_unlock(&lock2); 
    printf("%s lock2 해제\n", (char*)arg);
}

int main() {
    char *name[] = { "황기태", "이찬수"};
    pthread_t tid[2];

    pthread_mutex_init(&lock1, NULL); 
    pthread_mutex_init(&lock2, NULL); 

    pthread_create(&tid[0], NULL, worker1, name[0]);  
    pthread_create(&tid[1], NULL, worker2, name[1]); 

    pthread_join(tid[0], NULL);
    pthread_join(tid[1], NULL);

    pthread_mutex_destroy(&lock2);
    pthread_mutex_destroy(&lock1);

    printf("x = %d, y = %d\n", x, y);

    return 0;
}

 

'컴퓨터공학 > 운영체제' 카테고리의 다른 글

10장 가상 메모리  (0) 2023.05.28
9장 페이징 메모리  (0) 2023.05.28
6장 스레드 동기화  (0) 2023.05.28
5장 CPU 스케줄링  (0) 2022.01.13
4장 스레드와 멀티태스킹  (0) 2022.01.10
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.