[운영체제] 멀티스레드의 문제점

[운영체제] 멀티스레드의 문제점

💡 tl;dr


  1. 스레드(Thread)
  2. 멀티스레딩(multithreading)
  3. 멀티스레드의 장단점
  4. 자원 공유 문제의 해결책



멀티스레드


멀티스레드 메모리 구조

스레드란


  • Thread 는 기본적으로 경량 프로세스이다.
  • 자바는 멀티쓰레드 프로그래밍에 대해 내장 지원을 제공한다.


멀티스레드

  • 멀티스레드는 멀티태스킹, 멀티프로그래밍, 멀티프로세싱 과는 구분되는 개념으로, 하나의 프로그램에서 둘 이상의 스레드를 사용하여 동시에 작업을 수행하는 것을 의미한다.
    • 병렬로 실행될 수 있다.
  • 멀티 스레드의 각 스레드는 자신이 속한 프로세스의 메모리(힙, 데이터 영역)를 공유한다.
  • 운영 체제는 처리 시간을 다른 프로세스뿐만 아니라 프로세스 내 각 스레드간에도 나눈다.



장단점



장점

  • 응답성 : 대화형 프로그램을 멀티스레드화하면, 프로그램의 일부분(스레드)이 중단되거나 긴 작업을 수행하더라도 프로그램의 수행이 계속되어, 사용자에 대한 응답성이 증가된다. 예를 들어, 멀티스레드가 적용된 웹 브라우저 프로그램에서 하나의 스레드가 이미지 파일을 로드하고 있는 동안, 다른 스레드에 사용자와의 상호 작용이 가능하다.
  • 자원 공유 : 스레드는 자동적으로 그들이 속한 프로세스의 자원들과 메모리를 공유한다. 코드 공유의 이점은, 한 응용 프로그램이 같은 주소 공간 내에 여러 개의 다른 활동성 스레드를 가질 수 있다는 점이다.
  • 경제성 : 프로세스 생성에 메모리와 자원을 할당하는 것은 비용이 많이 든다. 스레드는 자신이 속한 프로세스의 자원들을 공유하기 때문에, 스레드를 생성하고 문맥교환을 하는 편이 보다 경제적이다.
  • 멀티프로세서 활용 : 멀티프로세서 구조에서는 각각의 스레드가 다른 프로세서에서 병렬로 수행될 수 있다. 단일 스레드 프로세스는 CPU가 많아도 CPU 한개에서만 실행된다. 즉, 다중 스레드화를 하면 다중 CPU에서 병렬성이 증가된다.


단점

  • 다중 스레드는 캐시나 변환 색인 버퍼(TLB)와 같은 하드웨어 리소스를 공유할 때 서로를 간섭할 수 있다.
    • 임계 영역 : 동시에 접근 후 연산이 늦게 끝난 스레드의 결과값으로 덮어 씌어지는 것
    • 힙과 데이터 영역을 공유하는 스레드들이 한 전역변수에 접근하여 동시에 연산을 수행할 때 임계 영역이 발생할 수 있다.
  • 하나의 스레드만 실행 중인 경우 싱글 스레드의 실행 시간이 개선되지 않고 오히려 지연될 수 있다.
  • 멀티스레딩의 하드웨어 지원을 위해 응용 프로그램과 운영 체제 둘 다 충분한 변화가 필요하다.
  • 스레드 스케줄링은 멀티스레딩의 주요 문제이기도 하다.



자원 공유 문제의 해결책


  • 다중 스레드의 자원 공유 문제를 해결하는 것을 스레드 동기화라고 하며 다음과 같은 두 가지 방법이 존재한다.


뮤텍스 (Mutex)

  • 뮤텍스(Mutual Exclusion)는 동시 접근을 막아 스레드를 동기화하는 방법이다.
  • 이미 접근한 스레드가 있다면 Block 신호를 줘서 더이상의 접근을 막고, 다른 스레드는 대기를 해야한다.
  • 자물쇠(lock)의 원리와 같다.


세마포어(Semaphore)

  • 접근 순서까지 동기화 시키는 방법이다.
  • 올바른 흐름대로 스레드가 진행될 수 있도록 순서를 정해준다.
  • 순서를 설정해주는 성격을 보이기 때문에 3개 이상의 멀티 스레드에서 주로 사용한다.
  • 세마포어의 종류
    1. 이진 세마포어(Binary Semaphore) : 0과 1만 사용하여 동기화( = mutex)
    2. 카운팅 세마포어(Counting Semaphore) : 증가하는 수를 이용하여 여러 스레드의 여러 자원을 동기화



JVM 메모리 모델

JVM 메모리모델

  • 자바 JVM의 경우 조금은 다른 메모리 모델을 가지는데 JVM 자체가 운영체제에게 일정 메모리 영역을 할당받아 애플리케이션이 사용하는 것이다.
  • 이를통해 JVM 내 사용자 레벨 스레드들은 별도의 콜스택에 지역변수(원시타입)와 메소드가 할당되며, 힙 영역에 모든 객체가 올라간다.


메인 메모리에 객체가 할당된 경우의 멀티코어 모델

  • 따라서 자바의 메모리 모델에서 객체가 메인 메모리에 할당되면 캐시에의해 이미 저장된 값을 가져올 수도 있고 아닐수도 있다.
    • 각 스레드들의 접근이 어떻게 이루어질지 알 수가 없다
  • 이 때문에 별도의 동기화, 연산 제한 등의 행동이 없을시엔 데이터의 무결성과 정합성을 보장할 수 없는 문제가 발생한다.
  • 원자성을 보장하는 별도의 함수를 이용할 수 있지만, 락으로 인한 스레드 간의 경쟁 문제, 경쟁으로 인한 교착 상태 등이 발생할 수 있다.



참고


멀티스레딩 - wiki
멀티스레드 blog
자바에서의 멀시트레스 문제 - agugu95 velog


[운영체제] 멀티스레드의 문제점

https://sklubmk.github.io/2021/11/02/c1e2d0636ea9/

Author

Jinki Kim

Posted on

2021-11-02

Updated on

2021-11-02

Licensed under

댓글