과제 1. JDK, JDR, JVM?, Java 동작원리

DaewoongJeon·2021년 1월 15일
0

1. 학습 전 필요지식 습득

  • java 동작원리나 개념에 대해 원할히 공부하기 위해 기본적인 cs지식의 필요성을 느껴서 관련 운영체제나 프로세스 등과 같은 cs지식에 대해 가볍게 공부하였다.

a. 운영체제(OS : Operating System)

  • 정의 : 어떤 프로그램을 사용할 때, HW와의 상호작용을 위한 중간 관리자 역할. HW와의 상호작용을 어떻게 하느냐에 따라 운영체제가 다양화 됨.
  • 커널이란?
    : HW와 연결고리를 지어주는 역할. (ex. 하드웨어가 마우스의 움직임을 받아서 커널을 통해 운영체제에 전달하면 운영체제는 디스플레이를 통해 마우스의 움직임을 표현함)
  • 운영체제 없이 프로그램을 구현한다는 것은 종이없이 책을 쓴다는 것과 같은 맥락
  • 참고 : https://youtu.be/TpjdbdGGjsQ

1) 운영체제의 다양한 특성

  1. 싱글/멀티 태스킹
    • 싱글 : 한 번에 하나의 프로그램만 실행 가능함. 다수의 프로그램을 동시에 실행할 수 없음(ex. MS-DOS)
    • 멀티 : 한 번에 다수의 프로그램을 동시에 실행함.(WINDOWS, MAC 등)
  2. 실시간 운영체제
    • 특정 프로그램의 우선순위가 운영체제보다 높아야 할 때 쓰임.
    • 안전을 담보로 하는 프로그램을 사용할 때 주로 쓰임.
  3. 단일/다중 사용자
    • 단일 : 한 명의 사용자만 사용 가능 (ex. WINDOWS)
    • 다중 : 다수의 사용자가 사용 가능 (ex. 리눅스)
  4. 임베디드
    • HW에 내장해야 하는 OS
    • 특정 HW에 특정 임베디드 OS만 사용되어야 함 (ex. RTOS, 다마고찌?)
  5. 판형 운영체제
    • 하나의 운영체제를 여러 개로 쪼개어 다수의 사용자가 사용할 수 있게함.
    • 퀄리티는 떨어질 수가 있음.

2) 운영체제의 역할

  1. 프로세스 관리
    • 프로세스 : 사용중인 프로그램
    • 사용자가 설정한 우선순위대로 프로세스가 실행될 수 있도록 관리함
    • 다수의 프로세스가 동시에 원활히 동작할 수 있도록 관리함
  2. 인터럽트
    • 사전적 의미 : 멈추다
    • 다른 프로그램이 실행될 때, 현재 프로그램을 멈추고 다른 프로그램이 사용될 수 있도록 해줌. 현재 프로그램이 멈추기 위해 주는 명령이 인터럽트
    • 장치이상 등과 같은 내부요인으로 인터럽트 명령을 줄 수도 있음.
  3. 메모리 관리
    • 여러 프로그램이 실행될 때, 메모리가 충돌하지 않게 해줌.
    • 운영체제에 의해 특정 프로그램이 메모리 사용권한을 받아서 메모리를 사용함. 이를 통해 메모리 충돌을 방지할 수 있음.
  4. 파일 관리
    • 파일 역시 하나의 하드웨어에 존재하지만, 여러 프로그램이 특정 파일에 동시에 접근할 때 충돌을 방지함.
  5. 장치 드라이버
  6. 네트워킹
    • 랜카드와 소프트웨어의 연결을 도와줌.
  7. 보안
    • 방화벽과 같은 소프트웨어를 제공하여 최소한의 보안을 보장함.
    • 각 사용자가 방화벽이라는 도구를 통해 특정 포트를 열거나 닫을 수 있음.
  8. 입출력
    • ex. 키보드, 마우스, 모니터, 프린터 등
  9. CPU 모드 제공
    • 슈퍼바이저 모드 : 어떤 프로그램에 CPU에 대한 전체 권한을 부여함. (그래픽카드나 메모리 관리 등에 필요한 프로그램 대상)
    • 보호모드 : CPU에 대한 권한을 제한함. (public하게 제공되는 프로그램 대상)

b. 프로세스와 스레드

  1. 동시적 방식(Concurrency) : 하나의 프로세서가 다수의 프로세스 작업을 조금씩 나눠서 수행하여 동시에 동작하는 것처럼 보이게끔 하는 방식. 이때, 작업을 바꾸는 방식을 Context Switching이라고 함.
  2. 병렬적 방식(Parallelism) : 하나의 프로세서에 코어 여러 개가 달려서 각각 동시에 작업을 수행함. (ex. 듀얼코어, 쿼드코어 등) CPU의 발열 등 물리적 제약때문에 CPU의 순수속도를 못올리는 한계를 보완함.
  • 스레드 : 하나의 프로세스에서 수행되어야 하는 여러 작업들을 동시에 수행하기 위해 나온 기술
    - example : 프로세서(코어) : 요리사, 요리메뉴 : 프로세스, 세부 요리과정 : 스레드
  • 프로세스와 스레드의 차이


    - 다중 프로세스가 실행될 때, 프로세스가 점유하는 메모리영역이 모두 다르기 때문에 CPU가 힘들어 함.
    - 스레드는 프로세스 안에서 Code, Data, Heap 메모리 영역만 공유하고 stack영역만 따로 쓰는 방식이라서 효율적임. (stack영역도 같이 사용할 경우, 구조가 복잡해짐)

c. 메모리 구조

1) 코드 영역

  • 프로그램의 코드가 저장되는 영역(함수, 제어문, 상수 등이 지정됨)

2) 데이터 영역

  • 전역변수와 static 변수가 할당되는 영역
  • 프로그램이 종료되면 메모리 할당이 해제됨

3) 스택 영역

  • 함수 호출 시 생성되는 지역 변수와 매개변수가 저장되는 임시 메모리 영역

4) 힙 영역

  • 프로그래머가 직접 할당하고 헤제하는 메모리 공간(동적할당)(Java에서는 가비지 컬렉터가 관리)
  • 힙과 스택은 같은 공간을 공유하는 데, 힙은 메모리 위쪽 주소부터, 스택은 아래쪽부터 할당됨.
  • 스택영역이 커지면 힙영역이 작아지고, 힙영역이 커지면 스택영역이 작아짐
  • 침범하는 경우를 각각 힙 오버플로우, 스택 오버플로우라 칭함.

2. java 코드 실행 과정

  1. Java 코드는 JavaCompiler에 의해 바이트 코드로 컴파일 됨(.java > .class)
  2. 클래스 로더는 프로그램 실행에 필요한 .class파일을 로딩 및 링크하여 JVM 메모리에 전달함
    • 클래스 로딩 과정
    • 클래스 로딩 예시

      : 만약 A 클래스는 네트워크를 통해서 읽어오고, B라는 클래스는 Jar 파일을 통해서 읽어와야 한다면? 기존의 클래스 로딩 방식에서는 JarFileClassLoader와 NetworkClassLoader 간에 유기적인 결합을 할 수 없기 때문에 문제가 발생한다.
      문제를 해결하기 위해 딜리게이션 모델을 도입함. A 클래스가 필요하면, 가장 먼저 NetworkClassLoader에 클래스로딩을 요청한다. 그럼, NetworkClassLoader는 네트워크로부터 A 클래스를 로딩할 수 있으므로, A 클래스를 로딩한다. 그런 후, A 클래스는 B 클래스를 필요로 한다. B 클래스를 로딩하기 위해 NetworkClassLoader는 JarFileClassLoader에 클래스 로딩을 위임(delegation)한다. JarFileClassLoader는 Jar 파일로부터 B 클래스를 읽어온 후 NetworkClassLoader에게 리턴할 것이며, 따라서 NetworkClassLoader는 Jar 파일에 있는 B 클래스를 사용할 수 있게 된다.
  3. 로드된 .class파일은 실행엔진(Execution Enging)이 명령어 단위로 하나씩 가져와서 실행한다. JVM내부에서 실행 가능한 기계어로 변형된 후 실행되는데, 변형되는 과정은 2가지 방식을 사용하게 된다.
    • 인터프리터 방식 : 명령어 단위로 해석하며 수행함. 전체적인 수행속도가 느림.
    • JIT(Just-In-Time) 방식 : 모든 바이트 코드를 바이너리코드로 변경한 후 캐시에 저장하여 수행함. 전체적인 수행속도가 빠름. 컴파일 과정이 느리기 때문에 특정 메소드들에 대한 컴파일만 수행함.

3. JDK, JRE, JVM이란?

a. JDK(Java Development Kit)

  • java를 이용한 개발에 필요한 도구(javac, 디버그 도구, jheap, jconsole, etc.)들이 들어있음
  • JDK 종류 : Open JDK, Oracle JDK 등

b. JRE(Java Runtime Environment)

  • 런타임 환경이란? 프로그램 실행을 위해 클래스 파일을 로드하고 메모리 및 기타 시스템 리소스에 대한 액세스를 확보한다. 과거에는 운영체제를 런타임 환경으로 사용했다.
  • 자바 런타임 환경은 컴퓨터 운영체제 위에서 실행되면서 자바를 위한 부가적인 서비스를 제공하는 소프트웨어 계층이다. 다양한 운영체제의 요철을 매끄럽게 다듬어 자바 프로그램이 거의 모든 운영체제에서 수정 없이 실행될 수 있도록 한다. 자동 메모리 관리는 JRE의 가장 중요한 서비스 중 하나이다. JRE는 자바 프로그램을 위한 메타 운영체제이다. 추상화의 전형적인 사례로, 기반 운영체제를 자바 애플리케이션 실행을 위한 일관적인 플랫폼으로 추상화한다.
    - 추상화 : 여러 객체에 공통적으로 사용되어야 하는 내용을 뽑아내는 것(출처:https://jwkim96.tistory.com/90)
    - 메타 운영체제 : 응용 프로그램을 개발하기 위해 스케쥴링 및 로드, 감시, 에러 처리 등을 실행하는 시스템
  • JVM이 실행되기 위한 여러 라이브러리들을 갖고 있음. 자바 클래스 로더도 포함되어 있음.
  • 자바 클래스 로더는 올바르게 클래스를 메모리에 동적으로 로드해 코어 자바 클래스 라이브러리에 연결하는 역할을 함. JVM의 런타임 데이터 영역에 코드를 배치시킴.
  • JRE 사용 이유
    : JRE와 같은 지원 환경이 없으면 OS의 기능과 리소스(메모리 및 프로그램 파일)에 따른 제약을 받음. JRE는 java 프로그램과 OS 사이에서 일종의 변환기 및 조정자 역할을 함.
  • JRE 작동 방식
    : OS 기반으로 실행되며 Java에 고유한 추가 리소스?를 제공. 운영체제를 추상화. java애플리케이션을 실행하고 배포할 일관된 플랫폼을 생성. 클래스 로더는 클래스 라이브러리를 JVM에 연결하여 프로그램이 실행되는 동안 JVM으로 로드함.

c. JVM(Java Virtual Machine)

  • 참고 : https://asfirstalways.tistory.com/158
  • 가상머신이란? 프로그램을 실행하기 위해 물리적 머신과 유사한 머신을 소프트웨어로 구현한 것.
  • JVM의 역할
    - java 애플리케이션을 java API와 함께 실행함.(java API란? java 시스템을 제어하기 위해 java에서 제공하는 명령어)
    - 스택기반의 가상머신이고 Garbage collection을 통해 메모리관리를 수행함.
  • 실행 엔진(Execution Engine)
    : 바이트코드를 JVM 내부에서 두 가지 방식중 하나로 기계가 실행할 수 있는 형태로 변경한다.
    - Interpreter : 명령어 단위로 읽어서 실행한다. 느리다.
    - JIT 컴파일러 : 바이트 코드를 컴파일하여 네이티브 코드로 변경하고, 네이티브 코드를 직접 실행하는 방식. 캐시에 보관하기 때문에 빠르게 수행됨.
  • Garbage collector
    : 메모리관리를 수행하는 모듈(스레드)
  • Runtime Data Area
    : 프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간

    - PC Register : 스레드가 시작될 때 생성되는 공간으로 스레드마다 하나씩 존재함. 스레드가 어떤 부분을 어떤 명령으로 실행해야할 지에 대한 기록을 하는 부분으로서 JVM 명령의 주소를 가짐.
    - JVM stack : 메소드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장함. (각종 형태의 변수나 임시 데이터, 스레드나 메소드의 정보)
    - Native method stack : 기계어로 작성된 프로그램을 실행시키는 영역.
    - Method Area(=class area = Static area) : 프로그램의 흐름을 구성하는 메소드의 바이트 코드가 올라감. (올라가는 정보의 종류 : Field information, Method information, Type information) 힙과 마찬가지로 GC의 관리대상이 됨.
    - Heap : 객체를 저장하는 가상 메모리 공간. new 연산자로 생성된 객체와 배열을 저장함.

0개의 댓글