본문으로 건너뛰기

코딩을 지탱하는 기술 03

· 약 5분
Seokjae Lee
Software engineer

원문: https://doljae.tistory.com/34

병행처리​

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

협력적 멀티태스크​

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

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

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

<table class="tt-plugin-interpark" style="background: #fff; border: 1px solid #e0e0e0; width: 408px;" border="0" width="100%" cellspacing="0" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-border-top="" data-darkreader-inline-border-right="" data-darkreader-inline-border-bottom="" data-darkreader-inline-border-left=""><tbody><tr><td style="vertical-align: top; padding: 10px 0 10px 10px;" width="70"><a href="http://book.interpark.com/blog/integration/product/itemDetail.rdo?prdNo=213202081&amp;refererType=8303&amp;bookblockname=bpmain_in&amp;booklinkname=wg_search_EFEB8364BC43711681CC6C69032386A3753E74A4F9E4F62B3FA06C4836C10BAB&amp;key=EFEB8364BC43711681CC6C69032386A3753E74A4F9E4F62B3FA06C4836C10BAB" target="_blank" rel="noopener"><img style="border: 0 none;" src="http://bimage.interpark.com/goods_image/2/0/8/1/213202081h.jpg" width="66" height="90" data-darkreader-inline-border-top="" data-darkreader-inline-border-right="" data-darkreader-inline-border-bottom="" data-darkreader-inline-border-left=""></a></td><td style="vertical-align: top; padding: 10px 10px 10px 15px;"><dl style="margin: 0; padding: 2px 0 0 0; list-style: none; font: 11px dotum, sans-serif; letter-spacing: -1px; color: #777;" data-darkreader-inline-color=""><dt style="padding: 0; margin: 0;"><a style="font-size: 12px; color: #444 !important; font-weight: bold; text-decoration: none !important;" href="http://book.interpark.com/blog/integration/product/itemDetail.rdo?prdNo=213202081&amp;refererType=8303&amp;bookblockname=bpmain_in&amp;booklinkname=wg_search_EFEB8364BC43711681CC6C69032386A3753E74A4F9E4F62B3FA06C4836C10BAB&amp;key=EFEB8364BC43711681CC6C69032386A3753E74A4F9E4F62B3FA06C4836C10BAB" target="_blank" rel="noopener" data-darkreader-inline-color="">코딩을 지탱하는 기술</a></dt><dd style="padding: 7px 0 0 0; margin: 0; color: #a0a0a0;" data-darkreader-inline-color="">국내도서</dd><dd style="padding: 17px 0 0 0; margin: 0;">저자 : 니시오 히로카즈 / 김완섭역</dd><dd style="padding: 4px 0 0 0; margin: 0;">출판 : 비제이퍼블릭 <span style="letter-spacing: normal;">2013.10.16</span></dd></dl><a style="float: right; width: 44px; height: 11px; background: url('//t1.daumcdn.net/tistory_admin/static/images/icon_ipark_detail.gif') no-repeat; overflow: hidden; display: block; text-indent: -1000em;" href="http://book.interpark.com/blog/integration/product/itemDetail.rdo?prdNo=213202081&amp;refererType=8303&amp;bookblockname=bpmain_in&amp;booklinkname=wg_search_EFEB8364BC43711681CC6C69032386A3753E74A4F9E4F62B3FA06C4836C10BAB&amp;key=EFEB8364BC43711681CC6C69032386A3753E74A4F9E4F62B3FA06C4836C10BAB" target="_blank" rel="noopener" data-darkreader-inline-bgcolor="">상세보기</a></td></tr></tbody></table>