GW LABS

멀티스레드 프로그래밍 (2) - 동기화 이론 본문

Programming

멀티스레드 프로그래밍 (2) - 동기화 이론

GeonWoo Kim 2021. 5. 15. 14:04

멀티스레드 프로그래밍

저번 포스팅에서는 프로세스와 스레드에 대한 정의를 간단히 살펴봤고, C++와 자바에서 기초적인 멀티스레드 프로그램을 작성해봤다. 예제 프로그램에서 멀티스레드 프로그램에서 반드시 고려해야할 공유자원을 어떻게 처리할 것인지에 대한 문제 직면했었다. 여러개의 스레드가 동시에 같은 자원을 사용하려고 할 때 어떻게 해야할까?


 

동기화

저번 포스팅에 예제에서는 동기화하지 않은 자원에 여러 스레드가 자원을 사용하려고 할때 발생한 문제를 봤다. 각 스레드가 자원에 대해 제한없이 접근할 수 있었기 때문에 의도치 않은 오동작이 발생했다. 따라서 여러 스레드가 서로 정보를 공유하고 동작을 맞추는 것이 필요하다. 이를 동기화라고 한다.

 

동기화에 관련된 개념들

  • 공유 데이터 : 여러 프로세스들이 공유하는 데이터
  • 임계 영역 : 공유 데이터를 접근하는 코드 영역
  • 상호 배제 : 둘 이상의 프로세스가 동시에 임계 영역에 진입하는 것을 막는 것

이 중에서 상호 배제를 구현하는 것이 다중 프로그래밍 패러다임에서 가장 중요한 부분이다.

 

상호배제 구현

상호배제는 소프트웨어 레벨, 하드웨어 레벨, 운영체제 레벨, 언어 레벨에서 구현할 수 있다. 이 포스팅에서는 운영체제 레벨과 언어 레벨에서 구현한 상호배제 솔루션들을 소개한다.

  • 운영체제 레벨
    • 스핀락 : 임계 구역에 진입이 불가능할 때 진입이 가능할 때까지 루프를 돌면서 재시도하는 상호배제 기법.
    • 세마포어 : P(try), V(increment) 연산으로 구현된 공유 자원을 제어하는 정수형 변수. 스핀락과 비슷하지만 busy waiting 문제를 재움 큐를 통해서 보완했다.
  • 언어 레벨
    • 모니터 : 언어레벨에서 구현된 상호배제 기법. 공유 데이터와 임계영역의 집합으로 구성되어 있다.

대부분의 멀티스레드를 지원하는 언어에서는 모니터 객체를 지원하고 있다. 따라서 모니터의 구조를 통해서 상호배제가 어떤식으로 이루어지는지 알아보자.

 

모니터 구조

출처 : https://jgrammer.tistory.com/entry/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EB%8F%99%EA%B8%B0%ED%99%94%EC%99%80-%EC%83%81%ED%98%B8-%EB%B0%B0%EC%A0%9C

  • 진입 큐 : 모니터 내에 프로시저 수만큼 존재
  • 상호배제 : 모니터 내에는 항상 하나의 프로세스만 진입가능. 언어가 보장.
  • 정보은폐 : 공유 데이터는 모니터 내의 프로세스만 접근 가능
  • 조건 큐 : 모니터 내의 특정 이벤트를 기다리는 프로세스가 대기
  • 신호제공자 큐 : 모니터에 항상 하나의 신호제공자 큐가 존재. signal() 명령을 실행한 프로세스가 임시 대기.

자원할당 해제 순서

  1. 자원이 사용가능한 상태이고 모니터안에 프로세스가 없다.
  2. 새로운 프로세스가 Pj가 entry queue에 들어가고 request를 호출해 자원 R 요청한다.
  3. Pj는 자원을 가지고 모니터 밖으로 나와서 작업을 수행한다. 자원 R은 사용 불가능한 상태가 된다.
  4. 새로운 Pk와 Pm이 entry queue에 들어오고 모니터내에 프로세스가 없으니 requestR()로 들어간다.
  5. 자원이 없으니 condition queue로 이동해서 기다린다.
  6. Pj는 작업이 끝나면 entry queue로 들어가 releaseR()을 기다린다. 모니터에 아무도 없으니 releaseR()로 이동한다.
  7. 자원을 반납하고 signaler queue로 이동한다. signaler queue로 이동해야하는 이유는 곧바로 깨우게 되면 모니터에 Pj가 존재하여 condition queue에 프로세스는 모니터 안으로 진입할 수 없다.
  8. Pj는 signaler queue에서 condition queue에 있는 프로세스를 깨워준다.
  9. Pk는 자원을 받아 모니터 밖으로 나간다.
  10. Pj는 다시 모니터로 들어와서 남은 일(자원을 반납하고 다른 프로세스가 자원을 가져간 뒤 추가적인 로직)을 실행한다.

위와 같이 동기화 이론과 언어레벨에서 구현된 모니터 클래스에 대해 자세히 알아봤다. 다음 포스팅에서는 실제 코딩을 해보면서 상호배제를 직접 구현한 예제를 실행시켜보자.

 

 

Reference

'Programming' 카테고리의 다른 글

멀티스레드 프로그래밍 (1) - 스레드 사용법  (0) 2021.03.05
Comments