'jvm'에 해당되는 글 1건

프로그램을 작성해 컴파일하고 링크하면 실행 가능한 파일이 생성된다.
쉘을 통해 사용자가 프로그램을 수행시키면, 커널은 이 프로그램을
제어에 적합한 자료구조로 만들어 메모리로 읽어낸 후, 커널의
프로세스 테이블에 등록하고, 메모리, 파일, 입출력 장치 같은
자원을 할당하는데, 이때부터 프로그램은 커널의 한
프로세스로서 실행 상태가 된다.

아래 그림에서 위쪽이 낮은 주소 번지가 된다.
그림에서 보이는 네 개의 범위(텍스트, 데이터, 힙, 스택)을 각각
세크먼트라고 한다.

운영체제는 프로그램의 텍스트 부분에 메모리를 읽기 전용으로만
사용하고, 프로세스간에는 메모리 영역을 침범하지 못하도록 한다.
따라서, 프로그램의 텍스트로 되어 있는 메모리 영역을 침범해 기록하면
버스 에러나 세그먼트 결함이 일어나서 프로그램이 종료된다.

사용자 삽입 이미지

1. 텍스트
   - 프로그램의 실행 코드인 기계어 코드와 읽기 전용 데이터 등을 가진다.
     (CPU가 읽어들여 수행한다고 해서 텍스트라고 부르며, 코드 영역이라고 한다.)
   - 프로그래머가 작성한 소스를 컴파일 후 링크 과정을 거쳐서 만들어진 프로그램의 기계어 코드.
   - 디버깅과 같은 제한된 환경에서 크기의 변경이 가능

2. 데이터
   - C 언어에서 전역변수, 정적변수, 초기화된 배열과 구조 등으로 선언된 변수 영역 (읽기 / 쓰기 가능)
   - 프로그램이 실행될 때 생성되고 프로그램이 종료될 때 시스템에 반환
   - malloc 계열의 시스템콜을 이용해서 확장하는 것이 가능

3. 힙
   - 프로그램 수행 중 malloc(), free() 등의 시스템 콜로 할당되고, 해지되는 메모리 영역

4. 스택
   - C 언어의 함수 호출 시 지역 변수와 인수, 함수의 수행이 끝났을 때 리턴할 주소(return address)를 푸시한다.
     (함수가 끝나면 이 값을 팝하고 리턴하게 된다.)
   - 자동 변수 (auto variable) 저장
   - 함수로 인수를 보내기
      ( 함수로 인수를 보낼 때는 인수를 역순으로 보낸 뒤 복귀 번지를 저장.)
   - 복귀 번지(return address) 저장의 용도로 사용
   - 스택 프레임 단위로 적재
     ( 함수 역시 호출 시에 스택 영역에 생성되고 사용된 후 시스템에 사용영역이 반환)
   - 프로세스의 실행과 함께 커널에 의해서 스택 세그먼트가 자동으로 확장

※ - 텍스트(코드), 데이터, 힙 영역은 하위 메모리로부터 할당되며, 스택 영역은 상위 메모리로부터 할당
    - 데이터와 스택 세그먼트는 읽기, 쓰기가 모두 가능한 영역
       - 단, 차이점은 데이터 세그먼트는 초기화된 데이터와 그렇지 않은 데이터가 함께 존재
         스택 세그먼트는 실행시간에 초기화된 값들을 보관
  

참고로, 자바의 메모리 모델은 메소드 영역과 스택, 힙으로 나뉜다.
데이터 영역과 텍스트(코드) 영역이 메소드 영역 하나로 관리가 된다.

사용자 삽입 이미지


블로그 이미지

쩐의시대

나답게 살아가고 나답게 살아가자

,