프로그래머호이잇

5장 동시성 본문

아키텍처패턴

5장 동시성

호이잇! 2022. 9. 18. 23:46

동시성은 소프트웨어 개발에서 가장 까다로운 측면 중 하나이다. 여러 프로세스나 스레드가 동일한 데이터를 조작하는 경우 필연적으로 동시성 문제가 발생한다.
동시성문제 개념
1. 손실된 업데이트
A가 파일 abc를 수정하는 중 B가 동일한 파일인 abc파일을 수정 후 저장한다.
A가 파일을 읽은 시점에는 B가 수정한 내용이 없으므로 A는 파일 수정 시 B가 수정한 내용은 반영되지 않는다.
2. 일관성 없는 읽기
A가 디레토리 a 의 하위 파일 수 와 디렉토리 b의 하위 파일 수를 알려고 한다. a의 디렉토리에 파일 수를 확인 후 잠시 자리를 비운동안 B가 a 디렉토리에 작업을 하여 파일을 3개 추가하면 A는 그내용이 반영되지 않은 파일의 수만 읽게된다.
이러한 문제는 동시성의 가장 기본적인 문제이다.

실행 컨텍스트
외부 세계와 상호작용하는 관점에서 중요한 두 가지 컨텍스트로 요청과 세션이 있다.
요청 (request)는 소프트웨어가 작업하고 선택적으로 응답을 보내야 하는 외부세계로부터의 단일 호출에 해당한다.
세션(session)은 클라이언트와 서버간에 오랫동안 실행되는 상호작용이다.
운영체제와 관련된 두 가지 용어로 프로세스와 스레드가 있다.
프로세스는 사용하는 내부 데이터에 대한 다단계 격리를 제공하는 대규모 실행 컨텍스트이다.
스레드는 한 프로세스 내에서 작동하고 일반적으로 메모리를 공유하여 동시성 문제를 유발할수 있다.
데이터베이스를 처리할 때는 트랜잭션 이라는 중요한 컨텍스트가 있다.
트랙잭션을 이용하면 클라이언트가 단일 요청인 것처럼 처리하고 싶은 여러요청을 하나로 처리할 수 있다.

격리와 불변성
동시성 문제는 프로세스나 스레드와 같은 활성 에이전트가 동시에 둘 이상 동일한 데이터에 접근할 때 발생한다.
이 문제를 해결하는 한가지 방법은 격리를 통해 데이터를 분리함으로써 하나의 활성 에이전트만 데이터에 접근할 수 있게 하는 것이다.
격리는 오류 발생 가능성을 낮추는 필수 기법이다.
동시성 문제는 공유하는 데이터가 수정될 수 있을 때만 발생한다. 따라서 변경 불가능한 데이터를 인식할 수 있다면 동시성 충돌을 예방할 수 있다. 많은 시스템에서 가장 중요한 작업은 데이터 수정이므로 모든 데이터를 변경 불가능하게 만들수는 없다. 그러나 일부 데이터를 변경 불가능하게 만들면 동시성 문제에 대한 우려를 줄이면서 데이터를 공유할 수 있다.

낙관적 동시성 제어와 비관적 동시성 제어
격리가 불가능한 데이터는 어떻게 해야될까? 이러한 데이터는 낙관적 동시성 제어와 비관적 동시성 제어라는 두가지 방법으로 제어할 수 있다.
낙관적 잠금을 사용하는 경우에는 두 사용자가 모두 자유롭게 파일을 복사하고 편집할 수 있다. A가 수정 중 B가 수정을 완료하면 A가 완료시점에 동시성 제어가 동작하고 변경충돌을 관리하여 B의 수정 내용을 반영할지 말지 결정하는 것이다.(Git,SVN등의 형상 관리 방식으로 보임)
비관적 잠금은 A가 이용시 아무도 편집이 불가능한 상태로 변경되고 A가 완료되어야 B가 수정가능하다. (NAS에서 엑셀 읽기 등이 해당되는 것 같다.)

일관성 없는 읽기 예방
읽기와 쓰기 모두 비관적 잠금으로 제어하는 방법이 있다. A가 파일을 읽을 시 아무도 읽기가 불가능하며 편집시에도 동일하게 적용되는 것이다.
또 한가지 방법으로는 임시 읽기를 이용하는 것이다. 이 기능은 읽은 모든 데이터에 일종의 타임스탬프나 읽기 전용 라벨을 붙이며, 데이터베이스는 이 시간이나 라벨을 기준으로 데이터를 변환한다.

교착상태
비관적 잠금 기법에서 발생하는 특수한 문제로 교착상태가 있다. 이 문제를 해결할 수 있는 방법중 하나는 모든 잠금에 시간 제한을 두는 방식이 있다. 시간이 초과되면 잠금과 작업이 모두 손실된다. 교착 상태를 감지할 수 있는 소프트웨어를 사용하는 것이다. 교착 상태가 발생하면 희생자 한 명을 선택해 해당 사용자의 작업과 잠금을 포기해 교착상태를 해결하는 것이다. 이 기능은 교착상태를 감지하기가 매우 어렵고 희생자의 작업에 피해를 준다는 단점이 있다.
교착상태를 아예 발생하지 않도록 하는 방법이 있다. 교착상태는 근본적으로 이미 잠금을 가진 사용자가 다른 잠금을 얻으려 할때 발생하므로 추가 잠금을 얻지 못하게하여 예방할 수 있다.

'아키텍처패턴' 카테고리의 다른 글

4장 웹 프레젠테이션  (0) 2021.12.19
ORM 소스 예제  (0) 2021.12.06
2장 도메인논리 구성  (0) 2021.12.06
3장 관계형 데이터베이스  (0) 2021.11.29