동시성 개념과 동시성 문제

배수연·2024년 5월 21일

개념

동시성(Concurrency) vs. 병렬성(Parallelism)

1. 동시성 (Concurrency)

  • 여러 작업을 동시에 실행하는 것이 아니라, CPU가 작업마다 시간을 분할해 적절히 Context Switching함으로써 동시에 실행되는 것처럼 보이게 하는 것을 동시성이라고 한다.

    • Context Switching이란 멀티 프로세스 환경에서 CPU가 하나의 프로세스를 실행하고 있는 상태에서 다음 우선 순위의 프로세스를 실행해야할 때, 기존 프로세스의 상태(Context)를 저장해두고 CPU 가 다음 프로세스를 수행하도록 다음 프로세스의 상태(Context)로 교체하는 작업을 말한다.
    • 단 Context Switching 때 CPU는 아무 일도 하지 못하므로 Context Switching이 잦아지면 오히려 오버헤드가 발생해 효율(성능)이 떨어진다.
  • 동시성은 대개 스레드, 코루틴, 비동기 프로그래밍 등의 방법을 사용하여 구현된다.

2. 병렬성 (Parallelism)

  • 독립적으로 동시에 여러 작업을 실행하는 것을 병렬성이라고 부르며, 동시성과는 다르게 여러 작업을 다른 코어, 다른 프로세스, 별도의 컴퓨터 등에서 동시에 실행할 수 있다.
  • 많은 작업을 병렬 처리함으로써 성능을 향상시킬 수 있지만 적절한 작업 분배가 이루어져야 한다는 전제 조건이 있다.

논리적인 개념?

  • 동시성은 절대적인 시간 관점에서는 동시에 처리되지 않으나, 논리적으로 동시에 실행하는 것처럼 보이게 하므로 논리적 개념이라고 한다.
  • 반면 병렬성은 실제-즉 물리적인 시간 상에서 동시에 실행되므로 물리적 개념이다.

동시성 문제

여러 쓰레드동시에 같은 인스턴스의 필드 값을 변경하면서 발생하는 문제를 동시성 문제라고 한다. 동시성 문제는 여러 쓰레드가 같은 인스턴스의 필드에 접근해야 하므로 트래픽이 많을 때 자주 발생하게 된다.

특히 자바의 스프링은 기본적으로 스프링 빈을 싱글톤으로 등록하기 때문에 싱글톤 객체의 필드를 변경하며 사용할 때 이러한 동시성 문제가 생길 수 있다.

동시성 문제는 쓰레드마다 다른 메모리영역이 할당된 지역 변수에서는 발생하지 않고, 주로 같은 인스턴스의 필드에 접근할 때(싱글톤) 또는 static같은 공용 필드에 접근할 때 발생한다.

싱글톤 패턴(Singletone pattern)이란?

  • 간단히 말하면 객체의 인스턴스를 하나만 생성되게 하여, 해당 객체를 공유하며 사용하는 디자인 패턴이다. (자세한 내용 참고)

동시성 문제 해결 방법 (쓰레드 로컬)

쓰레드 로컬은 해당 쓰레드만 접근할 수 있는 특별한 저장소를 말한다.

자바에서는 java.lang.ThreadLocal을 지원한다.
동시성 문제가 발생하는 필드의 타입을 ThreadLocal<>로 변경하여 사용한다.

  • 여러 쓰레드가 같은 인스턴스의 필드에 접근하면 동시성 문제로 처음 쓰레드가 보관한 데이터가 사라질 수 있다.
  • 그러나 쓰레드 로컬을 사용하면 각 쓰레드마다 별도의 내부 저장소를 제공하여, 같은 인스턴스의 쓰레드 로컬 필드에 접근해도 문제가 생기지 않는다. 지역변수에서는 동시성 문제가 생기지 않는 것과 같게 볼 수 있다.

단, 주의할 점으로는 해당 쓰레드가 쓰레드 로컬을 모두 사용하고 나면 ThreadLocal.remove()를 호출하여 쓰레드 로컬에 저장된 값을 제거해주어야 한다.

  • WAS(Web Application Server - 톰캣 등)는 사용이 끝난 쓰레드를 쓰레드 풀에 반납하고, 다음 요청에 다시 쓰레드 풀에서 쓰레드를 꺼내 재사용한다. 이 때 사용했던 쓰레드에 데이터가 남아있는 채로 쓰레드 풀에 반납되면 그 쓰레드를 다시 쓰레드 풀에서 꺼내 사용하는 사용자는 의도와 다르게 이전에 남아 있던 쓰레드의 데이터를 조회하게 된다.

다음 주차에는 스프링에서의 동시성에 대해 더 집중적으로 살펴보고, 레이스 컨디션 및 데드락문제, 해결방안에 대해 살펴볼 예정이다.

출처
https://velog.io/@kwontae1313/동시성과-병렬성의-개념과-차이https://velog.io/@wlsrhkd4023/동시성Concurrency과-병렬성Parallelism-차이
https://shuu.tistory.com/56
https://hstory0208.tistory.com/entry/Spring-%EB%8F%99%EC%8B%9C%EC%84%B1-%EB%AC%B8%EC%A0%9C%EC%99%80-%ED%95%B4%EA%B2%B0-%EC%93%B0%EB%A0%88%EB%93%9C-%EB%A1%9C%EC%BB%AC
https://jeong-pro.tistory.com/93

0개의 댓글