본문 바로가기

공부/자료구조

락(lock)과 교착상태(Dead lock)

락(lock)이란?

동시접근으로 인한 데이터 오염(Race Condition) 방지가 주 목적

 

예로 은행 계좌에서 잔액을 1증가시키는 코드를 생각해보자

int balance = 0;

void increment() {
	balance = balance + 1; // 3단계 과정으로 쪼개짐
}

// 1. balance 값을 읽는다 (0)
// 2. 1을 더한다. (0 + 1 = 1)
// 3. 결과를 balance에 저장한다.

 

두 스레드가 동시에 increment()를 호출하면

스레드 A : balance 읽음 (0)

스레드 B : balance 읽음 (0)  < A가 아직 저장 안 한 상태에서 B도 읽어버림!

스레드 A : 0 + 1 = 1 계산, balance에 저장 (balance = 1)

스레드 B : 0 + 1 = 1 계산, balance에 저장 (balance = 1)

 

결과 : balance = 1 (원래는 2가 되어야 하는데, 값이 하나 사라짐)

 

락(lock)으로 해결하는 방법

락은 "지금 이 자원을 누가 쓰고 있으면, 다른 스레드는 그 사람이 다 쓸 때까지 기다려라"는 규칙

 

스레드 A : 락 획득 > balance 읽고, 더하고, 저장 > 락 반납

스레드 B : (A가 락 갖고 있는 동안) 대기...

스레드 B : 락 획득 > balance 읽고, 더하고, 저장 >  락 반납

 

결과 : balance. = 2

 

교착상태(Deadlock)란?

락을 사용하다가 생길 수 있는 부작용으로, 락 두 개 이상을 서로 다른 순서로 잡으려다가, 서로가 서로를 무한정 기다리게 되는 상황

스레드 A : 락1을 잡음 > 락2를 기다림
스레드 B : 락2를 잡음 > 락1을 기다림

> A는 B가 락 2를 놓기를 기다리고,
  B는 A가 락1을 놓기를 기다리고,
  서로 영원히 대기... (교착상태)

- 락(Lock)의 목적 = 동시 접근으로 인한 데이터 오염(Race condition) 방지

- 교착상태(Deadlock) = 락을 여러 개 잘못 쓰면 생길 수 있는 부작용/문제점 (락이 막아주는게 아니라, 락 때문에 생길 수 있는 위험)

 

정리

용어 의미
Race Condition 락이 없어서 여러 스레드가 동시에 값을 건드려 데이터가 꼬이는 문제 > 락으로 해결
Lock (락) "한 번에 하나의 스레드만 접근 가능"하게 막는 장치 > race condition 방지가 목적
Deadlock (교착상태) 락을 여러 개 쓰다가 서로 무한 대기에 빠지는 문제 > 락을 잘못 써서 생기는 부작용

 

728x90