금번 스터디 주제는 concurrent programming 입니다.

멀티코어 환경에서 코어 갯수가 2배로 늘어나면 성능도 2배로 늘어나기를 기대하지만, 실제로 thread가 어떤 구조로 되어있고, 어떤 자원들이 공유되며, 해당 공유 자원을 코어가 어떻게 처리하는지에 대한 정확한 이해가 없으면 이러한 성능향상은 있을 수 없습니다. 때문에 멀티코어 환경에서 프로그램의 성능을 높이려면 concurrent 한 데이터 처리 기법에 대한 이해가 반드시 필요합니다.

스터디 시작 전 미리 알아두어야 할 사전 지식에 대하여

  • 자료 링크
  • (설명이 필요한 내용은)간단한 설명

를 이 페이지에 정리해 두었으니 스터디 시작 전에 미리 공부를 해두었으면 합니다.

사전 학습 내용은 모두 java 및 jvm 내용이지만, 다른 언어/os 도 비슷비슷합니다. 하나만 제대로 알고 있으면 나머지는 쉽게 이해가능합니다.

jvm memory 구조

jvm run-time data area

dependency hell과 빌드지옥 탈출

jvm의 메모리 구조를 잘 이해하려면 java process가 어떻게 동작하는지 알아야 합니다. 근데 아이러니하게도 java process가 어떻게 동작하는지 알려면 jvm의 메모리 구조를 이해하고 있어야 합니다. 이러한 모순적 상황에서 이해의 수준을 높이려면 메모리 구조와 process 의 동작 원리를 반복적으로 여러번 공부하는 방법 밖에는 없습니다.

runtimeArea.PNG

jvm 내에서 프로세스의 흐름을 기술하기 위한 저장 영역을 run-time data area 라고 합니다. 어떤 process가 실행되어 종료될 때 까지 사용되는 모든 데이터는 이 영역에 기록됩니다.

  • program counter register : 프로그램 카운터(pc)는 현재 동작중인 프로세스/또는 쓰레드가 sleep 상태에 진입하여 CPU 점유권을 잃어버렸다가 다시 되찾을 때 현재 이 쓰레드가 어디까지 진행되었는지에 대한 기록을 남겨놓기 위한 저장공간입니다. pc register에는 현재 진행중인 instruction의 주소값이 저장됩니다.
  • jvm stack : 프로그램 내에서 method가 호출되면 그 method 를 수행하기 위해 필요한 저장공간을 제공합니다. 또한 method의 호출은 계층적으로 호출순서가 발생하므로 이 순서를 보장하여 처리하기 위해 stack 을 사용합니다. stack에 저장되는 element의 단위는 frame 이라 합니다.
  • native method stack : native method stack은 조금 특별한 영역으로, jvm의 깍두기와도 같은 예외 케이스입니다. 외부에서 실행되는 native process와의 인터페이스(jni) 를 호출하기 위한 공간입니다.
  • method area : method area는 프로그램을 실행하기 위한 메타정보(class구조, method, constructor 등등)을 저장하는 영역입니다. 특히 static 으로 선언된 변수가 이 영역에 저장된다는 사실을 기억해 두기 바랍니다.
  • run time constant pool : run time constant pool 은 method area 내부에 존재하는 영역으로, constant,  class 및 interface의 symbolic reference table 정보 등을 저장하고 있습니다.
  • heap : run time 에 동적으로 할당되는 데이터가 저장되는 영역입니다. heap에 할당된 데이터는 gc의 대상입니다.

지금부터 설명하는 내용이 중요합니다. run-time data area 내에서 어떤 영역은 프로세스 내의 모든 thread 들이 공유하는 반면, 어떤 영역은 각 thread 마다 독립적으로 생성됩니다. 여기서 thread 간에 공유되는 리소스 영역이 중요합니다. 극단적으로 말하면 모든 쓰레드 문제는 동기화 문제이며, 모든 동기화 문제는 공유 리소스로부터 발생합니다.

run-time data area 에서 다음 영역은 process 내 모든 thread가 공유합니다.

  • method area
  • run-time constant pool
  • heap

다음 영역은 thread 1개 마다 독립적으로 1개씩 생성되며, 데이터는 공유되지 않습니다.

  • program counter register
  • stack
  • native method stack

runtimeArea2.PNG

java process

process 를 간결하고 정확하게 정의하자면, “program in execution”(=실행중인 프로그램)입니다.

process 가 실행되는 순서는 다음과 같습니다.

  1. jvm startup
  2. load class
  3. link class
  4. init class
  5. create class

java process의 동작 원리를 자세하게 설명하는 것은 본 문서의 목적을 넘어서므로 무얼 보고 공부해야 하는지 링크만 제공합니다.

java program execution

 

댓글 남기기

인기 검색어

01010011에서 더 알아보기

지금 구독하여 계속 읽고 전체 아카이브에 액세스하세요.

Continue reading