동시성과 관련하여 떠올랐던 컴퓨터 시스템이 서비스 처리와 연관이 있는 프로세스랑 스레드라고 생각이 들었다.
따라서 동시성에 대해 공부해조기 전 여러 아티클과 문서를 읽어보면서 프로세스랑 스레드에 대해 정리해보았다.
프로세스를 정리하자면 실행 중인 프로그램의 인스턴스로 정의할 수 있다.
각 프로세스 내에서는 바이너리 이미지, 가상화된 메모리, 다양한 커널 리소스, 관련 보안 컨텍스 등 독립적인 실행 환경으로 이루어지고 있다. 따라서 위의 실행 환경을 구성하기 위한 자체 리소스가 필요하다.
스레드는 다른 코드와 독립적으로 실행될 수 있는 프로세스 내의 실행 단위로 정의할 수 있다. 프로세스랑 마찬가지도 실행 환경을 제공하지만 프로세스 보다 적은 양의 리소스가 필요하다.
또한 프로세스 내에서는 하나 이상의 스레드가 반드시 포함이 되어져 프로세스 내의 리소스 간 공유가 가능하다.
JAVA 같은 경우 Runnable와 Tread 인터페이스를 상속받아 특정 스레드를 실행하거나 제어할 수 있다.
참고 자료
함수에 Synchronized을 추가하거나 @Synchronized를 추가하여 위 함수를 실행하는 스레드에 동시성을 부여해준다.
부여해준 함수는 하나의 스레드만 실행이 가능하며 실행 중 다른 스레드가 접근할 시 그 스레드는 함수가 끝날 때 까지 대기 상태를 거치게 된다.
synchronized fun testFunction() {
/* 동시성을 적용할 부분 함수 내용 */
}
Synchronized를 이용한 방법
@Synchronized
fun testFunction() {
/* 동시성을 적용할 부분 함수 내용 */
}
@Synchronized 어노테이션을 이용한 방법
다만 위와 같이 함수 전체에 동시성을 부여할 경우 함수 내의 크기가 커질 때 동시성 때문에 처리되는 시간에 영향을 미칠 수도 있다.
위와 같은 문제를 해결하기 위하여 함수 내 임계영역을 설정하여 동시성 작업이 필요한 특정한 부분에 동시성을 부여할 수 있다. 위를 이용하여 동시성을 부여전 중복 된 스레드 요청이 없는지 확인하는 유효성을 검사하는 등의 전처리 작업을 부여할 수 있는 응용법이 가능하다.
synchronized("lockName") {
/* 동시성을 적용할 부분 함수 내용 */
}
임계영역을 이용하여 부분적으로 동시성을 부여한 방법
위의 방법으로 동시성을 부여하여 스레드를 처리할 수 있지만 다음과 같은 경우 동시성이 적용이 되지 않는 경우가 있다. 위와 같은 경우 서비스가 아닌 DB쪽에서 설정해야만 가능하다고 나와있다.
또한 데드락 등 동시성을 사용하여 나타나는 문제점을 고려하여 동시성 부여를 고려하여 작성해야한다.
다음 번에는 DB 내 테이블에서 어떻게 동시성을 부여하는지 알아볼 예정이다.