Zero to Hero
Published 2021. 1. 23. 14:35
코딩을 지탱하는 기술 03 Review

병행처리

복수의 처리를 시간축 상에 오버랩에서 실행하는 것

 

협력적 멀티태스크

한 프로세스가 처리가 완료되는 시점에 자발적으로 처리 교대를 하는 방법

모든 처리가 최적의 간격으로 교대한다는 이상적인 상황을 기반으로 성립하는 시스템. 일반적으로는 기아 상태가 발생한다.

 

Windows 3.1, Mac OS 9이 이 방식을 채택했다. 프로그램이 버그로 인해 무한 반복되는 상황이 되면 동시에 실행한 다른 프로그램에게는 처리 기회가 가지 않고 전부 묶어서 백업을 해버렸다.

 

선점적 멀티태스크

개별 프로그램과 다른 또 다른 프로그램인 "스케줄러"를 통해 일정 시간마다 지금 실행되고 있는 처리를 강제적으로 중단시켜서 다른 프로그램이 실행될 수 있도록 하는 방법

 

선점적(preemptive) 멀티태스크라고도 한다.

Windows 95, Max OS X 이후 버전, UNIX, Linux는 OS가 이 방법으로 복수 프로그램을 병행 실행한다.

 

경합 상태(Race Condition)

Thread safe하지 않은 상태

 

조건

1. 2가지 처리가 변수를 공유하고 있다

2. 적어도 하나의 처리가 그 변수를 결정한다.

3. 한쪽 처리가 한 단락 마무리되기 전에, 다른 한쪽의 처리가 끼어들 가능성이 있다.

 

이 3가지 조건을 전부 만족하는 경우 race condition이 발생하고, 이 중 하나라도 방지하거나 깨면 발생하지 않는다.

1번 조건을 깨는 방법

1. 프로세스에서 메모리를 공유하지 않기

서로 다른 프로세스가 메모리를 공유하지 않으면 문제가 발생하지 않는다. -> 현실적으로 이 방법으로는 또다시 해결해야 하는 다양한 문제가 발생할 수 있다. 무엇보다 자원을 공유할 수 없다는 점에서 비효율적이다.

 

2. 액터 모델(Actor model)

병행해서 동작하는 복수의 처리가 정보를 교환하는 방법

메모리를 공유하는 것이 아닌 메시지를 보내는 방식으로 비동기적으로 수행함

 

2번 조건을 깨는 방법

1. Immutable 패턴

언어에서 제공하는 const나 불변 패턴 디자인 기법을 통해 자원을 관리한다.

불변 패턴

클래스에서 private 필드를 만들어 getter 메서드는 만드지만 setter 메서드를 만드지 않으면 한번 생성될 때 가진 필드 값을 변경할 수 없다. 즉 읽는 것은 가능하지만 변경이 안 되는 불변 상태를 구현할 수 있다.

 

3번 조건을 깨는 방법

1. 협력적 스레드 사용

fiber, coroutine, Generator를 사용

 

2. lock, mutex, semaphore 사용

Java의 경우 synchronized 키워드를 사용해 쉽게 스레드 락을 걸 수 있다.

 

문제점

1. lock 기법은 교착 상태(deadlock)를 발생시킨다.

X가 자원 1을 쓰고 자원 2를 쓴다.

Y가 자원 2를 쓰고 자원 1을 쓴다.

 

X, Y가 동시에 시작하면 자원 1, 2 모두 락이 걸린 상태에서 상대방의 락이 풀리기를 기다리는 교착상태가 발생한다.

 

2. 자원을 합성하는 것이 불가능하다.

X가 자원 2에서 일부를 사용해 자원 1과 합성하는 어떤 작업을 한다고 가정하자.

 

명령 1

X는 자원 1에 접근해 락을 걸고 자원 1을 얻었다.

명령 2

X는 자원 2에 접근해 락을 걸고 자원 2를 얻을 것이다.

 

명령 1, 명령 2는 atomic 한 작업이다. 하지만 명령 1과 2 사이는 그렇지 못하다. 모든 코드를 synchronized 블록으로 감싸는 방법 말고는 해결책이 없을까?

 

해결책 - 트랜잭션 메모리

데이터베이스의 트랜잭션 기법을 메모리에 적용한 것

자원을 직접 변경하는 것이 아니라 일시적으로 별도 버전을 만들어서 그것을 변경하고 하나의 묶음 처리가 끝나면 반영하는 방법

 

이를 소프트웨어로 구현한 것이 Java VM 상에서 동작하는 Clojure

 

 

 

코딩을 지탱하는 기술
국내도서
저자 : 니시오 히로카즈 / 김완섭역
출판 : 비제이퍼블릭 2013.10.16
상세보기

'Review' 카테고리의 다른 글

웹을 지탱하는 기술 01  (0) 2021.01.23
코딩을 지탱하는 기술 04  (0) 2021.01.23
코딩을 지탱하는 기술 02  (0) 2021.01.23
코딩을 지탱하는 기술 01  (0) 2021.01.23
대규모 서비스를 지탱하는 기술 04  (0) 2021.01.12
profile

Zero to Hero

@Doljae

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