Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Docker
- springboot
- Spring
- aws
- 스프링 부트
- 백준
- JPA
- Kafka
- 쿠버네티스
- 클라우드 컴퓨팅
- Spring Data JPA
- 백트래킹
- Apache Kafka
- 로드밸런서
- 코드업
- DFS
- 카프카
- 프로그래밍문제
- 스프링부트
- 알고리즘
- Elasticsearch
- 클라우드
- VPC
- 인천여행
- 오일러프로젝트
- 자료구조
- gcp
- Spring Boot
- 월미도
- 스프링
Archives
- Today
- Total
GW LABS
멀티스레드 프로그래밍 (2) - 동기화 이론 본문
저번 포스팅에서는 프로세스와 스레드에 대한 정의를 간단히 살펴봤고, C++와 자바에서 기초적인 멀티스레드 프로그램을 작성해봤다. 예제 프로그램에서 멀티스레드 프로그램에서 반드시 고려해야할 공유자원을 어떻게 처리할 것인지에 대한 문제 직면했었다. 여러개의 스레드가 동시에 같은 자원을 사용하려고 할 때 어떻게 해야할까?
동기화
저번 포스팅에 예제에서는 동기화하지 않은 자원에 여러 스레드가 자원을 사용하려고 할때 발생한 문제를 봤다. 각 스레드가 자원에 대해 제한없이 접근할 수 있었기 때문에 의도치 않은 오동작이 발생했다. 따라서 여러 스레드가 서로 정보를 공유하고 동작을 맞추는 것이 필요하다. 이를 동기화라고 한다.
동기화에 관련된 개념들
- 공유 데이터 : 여러 프로세스들이 공유하는 데이터
- 임계 영역 : 공유 데이터를 접근하는 코드 영역
- 상호 배제 : 둘 이상의 프로세스가 동시에 임계 영역에 진입하는 것을 막는 것
이 중에서 상호 배제를 구현하는 것이 다중 프로그래밍 패러다임에서 가장 중요한 부분이다.
상호배제 구현
상호배제는 소프트웨어 레벨, 하드웨어 레벨, 운영체제 레벨, 언어 레벨에서 구현할 수 있다. 이 포스팅에서는 운영체제 레벨과 언어 레벨에서 구현한 상호배제 솔루션들을 소개한다.
- 운영체제 레벨
- 스핀락 : 임계 구역에 진입이 불가능할 때 진입이 가능할 때까지 루프를 돌면서 재시도하는 상호배제 기법.
- 세마포어 : P(try), V(increment) 연산으로 구현된 공유 자원을 제어하는 정수형 변수. 스핀락과 비슷하지만 busy waiting 문제를 재움 큐를 통해서 보완했다.
- 언어 레벨
- 모니터 : 언어레벨에서 구현된 상호배제 기법. 공유 데이터와 임계영역의 집합으로 구성되어 있다.
대부분의 멀티스레드를 지원하는 언어에서는 모니터 객체를 지원하고 있다. 따라서 모니터의 구조를 통해서 상호배제가 어떤식으로 이루어지는지 알아보자.
모니터 구조
- 진입 큐 : 모니터 내에 프로시저 수만큼 존재
- 상호배제 : 모니터 내에는 항상 하나의 프로세스만 진입가능. 언어가 보장.
- 정보은폐 : 공유 데이터는 모니터 내의 프로세스만 접근 가능
- 조건 큐 : 모니터 내의 특정 이벤트를 기다리는 프로세스가 대기
- 신호제공자 큐 : 모니터에 항상 하나의 신호제공자 큐가 존재. signal() 명령을 실행한 프로세스가 임시 대기.
자원할당 해제 순서
- 자원이 사용가능한 상태이고 모니터안에 프로세스가 없다.
- 새로운 프로세스가 Pj가 entry queue에 들어가고 request를 호출해 자원 R 요청한다.
- Pj는 자원을 가지고 모니터 밖으로 나와서 작업을 수행한다. 자원 R은 사용 불가능한 상태가 된다.
- 새로운 Pk와 Pm이 entry queue에 들어오고 모니터내에 프로세스가 없으니 requestR()로 들어간다.
- 자원이 없으니 condition queue로 이동해서 기다린다.
- Pj는 작업이 끝나면 entry queue로 들어가 releaseR()을 기다린다. 모니터에 아무도 없으니 releaseR()로 이동한다.
- 자원을 반납하고 signaler queue로 이동한다. signaler queue로 이동해야하는 이유는 곧바로 깨우게 되면 모니터에 Pj가 존재하여 condition queue에 프로세스는 모니터 안으로 진입할 수 없다.
- Pj는 signaler queue에서 condition queue에 있는 프로세스를 깨워준다.
- Pk는 자원을 받아 모니터 밖으로 나간다.
- Pj는 다시 모니터로 들어와서 남은 일(자원을 반납하고 다른 프로세스가 자원을 가져간 뒤 추가적인 로직)을 실행한다.
위와 같이 동기화 이론과 언어레벨에서 구현된 모니터 클래스에 대해 자세히 알아봤다. 다음 포스팅에서는 실제 코딩을 해보면서 상호배제를 직접 구현한 예제를 실행시켜보자.
Reference
'Programming' 카테고리의 다른 글
멀티스레드 프로그래밍 (1) - 스레드 사용법 (0) | 2021.03.05 |
---|
Comments