[운영체제] 멀티스레드의 문제점
💡 tl;dr
- 스레드(Thread)
- 멀티스레딩(multithreading)
- 멀티스레드의 장단점
- 자원 공유 문제의 해결책
멀티스레드
스레드란
- Thread 는 기본적으로
경량 프로세스
이다. - 자바는 멀티쓰레드 프로그래밍에 대해 내장 지원을 제공한다.
멀티스레드
- 멀티스레드는 멀티태스킹, 멀티프로그래밍, 멀티프로세싱 과는 구분되는 개념으로, 하나의 프로그램에서 둘 이상의 스레드를 사용하여 동시에 작업을 수행하는 것을 의미한다.
- 병렬로 실행될 수 있다.
- 멀티 스레드의 각 스레드는 자신이 속한 프로세스의 메모리(힙, 데이터 영역)를 공유한다.
- 운영 체제는 처리 시간을 다른 프로세스뿐만 아니라 프로세스 내 각 스레드간에도 나눈다.
장단점
장점
- 응답성 : 대화형 프로그램을 멀티스레드화하면, 프로그램의 일부분(스레드)이 중단되거나 긴 작업을 수행하더라도 프로그램의 수행이 계속되어, 사용자에 대한 응답성이 증가된다. 예를 들어, 멀티스레드가 적용된 웹 브라우저 프로그램에서 하나의 스레드가 이미지 파일을 로드하고 있는 동안, 다른 스레드에 사용자와의 상호 작용이 가능하다.
- 자원 공유 : 스레드는 자동적으로 그들이 속한 프로세스의 자원들과 메모리를 공유한다. 코드 공유의 이점은, 한 응용 프로그램이 같은 주소 공간 내에 여러 개의 다른 활동성 스레드를 가질 수 있다는 점이다.
- 경제성 : 프로세스 생성에 메모리와 자원을 할당하는 것은 비용이 많이 든다. 스레드는 자신이 속한 프로세스의 자원들을 공유하기 때문에, 스레드를 생성하고 문맥교환을 하는 편이 보다 경제적이다.
- 멀티프로세서 활용 : 멀티프로세서 구조에서는 각각의 스레드가 다른 프로세서에서 병렬로 수행될 수 있다. 단일 스레드 프로세스는 CPU가 많아도 CPU 한개에서만 실행된다. 즉, 다중 스레드화를 하면 다중 CPU에서 병렬성이 증가된다.
단점
- 다중 스레드는 캐시나 변환 색인 버퍼(TLB)와 같은 하드웨어 리소스를 공유할 때 서로를 간섭할 수 있다.
임계 영역
: 동시에 접근 후 연산이 늦게 끝난 스레드의 결과값으로 덮어 씌어지는 것- 힙과 데이터 영역을 공유하는 스레드들이 한 전역변수에 접근하여 동시에 연산을 수행할 때
임계 영역
이 발생할 수 있다.
- 하나의 스레드만 실행 중인 경우 싱글 스레드의 실행 시간이 개선되지 않고 오히려 지연될 수 있다.
- 멀티스레딩의 하드웨어 지원을 위해 응용 프로그램과 운영 체제 둘 다 충분한 변화가 필요하다.
- 스레드 스케줄링은 멀티스레딩의 주요 문제이기도 하다.
자원 공유 문제의 해결책
- 다중 스레드의 자원 공유 문제를 해결하는 것을
스레드 동기화
라고 하며 다음과 같은 두 가지 방법이 존재한다.
뮤텍스 (Mutex)
뮤텍스(Mutual Exclusion)
는 동시 접근을 막아 스레드를 동기화하는 방법이다.- 이미 접근한 스레드가 있다면
Block
신호를 줘서 더이상의 접근을 막고, 다른 스레드는 대기를 해야한다. - 자물쇠(lock)의 원리와 같다.
세마포어(Semaphore)
- 접근 순서까지 동기화 시키는 방법이다.
- 올바른 흐름대로 스레드가 진행될 수 있도록 순서를 정해준다.
- 순서를 설정해주는 성격을 보이기 때문에 3개 이상의 멀티 스레드에서 주로 사용한다.
- 세마포어의 종류
- 이진 세마포어(Binary Semaphore) : 0과 1만 사용하여 동기화( = mutex)
- 카운팅 세마포어(Counting Semaphore) : 증가하는 수를 이용하여 여러 스레드의 여러 자원을 동기화
JVM 메모리 모델
- 자바 JVM의 경우 조금은 다른 메모리 모델을 가지는데 JVM 자체가 운영체제에게 일정 메모리 영역을 할당받아 애플리케이션이 사용하는 것이다.
- 이를통해 JVM 내 사용자 레벨 스레드들은 별도의 콜스택에 지역변수(원시타입)와 메소드가 할당되며, 힙 영역에 모든 객체가 올라간다.
- 따라서 자바의 메모리 모델에서 객체가 메인 메모리에 할당되면 캐시에의해 이미 저장된 값을 가져올 수도 있고 아닐수도 있다.
- 각 스레드들의 접근이 어떻게 이루어질지 알 수가 없다
- 이 때문에 별도의 동기화, 연산 제한 등의 행동이 없을시엔 데이터의 무결성과 정합성을 보장할 수 없는 문제가 발생한다.
- 원자성을 보장하는 별도의 함수를 이용할 수 있지만, 락으로 인한 스레드 간의 경쟁 문제, 경쟁으로 인한 교착 상태 등이 발생할 수 있다.
참고
[운영체제] 멀티스레드의 문제점