Home 동시성 프로그래밍에서의 공유 자원 관리
Post
Cancel

동시성 프로그래밍에서의 공유 자원 관리

요약

  • 동시성 프로그래밍을 할 때, 가장 중요한 부분은 둘 이상의 스레드가 공통으로 동시에 접근해서는 안 되는 ‘공유 자원’을 관리하는 것이다.
  • 이러한 ‘공유 자원’을 관리 하기 위해서는 상호 배제(Mutual exclusion)를 달성하는 기법이 필요하다.
  • 대표적인 상호 배제를 달성하기 위한 방범으로는 뮤텍스(Mutex)와 세마포어(Semaphore)가 있다.

공유 자원

  • 둘 이상의 쓰레드가 공동으로 쓰는 변수, 메모리, 파일, 자료 구조, 장치 등

임계 구역(Critical section)

  • 둘 이상의 스레드가 동시에 접근해서는 안되는 공유 자원을 접근하는 코드 블록(코드의 일부)를 말한다.
  • 임계 구역은 지정된 시간이 지난 후 종료된다. 때문에 어떤 스레드(태스크 또는 프로세스)가 임계 구역에 들어가고자 한다면 지정된 시간만큼 대기해야 한다.
  • 스레드가 공유자원의 배타적인 사용을 보장받기 위해서 임계 구역에 들어가거나 나올때는 세마포어 같은 동기화 매커니즘이 사용된다.

상호 배제(Mutual exclusion)

  • 임계 구역을 어느 시점에서 단지 한 개의 프로세스만이 사용할 수 있도록 하며, 다른 프로세스가 현재 사용 중인 임계 구역에 대하여 접근하려고 할 때 이를 금지하는 행위 혹은 알고리즘

상호 배제를 달성하기 위한 방법

뮤텍스(Mutex)

  1. 스레드가 임계 영역에 접근하면 들어가기 위해 locking 여부를 확인한다.
  2. 만약, 임계 영역이 lock 상태이면 작업 큐에 들어가 대기한다.
  3. 만약, 임계 영역이 unlock 상태이면 임계 영역에 들어가고, 임계 영역을 lock 상태로 바꾼다.
  4. 작업이 완료된다면 임계 영역을 unlock 상태로 바꾸고, 임계 영역에서 나온다.
  5. 작업 큐에 대기 중인 스레드가 있다면 다음 스레드가 임계 영역에 접근한다.(1부터 반복)

세마포어(Semaphore)

  • 다수의 프로세스나 스레드의 여러개의 공유 자원에 대한 접근을 제한하는 방법으로 사용되는 동기화 기법
  • 뮤텍스의 경우 임계 영역에 접근한 작업이 lock을 관리하는데 비해 세마포어는 공통으로 관리하는 현재 공유자원에 접근할 수 있는 스레드, 프로세스의 수를 나타내는 값을 이용해 상호배제를 달성한다.
  • 뮤텍스랑은 다르게, 여러 프로세스가 접근이 가능하다.

  • S는 정수값을 가지는 변수이며, 다음과 같이 P와 V라는 명령에 의해서만 접근할 수 있다.
    • P는 임계 구역에 들어가기 전에 수행되고, V는 임계 구역에서 나올 때 수행된다.
    • P는 S를 1 감소 시키고, V는 S를 1 증가 시킨다.
    • 이때 변수 값을 수정하는 연산은 모두 원자성을 만족해야 한다.
  1. S는 현재 임계영역에 접근할 수 있는 스레드, 프로세스의 수로 초기화 한다.
  2. 스레드가 임계 영역에 접근하면 들어가기 위해 S값을 확인한다.
  3. 만약, S값이 0 이하이면 작업 큐에 들어가 대기한다.
  4. 만약, S값이 0보다 크면 P가 수행되고, 임계 영역에 들어간다.
  5. 작업이 완료되면 임계 영역을 나오고 V가 실행된다.
  6. 작업 큐에 대기 중인 스레드가 있다면 다음 스레드가 임계 영역에 접근한다.(1부터 반복)
This post is licensed under CC BY 4.0 by the author.

헥사고날 아키텍처

JAVA의 동시성 프로그래밍