정적변수와 지역변수는 무엇이 다른가
지역변수
class Counter {
void count() {
int num = 0; // 초기화 필수
num++;
System.out.println(num); // 1 출력
} // ← num은 여기서 사라진다.
}
public class Main {
public static void main(String[] args) {
Counter c = new Counter();
c.count(); // 1 출력
c.count(); // 1 출력 (새로운 num)
c.count(); // 1 출력 (여전히 새로운 num)
}
}
num이 새로 만들어진다.정적변수
class Counter {
static int num = 0; // 프로그램 시작 시 한 번만 초기화
void count() {
num++;
System.out.println(num);
} // num은 메서드가 끝나도 사라지지 않는다.
}
public class Main {
public static void main(String[] args) {
Counter c = new Counter();
c.count(); // 1 출력
c.count(); // 2 출력 (이전값 기억함)
c.count(); // 3 출력 (계속 기억함)
}
}
static int num은 처음 한 번만 만들어지고, 이후로는 그 값을 계속 기억한다.JVM 메모리 구조
메서드 영역 (Method Area)
힙 (Heap)
스택 (Stack)
class MyClass {
static int global = 10; // 메서드 영역 (= C의 데이터 영역)
public static void main(String[] args) {
int local = 5; // 스택 (지역변수)
Integer obj = new Integer(20); // obj는 참조 변수라 스택, 객체는 힙영역
}
}
64비트 컴퓨터 기준으로 최대 256테라바이트까지 사용할 수 있다?
책 내용을 보니깐 64비트 컴퓨터 기준으로 최대 256테라바이트까지 사용 가능하다고,
나와 있는데 여기서 생긴 의문점이 실제 물리 메모리가 256테라바이트가 안되는데
어떻게 가능하다는 것인지 궁금하여 찾아보게 되었다.
일단 이론적으로 사용할 수 있는 주소의 범위가 256TB 라는 것이고,
(가상의 주소 공간)
실제로는 물리 메모리(RAM)와 디스크(Swap)의 공간에는 한계가 있기에
실제로는 RAM(16GB) + Swap(약 2TB) 정도만 사용 가능하다는 뜻이다.
이런식으로 설계한 이유는 운영체제가 가상 메모리 시스템을 사용하기 때문이다.
프로그래머는 256TB의 주소공간이 있다고 생각하고,
프로그램을 만들면 되고, 실제로 메모리가 부족해지면 운영체제가
알아서 자동으로 디스크(Swap)를 메모리처럼 사용하여 처리해준다.
따라서 프로그래머는 메모리 크기를 깊게 고민할 필요 없이
필요한 만큼 할당하면 운영체제가 알아서 관리해주는 식이다.
프로그래머의 입장: "256TB 주소공간 있으니 마음껏 사용해 봐야지"
운영체제의 입장: "일단 가상 주소는 할당해줄게
실제 메모리는 RAM + Swap으로 관리할게"
실제 동작
힙 영역의 주소 증가, 스택영역의 주소 감소
힙 (Heap)
스택 (Stack)
다중 스레드 vs 다중 프로세스 + IPC
다중 스레드(Multi-Thread)
같은 프로세스 내의 모든 스레드는 같은 메모리 공간(코드, 데이터, 힙) 공유
스레드 A와 스레드 B가 같은 변수에 접근 가능
운영체제가 격리하지 않음
스레드 생성 비용: 낮음 (수 마이크로초 ~ 수백 마이크로초)
다중 프로세스
각 프로세스는 독립적인 메모리 공간을 가진다.
프로세스 A의 메모리 공간 ≠ 프로세스 B의 메모리 공간
운영체제가 완전히 격리
프로세스 생성 비용: 높음 (수 ms ~ 수십 ms)
왜 이 차이가 생기는가?
IPC가 왜 필요한가?
기본 상황: 프로세스는 격리되어 있다.
프로세스 A 프로세스 B
┌──────────────┐ ┌──────────────┐
│ 메모리 공간 │ │ 메모리 공간 │
│ data = "hi" │ 격리됨 │ data = ??? │
└──────────────┘ └──────────────┘
문제: 프로세스 A의 "hi"를 프로세스 B가 못 받음
해결책: IPC 필요
IPC 없으면 어떻게 되나?
// 프로세스 A
class ProcessA {
public static void main(String[] args) {
String message = "안녕하세요";
// 프로세스 B에 이 메시지를 보낼 방법이 없다.
}
}
// 프로세스 B
class ProcessB {
public static void main(String[] args) {
// 프로세스 A의 메시지를 받을 방법이 없다.
}
}
IPC의 4가지(+ 파일) 방식
방식 0: 파일 (부수적인 추가사항)
// 프로세스 A: 파일에 메시지 쓰기
class ProcessA {
public static void main(String[] args) throws IOException {
String message = "프로세스 B에게 전달";
Files.write(
Paths.get("shared_message.txt"),
message.getBytes()
);
System.out.println("메시지 저장됨");
}
}
// 프로세스 B: 파일에서 메시지 읽기
class ProcessB {
public static void main(String[] args) throws IOException {
Thread.sleep(1000); // A가 쓸 때까지 대기
String message = new String(
Files.readAllBytes(Paths.get("shared_message.txt"))
);
System.out.println("받은 메시지: " + message);
}
}
방식 1: 공유 메모리
일반적으로 운영체제는 프로세스 간의 독립성을 보장하기 위해
각 프로세스에게 독립적인 가상 메모리 공간을 할당한다.
즉, 프로세스 A는 프로세스 B의 메모리를 절대 볼 수 없다.
(이를 메모리 보호라고 합니다.)
공유 메모리는 이 "담장"의 일부분을 허무는 기술이다.
메커니즘: OS 커널이 물리 메모리(RAM)의 특정 영역을 할당한다.
매핑: 프로세스 A와 프로세스 B가 각자의 가상 주소 공간을
이 동일한 물리 메모리 영역에 연결한다.
결과: 프로세스 A가 특정 주소에 값을 쓰면,
프로세스 B는 자신의 주소 공간에서 그 값을 즉시 읽을 수 있다.
방식 2: 파이프 (Pipe) - 단방향 통신
상황 2: 영화관 매표소
┌─────────────┐ 표 넘김 ┌──────────┐
│ 관객 │ ────→ │ 관객 │
│ (표 받으러) │ (표 제출) │ (표 받음)│
└─────────────┘ └──────────┘
관객은 표를 넘길 수만 있음
스태프는 표를 건네줄 수만 있음
방식 3: 소켓 (Socket) - 네트워크 통신
프로세스 A 프로세스 B
(전화 받는 사람) (전화 거는 사람)
↓ ↓
[전화기 대기] [전화 걸기]
↑ ← ← ← ← ← ← ← 신호 ← ← ← ← ← ↑
↓ ↓
[통화 중 (양방향)] [통화 중 (양방향)]
↑ ↔ ↔ ↔ ↔ ↔ ↔ 음성 신호 ↔ ↔ ↔ ↑
통신 과정
1단계: 대기
프로세스 A가 "5000번 포트"에서 기다림
2단계: 연결 신청
프로세스 B가 "프로세스 A에 연결해달라"고 요청
3단계: 연결 수락
프로세스 A가 "좋아, 연결됨"
4단계: 자유로운 대화
서로 원하는 대로 주고받음
5단계: 연결 끊기
누가 끊으면 끝
방식 4: 메시지 큐 (Message Queue) - 비동기 통신
프로세스 A 메시지 큐 프로세스 B
(메시지 발송) (중간 저장소) (메시지 처리)
메시지 넣음 → [msg1]
메시지 넣음 → [msg2] → 메시지 꺼냄
메시지 넣음 → [msg3] → 메시지 꺼냄
(떠남) [msg4] → (나중에) 메시지 꺼냄
왜 "비동기"인가?
동기 (소켓 - 전화)
A: "안녕?"
B: (전화 받을 때까지 기다림)
B: "응, 뭐해?"
A: (대답할 때까지 기다림)
→ 둘이 동시에 움직여야 함
비동기 (메시지 큐 - 우편함)
A: 편지 쓰고 우편함에 넣음
A: (기다리지 않고 다른 일 함)
B: (나중에 와서 편지 꺼냄)
→ 시간차 있어도 괜찮음
메시지 큐가 왜 필요한가?
상황 1: 소켓(전화)의 문제점
상황 2: 메시지 큐의 해결책
장점과 단점
장점
단점