동시성 프로그래밍 스터디

공상현 (Kong Sang Hyean)·2024년 2월 28일
1

study

목록 보기
4/4

프로세스와 스레드

동시성과 관련하여 떠올랐던 컴퓨터 시스템이 서비스 처리와 연관이 있는 프로세스랑 스레드라고 생각이 들었다.
따라서 동시성에 대해 공부해조기 전 여러 아티클과 문서를 읽어보면서 프로세스랑 스레드에 대해 정리해보았다.

프로세스

프로세스를 정리하자면 실행 중인 프로그램의 인스턴스로 정의할 수 있다.
각 프로세스 내에서는 바이너리 이미지, 가상화된 메모리, 다양한 커널 리소스, 관련 보안 컨텍스 등 독립적인 실행 환경으로 이루어지고 있다. 따라서 위의 실행 환경을 구성하기 위한 자체 리소스가 필요하다.

스레드

스레드는 다른 코드와 독립적으로 실행될 수 있는 프로세스 내의 실행 단위로 정의할 수 있다. 프로세스랑 마찬가지도 실행 환경을 제공하지만 프로세스 보다 적은 양의 리소스가 필요하다.
또한 프로세스 내에서는 하나 이상의 스레드가 반드시 포함이 되어져 프로세스 내의 리소스 간 공유가 가능하다.

JAVA 같은 경우 Runnable와 Tread 인터페이스를 상속받아 특정 스레드를 실행하거나 제어할 수 있다.

  • Thread thread = new Thread() : 새로운 스레드를 생성한다.
  • Tread.start() : 지정한 스레드를 실행한다.
  • Thread.interrupted() : 실행 중인 스레드를 중지시키고 대기중인 다른 스레드를 실행시킨다.
  • Tread.join() : 지정한 스레드가 다른 스레드가 완료될 때까지 대기하게 된다.
  • Tread.sleep() : 실행한 스레드를 지정한 시간 동안 중지시킨다.

참고 자료

동시성 프로그래밍

Synchronized를 이용한 동시성 제어

함수에 Synchronized을 추가하거나 @Synchronized를 추가하여 위 함수를 실행하는 스레드에 동시성을 부여해준다.
부여해준 함수는 하나의 스레드만 실행이 가능하며 실행 중 다른 스레드가 접근할 시 그 스레드는 함수가 끝날 때 까지 대기 상태를 거치게 된다.

synchronized fun testFunction() {
    /* 동시성을 적용할 부분 함수 내용 */
}

Synchronized를 이용한 방법

@Synchronized
fun testFunction() {
     /* 동시성을 적용할 부분 함수 내용 */
 }

@Synchronized 어노테이션을 이용한 방법

다만 위와 같이 함수 전체에 동시성을 부여할 경우 함수 내의 크기가 커질 때 동시성 때문에 처리되는 시간에 영향을 미칠 수도 있다.

위와 같은 문제를 해결하기 위하여 함수 내 임계영역을 설정하여 동시성 작업이 필요한 특정한 부분에 동시성을 부여할 수 있다. 위를 이용하여 동시성을 부여전 중복 된 스레드 요청이 없는지 확인하는 유효성을 검사하는 등의 전처리 작업을 부여할 수 있는 응용법이 가능하다.

synchronized("lockName") {
	/* 동시성을 적용할 부분 함수 내용 */
}

임계영역을 이용하여 부분적으로 동시성을 부여한 방법

단점과 다음

위의 방법으로 동시성을 부여하여 스레드를 처리할 수 있지만 다음과 같은 경우 동시성이 적용이 되지 않는 경우가 있다. 위와 같은 경우 서비스가 아닌 DB쪽에서 설정해야만 가능하다고 나와있다.

  • 클라이언트 요청에 처리하는 서버가 1개가 아닌 2개 이상일 때

또한 데드락 등 동시성을 사용하여 나타나는 문제점을 고려하여 동시성 부여를 고려하여 작성해야한다.

다음 번에는 DB 내 테이블에서 어떻게 동시성을 부여하는지 알아볼 예정이다.

profile
개발자 같은 거 합니다. 1인분 하는 개발자로서 살아갈려고 노력 중입니다.

0개의 댓글