Developing Myself Everyday

 공유 자원은 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 메모리, 파일, 데이터 등의 자원이나 변수를 의미한다. 이런 상태의 자원을 두 개 이상의 프로세스가 동시에 읽거나 쓰는 상황을 경쟁 상태라고 한다.

 

Race Condition (경쟁 상태)


  경쟁 상태는 공유 자원에 대해 여러 프로세스가 동시에 접근할 때, 결과값에 영향을 줄 수 있는 상태를 말한다. 이런 상태는 동시 접근 시 일관성을 해치는 결과가 나타날 수 있다. 경쟁 상태가 발생하는 경우는 다음과 같다.

 

  1. 공유 데이터 접근: 여러 스레드 또는 프로세스가 공유된 메모리나 파일 등의 데이터에 동시에 접근하고 수정하려고 할 때 경쟁 상태가 발생할 수 있다. 예를 들어, 한 스레드가 데이터를 수정하는 도중에 다른 스레드가 같은 데이터를 읽거나 수정하려고 시도하는 경우이다.
  2. 자원 예약: 여러 프로세스나 스레드가 공유된 자원(예: 프린터, 데이터베이스 연결, 네트워크 포트 등)을 동시에 예약하려고 할 때 경쟁 상태가 발생할 수 있다. 자원을 예약하지 않은 상태에서 여러 개체가 동시에 해당 자원을 요청하면 충돌이 발생하게 된다.
  3. 상태 업데이트: 여러 스레드나 프로세스가 동시에 공유된 상태를 업데이트하려고 할 때 경쟁 상태가 발생할 수 있다. 예를 들어, 여러 스레드가 동시에 변수를 증가시키거나 수정하려고 시도하는 경우 해당 변수의 최종 값은 예측하기 어렵고 일관성이 없을 수 있다.

 

 

Critical Section (임계 영역)


 이러한 공유 자원에 접근할 때 순서 등의 이유로 결과가 달라지는 영역을 임계 영역이라고 한다. 공유 자원을 여러 프로세스가 동시에 접근할 때, 잘못된 결과를 만들 수 있기 때문에, 한 프로세스가 임계 구역을 수행할 때는 다른 프로세스가 접근하지 못하도록 해야 한다.

 

 이러한 경쟁 상태와 임계 영역은 동기화 메커니즘을 사용하여 해결할 수 있다. 예를 들면 잠금(locking) 매커니즘, 세마포어(semaphore), 뮤텍스(Mutex) 등을 이용하여 공유 자원에 대한 동시 접근을 조절하고, 상호 배제와 같은 개념을 적용해 경쟁 상태를 방지할 수 있다.

 

 

Locking (잠금)

 임계 구역을 말 그대로 잠그는 매커니즘이다. 하나의 프로세스, 쓰레드가 임계 구역을 사용하고 있으면 문을 잠궈서 다른 프로세스, 쓰레드가들어오지 못하게 한다. 사용중인 프로세스, 쓰레드가사용을 완료하면 다음 프로세스, 쓰레드가들어갈 수 있는 방식이다.

 

 

Mutex (Mutual Exclusion - 상호 배제)

 상호 배제의 약자로 뮤텍스는 공유 자원을 사용하기 전에 설정하고 사용한 후에 해제하는 잠금이다. 잠금이 설정되면 다른 프로세스, 쓰레드는 잠긴 코드 영역에 접근할 수 없다. 또한 뮤텍스는 하나의 상태(잠금 또는 잠금 해제)만 가진다.

 

 이를 쉽게 설명하자면 우리가 식당에 갔는데 화장실에 카운터에 열쇠가 있는 경우로 설명할 수 있다. 

화장실을 갈 때, 카운터에 열쇠가 있으면 화장실에 사람이 없다는 뜻이고 화장실을 갈 수 있다. 만약 카운터에 열쇠가 있으면 화장실에 사람이 있다는 뜻이므로 사용중인 사람이 열쇠를 돌려놓기 전까지는 화장실을 갈 수 없다.

 

 뮤텍스는 상태가 0, 1인 이진 세마포어로 부르기도 한다.

 

 

Semaphore (세마포어)

 세마포어는 일반화된 뮤텍스이다. 간단한 정수 값과 두 가지 함수 wait 및 signal로 공유 자원에 대한 접근을 처리한다. 

 

 프로세스가 공유 자원에 접근하면 세마포어에서 wait() 작업을 수행하고 프로세스가 공유 자원을 해제하면 세마포어에서 signal() 작업을 수행한다. 세마포어에는 조건 변수가 없고 세마포어 값을 수정할 때 다른 프로세스는 동시에 세마포어 값을 수정할 수 없다.

 

 이를 쉽게 설명하자면 화장실이 여러개가 있고 화장실의 빈 칸을 보여주는 숫자가 있다. 화장실을 갈 때, 빈 칸의 개수를 확인하고 빈 칸의 개수가 1개 이상이라면 숫자를 하나 뺀 후 화장실을 이용한다. 그리도 화장실을 이용한 다음 숫자를 하나 더한다. 

 

 이렇게 세마포어는 현재 공유자원에 접근할 수 있는 스레드, 프로세스의 수를 나타내는 값을 두어 상호배제를 달성한다.

 

profile

Developing Myself Everyday

@배준형

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!