프로그램(Program)과 프로세스(Process)의 차이
- 프로그램이란?
- 프로그램이란 어떤 작업을 위해 실행할 수 있는 파일을 뜻한다.
- 프로세스란?
- 프로세스란 운영체제 입장에서 하나의 작업 단위이며, 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말한다.
프로그램은 일반적으로 하드 디스크 등의 보조기억장치에 저장된 실행 코드를 뜻하고, 프로세스는 프로그램을 구동하여 프로그램 자체와 프로그램의 상태가 메모리 상에서 실행되는 작업 단위를 지칭한다.
즉, 실행 중인 프로그램을 뜻한다.
예를 들어, 하나의 프로그램을 여러 번 구동하면 여러 개의 프로세스가 메모리 상에서 실행되는 것이다.
시분할 방식
- 하나의 cpu(프로세서)는 한 순간에 하나의 프로세스만 실행할 수 있다.
- 그럼에도 여러 프로세스를 동시에 실행시킬 수 있는 것은 cpu가 처리하는 시간을 잘게 쪼개 여러 프로세스에 배분하는 방식으로 동작하기 때문이다.
프로세스의 일반적인 구조
- 프로세스의 일반적 구성
- 프로세스는 다음과 같이 4가지 영역으로 나눌 수 있다.
- stack : 임시 데이터(함수 호출, 로컬 변수 등)이 저장되는 영역
- heap : 코드에서 동적으로 생성되는 데이터가 저장되는 영역
- data : 전역 변수/초기화된 데이터가 저장되는 영역
- text(code) : 컴파일된 소스 코드가 저장되는 영역
Stack 영역
- 프로그램이 자동으로 사용하는 메모리 영역으로 함수 호출과 관계되는 지역변수와 매개변수가 저장된다.
- 함수 호출 시 생성되며, 함수가 끝나면 반환된다.
- stack 사이즈는 각 프로세스마다 할당되지만 프로세스가 메모리에 로드될 때 stack 사이즈가 고정되어 있어 런타임 시 stack 사이즈를 바꿀 수 없다.
- 명령 실행 시 자동으로 증가 또는 감소하기 때문에 보통 메모리의 마지막 번지를 지정한다.
Data 영역(BSS, GVAR)
- 필요에 의해 메모리를 동적으로 할당할 때 사용하는 메모리 영역으로 동적 메모리 영역이라고 부른다.
- C 에서 malloc() calloc() 등의 함수를 사용하여 메모리 크기를 할당할 수 있으며, 메모리 주소 값에 의해서만 참조되고 사용되는 영역이다.
- 위의 stack과 heap영역은 사실 같은 공간을 공유한다.
- heap이 메모리의 낮은 주소부터 할당되면 stack은 높은 주소부터 할당되는 식이다.
- 그래서 각 영역이 상대 공간을 침범하는 일이 발생할 수 있는데 이를 각각 stack overflow, heap overflow 라고 한다.
Text(Code) 영역
- 텍스트 영역은 실행 명령을 포함하는 코드들이 들어가는 부분이다.
- 프로그램을 시작 할 때 컴파일한 프로그램(기계어)이 저장되어 있고, 읽기 전용 영역이기에 프로세스가 함부로 변경 할 수 없고 변경 시 오류를 발생시킨다.
- 코드 자체를 구성하는 메모리 영역으로 Hex 파일이나 Bin 파일 메모리이다.
- 프로그램 명령이 위치하는 곳으로 기계어로 제어되는 메모리 영역이다.
자바의 메모리 구조
왜? 프로그램의 메모리를 고려해야할까?
여기, 같은 기능을 하는 두 개의 프로그램이 있다고 가정해보자
- 메모리 설계가 잘 되어 있는 프로그램
- 그렇지 않은 프로그램
1번 프로그램에 비해 2번 프로그램에서는 속도 저하 현상이나 튕김 현상이 일어날 확률이 크다.
보다 안정적인 프로그램을 개발하려면 메모리 구조를 이해하고 적절하게 사용할 수 있어야 할 것이다.
자바의 프로그램 실행 구조
JVM 의 전체적인 구조
- Source Code (.java) 파일을 Java Compiler를 통해서 Byte Code(.Class)파일로 변환한다. (컴퓨터가 이해할 수 있는 코드로 변환)
- Byte Code로 변환된 파일을 JVM의 Class Loader 로 보낸다.
- Class Loader는 말 그대로 Class 파일을 불러와서 메모리에 저장하는 역할을 한다.
- Execution Engine 은 Class Loader에 저장된 Byte Code를 명령어 단위로 분류하여 하나씩 실행하게 하는 엔진이다.
- Garbage Collector 는 사용하지 않거나 필요없는 객체들을 메모리에서 소멸시키는 역할을 한다.
- Runtime Data Area (Memory Area) 는 JVM이 프로그램을 수행하기위해 운영체제로부터 할당받은 메모리 공간이다.
그렇다면 한 단계 더 들어가서 Runtime Data Area 는 어떻게 생겼을까?
Memory Area 의 구조
차례대로 살펴 보자.
1. Method Area
- JVM이 실행되면서 생기는 공간이다.
- Class 정보, 전역변수 정보, Static 변수 정보가 저장되는 공간이다.
- Runtime Constant Pool 에는 말 그대로 '상수' 정보가 저장되는 공간이다.
- 모든 스레드에서 정보가 공유된다.
2. Heap
- new 연산자로 생성된 객체, Array와 같은 동적으로 생성된 데이터가 저장되는 공간
- Heap에 저장된 데이터는 Garbage Collector 가 처리하지 않는한 소멸되지 않는다.
- Reference Type 의 데이터가 저장되는 공간
- 모든 스레드에서 정보가 공유된다.
3. Stack
- 지역변수, 메소드의 매개변수와 같이 잠시 사용되고 필요가 없어지는 데이터가 저장되는 공간
- Last In First Out, 나중에 들어온 데이터가 먼저 나간다
- 만약, 지역변수 이지만 Reference Type일 경우에는 Heap 에 저장된 데이터의 주소값을 Stack 에 저장해서 사용하게 된다.
- 스레드마다 하나씩 존재한다.
4. PC Register
- 스레드가 생성되면서 생기는 공간
- 스레드가 어느 명령어를 처리하고 있는지 그 주소를 등록한다.
- JVM이 실행하고 있는 현재 위치를 저장하는 역할
5. Native Method Stack
- Java 가 아닌 다른 언어 (C, C++) 로 구성된 메소드를 실행이 필요할 때 사용되는 공간
참고한 자료
'Programming > Java' 카테고리의 다른 글
[Programmers] 크레인 인형뽑기 게임 문제 (0) | 2022.01.20 |
---|---|
[Java] next(), nextLine()의 차이 (0) | 2022.01.17 |
[Java] 알고리즘을 위한 자바 IO (0) | 2022.01.16 |
댓글