동시성 이슈가 뭐고 발생하는 원인이 뭔가요?
동시성 이슈는 다음 세 가지 조건이 충족될 때 발생할 수 있습니다.
- 공유 자원에 접근한다.
- 동기화 없이 접근한다.
- 적어도 하나의 스레드가 자원을 변경한다.
이 세 가지 조건이 충족되면 스레드가 변경한 값을 다른 스레드가 읽으면서 발생하는 문제, 데드락, 기아 현상 등 다양한 동시성 이슈가 발생할 수 있습니다.
동시성 이슈를 방지하려면 앞서 언급한 세 가지 조건 중 하나를 끊으면 됩니다. 보통은 동기화를 통해 이 문제를 해결하며, 자바의 synchronized
, lock
키워드나 데이터베이스의 락을 활용해 제어하는 경우가 많습니다.
이 글에서는 이러한 동기화 방법을 중심으로 살펴보겠습니다.
공유자원이란 무엇인가요?
공유 자원은 여러 프로세스나 스레드가 동시에 접근할 수 있는 메모리, 파일, 데이터베이스 등을 말하며, 분산 시스템에서는 네트워크를 통해 공유되는 자원도 포함됩니다.
- 메모리에서는 프로세스나 스레드가 동시에 접근하고 읽거나 쓸 수 있는 메모리 공간을 공유 자원이라 합니다. 예를 들어, 힙 영역과 메타스페이스가 여기에 속하며, 자바에서는
synchronized나
lock을
사용해 관리하기 때문에 비교적 제어가 쉬운 편입니다. - 파일에서는 여러 프로세스가 동시에 접근할 수 있기 때문에 제어가 까다롭습니다. 이러한 경우 OS 내부에서 락을 획득해 제어합니다.
- 데이터베이스에서는 여러 사용자가 네트워크를 통해 공유 자원에 접근하기 때문에 트랜잭션 관리와 동시성 제어가 중요한 부분입니다.
임계영역이란 무엇인가요?
임계 영역은 서로 다른 트랜잭션이 동일한 공유 자원에 접근하여 변경할 수 있는 영역입니다. 이 영역에서 각 트랜잭션의 스케줄이 수행되며, 동시성 이슈가 발생할 수도 있고, 발생하지 않을 수도 있습니다.
serial schedule 과 non-serial schedule
스케줄은 여러 트랜잭션이 동시에 실행될 때, 각 트랜잭션의 작업 실행 순서를 의미합니다. 스케줄을 통해 동시 실행을 간단히 표현할 수 있습니다.
아래는 Serial Schedule을 나타낸 것으로, 트랜잭션1이 A 자원을 읽고 쓰기를 완료한 후 트랜잭션2가 A 자원을 읽고 쓰는 순서입니다. 각 작업이 순차적으로 실행되기 때문에 동시성 이슈가 발생하지 않습니다.
다음은 Non-Serial Schedule을 나타낸 것으로, 트랜잭션1이 작업을 완료하기 전에 트랜잭션2가 작업을 시작합니다. 이 경우 동시성 이슈가 발생할 위험이 있습니다.