본문 바로가기
Computer Science/Operating System

Concurrency Problem의 종류 및 원인

by JuHy_ 2019. 9. 24.

Concurrency Problem이란?

하나의 process 안에서 여러 개의 thread를 사용하는 경우가 많다.

여러 개의 thread를 사용하면서 동시에 공유 자원에 접근하거나 잘못된 scheduling으로 인해 오류가 발생할 수 있다.

이렇게 동시에 여러 개의 thread를 관리하면서 생기는 문제들을 Concurrency Problem이라고 한다.

 

그렇다면 Concurrency Problem에는 어떤 것들이 있을까?

먼저 대표적인 Concurrency Problem인 Deadlock에 대해서 알아보고, 추가적으로 다른 Problem들을 알아보자.

 

Deadlock

Deadlock이란 여러 가지 원인으로 인해 아무도 lock을 획득하지 못하고 멈춰있는 교착상태를 말한다.

 

예를 들어 위와 같이 여러 개의 thread가 상대의 lock을 기다린다면 두 thread는 모두 멈춰있게 된다.

이와 같은 상황을 Deadlock이라고 한다.

 

Deadlock은 크게 2가지 원인으로 인해 발생한다.

1) 복잡한 의존성 : 코드가 많아질수록 의존성이 복잡해져 발생

2) 캡슐화 : 모듈화 과정에서 잘못된 lock 사용으로 발생

 

그렇다면 이러한 원인으로 인해 어떠한 조건이 만족되면 Deadlock이 발생하는지 알아보자.

 

Deadlock의 발생 조건

Deadlock이 발생하기 위해서는 4가지의 조건이 모두 만족되어야 한다.

 

1. Mutual Exclusion : 공유 자원은 오직 하나의 process에서만 사용할 수 있다.

2. Hold-and-wait : 점유되고 있는 자원을 기다리고 있는 process가 존재한다.

3. No preemption : 할당된 자원을 강제로 뺏을 수 없다.

4. Circular wait : process들이 순환식 형태로 서로의 자원을 기다린다.

 

Deadlock 예방법

그렇다면 Deadlock이 발생하지 않게 하려면 위의 4가지의 조건 중 하나를 없애면 되지 않을까?

어떻게 하면 각자의 조건들이 형성되지 않도록 할 지 생각해보자.

 

- Circular wait

Circular wait이 발생하지 않기 위해서는 lock의 순서가 엉키지 않도록 하는 것이 중요하다.

예를 들어 l1, l2 2개의 lock을 사용할 경우, 항상 l1을 획득하고 l2를 획득하도록 순서를 지켜주어야 한다.

 

- Hold-and-wait

점유되고 있는 자원을 기다리지 않게 하려면 하나의 thread가 실행 중인 동안 다른 thread를 막아주면 될 것이다.

그러기 위해서는 deadlock의 위험성이 있는 부분을 하나의 lock으로 한번 더 감싸주어야 한다.

이를 통해 다른 thread가 도중에 실행되는 것을 막을 수는 있지만 concurrency를 떨어뜨려 효율이 감소하게 된다.

 

- No preemption

Deadlock은 thread들이 서로의 lock을 기다리기 때문에 발생한다.

그렇다면 이미 다른 thread에서 lock을 갖고 있다면 자신의 lock을 반환하여 다른 thread가 실행될 수 있게 하면 된다.

 

Non-Deadlock Problems

1. Atomiticy Violation

서로 다른 thread에서 같은 자원을 수정하려 할 때 문제가 발생할 수 있다.

이는 공유되는 자원을 lock으로 감싸 mutual exclusion을 보장함으로써 해결할 수 있다.

 

2. Order Violation

Thread가 실행되어야 할 순서가 지켜지지 않았을 때 문제가 발생할 수 있다.

이 때에는 condition variable을 통해 먼저 실행되어야 할 thread가 끝나면 다음 thread가 실행되도록 해주어야 한다.

'Computer Science > Operating System' 카테고리의 다른 글

Semaphore란?  (0) 2019.09.16
Condition Variable이란?  (1) 2019.09.05
Lock의 개념과 구현 방법  (4) 2019.09.05
Thread와 Thread API  (0) 2019.09.04
Page Swapping이란?  (0) 2019.09.02