ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Thread란 무엇인가?
    공부 이야기/일과 관련된 공부 2020. 11. 29. 22:49

    동시처리와 병렬처리를 가능하게 하기 위해서 가장 중요한 프로그래밍 개념 중 하나인 쓰레드!

    그 쓰레드에 대해 기본부터 상세하게 알아보도록 한다.

    그림에서와 같이 프로세스와의 차이점을 예로 들며 시작하겠다.

     

    첫번째로는 메모리 사용의 차이이다.

    우선 설명하기에 앞서 메모리에는 code, data, heap, stack의 영역이 있다.

    int num = 172; 

    라는 구문이 있다.

    int는 기계어로 번역되서 code로

    num은 사용자 변수이기 때문에 data로

    또, 이런 구문이 늘어나면 heap 메모리를 사용해서 데이터를 저장할 것이다.

    반면 컴파일 시점에 저장되는 stack 영역도 있다.

     

    서두에 말했듯이 하나의 프로세스 안에 여러 개의 쓰레드를 둘 수 있다. 각각의 쓰레드들은 code, data, heap 메모리 영역은 공유하지만 stack은 독자적이다.

    stack 영역은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 (entry point) 및 지역 변수 등을 저장하기 위해 사용되는 메모리 공간이다. 이 경우는 레지스터의 PC, MAR, MBR를 까보면 알 수 있다.

    따라서 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고, 이는 독립적인 실행 흐름이 추가되는 것이다. 결과적으로 실행 흐름의 추가를 위한 조건이 독립된 스택을 제공하는 것이다. 

    두 번째로는 문맥 교환과 통신의 차이이다.

    프로세스는 보조기억장치에서 대기 중인 프로그램이 주기억장치로 올라오면서 실행이 되는데

    이러한 과정을 문맥 교환이라고 하며 준비 -> 실행 -> 대기라는 상태 전이를 가지게 된다.

    같은 메모리를 공유하고 있는 쓰레드의 경우 문맥 교환으로 발생하는 오버헤드가 상대적으로 적다.

    보조기억장치와 주기억장치를 넘나드는 프로세스 문맥교환과 다르게 쓰레드는 주기억장치 안에서만 돌기 때문이다.

    이처럼 공통된 데이터 영역 안에서 서로 값을 주고 받을 수 있기 때문에 통신 부하도 적다.

    반면 프로세스의 경우에는 서로 공유하는 영역이 없기 때문에 IPC(Inter-Process Comm)라는 호출 방식을 통해 통신을 하며 데이터를 주고 받는다.

     

     

    한편 쓰레드는 OS의 개입 정도에 따라 커널 수준 쓰레드 사용자 수준 쓰레드로 나뉜다.

    OS에 직접 쓰레드를 관리하는 커널 수준 쓰레드 방식과는 다르게 Runtime System이라는 것을 이용해서 쓰레드를 관리하는 방식이 사용자 수준 쓰레드 방식이다.

    JAVA에선 JVM이 런타임 시스템 역할을 한다.

    결론적으로 말하면 커널 수준 쓰레드보다 사용자 수준 쓰레드가 훨씬 효율적이다. 

    사용자 수준 쓰레드에서는 OS가 Runtime System에 의탁(?)을 하는 방식이기 때문에 업무 단위를 프로세스로 보는 반면

    커널 수준 쓰레드는 OS가 직접 쓰레드의 상태전이를 관리하기 때문에 똑같은 문맥 교환이 발생해도 부담이 더 크다.

    쉽게 설명하면 3개의 프로세스에 6개씩 쓰레드가 있는 구조라고 하자.

    커널 수준 쓰레드의 경우 총 18개의 문맥 교환에 따른 상태 전이를 지켜보고 있어야하지만 사용자 수준 쓰레드는 단 3개만 관리하면 된다.

    OS에서 많은 부분을 차지하고 있기 때문에 커널 수준 쓰레드는 이식성도 떨어지는 법이다.

    해당 이유는 마이크로 커널 방식과 모놀로식 커널 방식의 차이와 비슷하다.

    단, 사용자 수준 쓰레드의 경우에는 구현하는데 일련의 알고리즘을 구상해야하며 커널을 직접 호출할 수 없고 CPU 사용 반납을 자체적으로 할 수 없다는 것이 유일한 흠이다.

     

     

    '공부 이야기 > 일과 관련된 공부' 카테고리의 다른 글

    Spring JDBC  (0) 2021.08.11
    운영에서 발생한 일 - Optimizer, index  (0) 2021.08.09
    <SQL Loader> CTL에 대해서  (0) 2021.08.09
    동시성에 대하여 (JAVA)  (0) 2021.08.08
    JAVA equals(), hashcode() 메소드  (0) 2020.12.14
Designed by Tistory.