
프로세스는 컴퓨터에서 실행되고 있는 프로그램을 의미하며 CPU 스케줄링의 대상이 되는 작업(task)이라는 용어와 거의 같은 의미로 쓰인다.
프로그램 자체는 디스크에 저장된 실행 파일이지만 이 프로그램이 메모리에 로드되어서 실제로 실행되는 순간부터 프로세스라고 부른다.
프로그램이 실행되어 메모리에 올라가면 프로세스가 인스턴스화되며, 운영체제의 CPU스케줄러가 이 프로세스를 관리하고 CPU를 할당하여 실행한다.

프로세스가 실행되려면 먼저 메모리에 로드되어야 한다. 운영체제는 프로그램 실행을 위해 여러 메모리 공간을 제공하고, 각 공간은 프로그램이 제대로 동작하도록 도와준다.
메모리 공간은 크게 코드(Code), 데이터(Data), 힙(Heap), 스택(Stack) 이렇게 4가지로 나뉜다.

💡
Q. Java에서 static으로 선언된 변수는 프로세스 메모리 구조에서 데이터 영역에 저장된다고 하는데, 만약 static ArrayList를 선언했다면, 이 ArrayList는 메모리의 어느 영역에 저장되나요?
A. Java에서 static 변수는 데이터 영역에 저장되지만, ArrayList는 참조 타입 객체이므로, 두 가지 다른 메모리 영역에 걸쳐 저장됩니다.
static 참조 변수 (ArrayList 자체의 참조)는 데이터 영역에 저장됩니다. 모든 static 변수와 마찬가지로, 이는 프로그램 시작 시 메모리에 할당되고, 프로그램 종료 시까지 유지됩니다.
ArrayList 객체와 그 내부에 저장된 실제 데이터들은 힙(Heap) 영역에 저장됩니다. Java에서는 모든 객체가 동적으로 할당되고, 힙 메모리에 위치하기 때문입니다.
💡
Q. reference(참조변수)는 어떻게 크기가 결정되나요?
A. 참조변수는 C언어에서의 포인터처럼 객체의 주소를 가리키는 역할을 합니다. 참조변수 자체는 메모리 내 객체의 위치 주소를 저장합니다.
참조변수의 크기는 JVM이 실행되는 플랫폼의 아키텍쳐에 따라 결정됩니다.
32비트 시스템에서는 4Bytes(32Bits) , 64비트 시스템에서는 8Bytes(64Bits)의 크기를 가집니다.
💡
Q. 프로세스들은 독립적인 메모리 공간을 가진다고 하는데 서로 데이터를 공유할 순 없나요?
A. 공유할 수 있습니다. 기본적으로 프로세스는 독립적인 메모리 공간을 가지며, 서로의 메모리를 직접적으로 공유하지 않습니다. 하지만 프로세스 간 데이터를 주고받는 방법인 프로세스 간 통신(IPC: Inter-Process Communication)을 사용하여 데이터를 공유할 수 있습니다.
1. 공유메모리 (Shared Memory) ex. 복사-붙여넣기 (Clipboard)
2. 파이프 (Pipe)
3. 메시지 큐 (Message Queue)
4. 소켓 (Socket)
5. 파일 시스템 (File System)