동시성 프로그래밍에서의 공유 자원 관리
요약
- 동시성 프로그래밍을 할 때, 가장 중요한 부분은 둘 이상의 스레드가 공통으로 동시에 접근해서는 안 되는 ‘공유 자원’을 관리하는 것이다.
- 이러한 ‘공유 자원’을 관리 하기 위해서는 상호 배제(Mutual exclusion)를 달성하는 기법이 필요하다.
- 대표적인 상호 배제를 달성하기 위한 방범으로는 뮤텍스(Mutex)와 세마포어(Semaphore)가 있다.
공유 자원
- 둘 이상의 쓰레드가 공동으로 쓰는 변수, 메모리, 파일, 자료 구조, 장치 등
임계 구역(Critical section)
- 둘 이상의 스레드가 동시에 접근해서는 안되는 공유 자원을 접근하는 코드 블록(코드의 일부)를 말한다.
- 임계 구역은 지정된 시간이 지난 후 종료된다. 때문에 어떤 스레드(태스크 또는 프로세스)가 임계 구역에 들어가고자 한다면 지정된 시간만큼 대기해야 한다.
- 스레드가 공유자원의 배타적인 사용을 보장받기 위해서 임계 구역에 들어가거나 나올때는 세마포어 같은 동기화 매커니즘이 사용된다.
상호 배제(Mutual exclusion)
- 임계 구역을 어느 시점에서 단지 한 개의 프로세스만이 사용할 수 있도록 하며, 다른 프로세스가 현재 사용 중인 임계 구역에 대하여 접근하려고 할 때 이를 금지하는 행위 혹은 알고리즘
상호 배제를 달성하기 위한 방법
뮤텍스(Mutex)
- 스레드가 임계 영역에 접근하면 들어가기 위해 locking 여부를 확인한다.
- 만약, 임계 영역이 lock 상태이면 작업 큐에 들어가 대기한다.
- 만약, 임계 영역이 unlock 상태이면 임계 영역에 들어가고, 임계 영역을 lock 상태로 바꾼다.
- 작업이 완료된다면 임계 영역을 unlock 상태로 바꾸고, 임계 영역에서 나온다.
- 작업 큐에 대기 중인 스레드가 있다면 다음 스레드가 임계 영역에 접근한다.(1부터 반복)
세마포어(Semaphore)
- 다수의 프로세스나 스레드의 여러개의 공유 자원에 대한 접근을 제한하는 방법으로 사용되는 동기화 기법
- 뮤텍스의 경우 임계 영역에 접근한 작업이 lock을 관리하는데 비해 세마포어는 공통으로 관리하는 현재 공유자원에 접근할 수 있는 스레드, 프로세스의 수를 나타내는 값을 이용해 상호배제를 달성한다.
뮤텍스랑은 다르게, 여러 프로세스가 접근이 가능하다.
- S는 정수값을 가지는 변수이며, 다음과 같이 P와 V라는 명령에 의해서만 접근할 수 있다.
- P는 임계 구역에 들어가기 전에 수행되고, V는 임계 구역에서 나올 때 수행된다.
- P는 S를 1 감소 시키고, V는 S를 1 증가 시킨다.
- 이때 변수 값을 수정하는 연산은 모두 원자성을 만족해야 한다.
- S는 현재 임계영역에 접근할 수 있는 스레드, 프로세스의 수로 초기화 한다.
- 스레드가 임계 영역에 접근하면 들어가기 위해 S값을 확인한다.
- 만약, S값이 0 이하이면 작업 큐에 들어가 대기한다.
- 만약, S값이 0보다 크면 P가 수행되고, 임계 영역에 들어간다.
- 작업이 완료되면 임계 영역을 나오고 V가 실행된다.
- 작업 큐에 대기 중인 스레드가 있다면 다음 스레드가 임계 영역에 접근한다.(1부터 반복)
This post is licensed under CC BY 4.0 by the author.