주소 공간 (Address Space)
- 프로세스에서 잠조할 수있는 주소들의 범위
- 프로세스와의 1:1 관계
- User Thread는 주소 공간을 공유함
주소 공간의 크기
- CPU의 주소버스 크기에 의존 (최대 크기)
- 주소 버스가 32Bit인 System에서 주소 공간의크기
- 2^32 의 서로 다른 주소 식별자 생성가능
- 0 ~ (2^32 -1) 까지 주소 범위 표현 가능
- 메모리 용량 → 2^32 byte = 4GB
- 2^10 → K , 2^20 → M, 2^30 → G
물리 주소와 가상주소
- 물리주소
- 컴퓨터의 메인 메모리를 접근할 때 사용되는 주소
- 기억 장치의 주소 레지스터에 적재되는 주소
- 시스템의 주소 버스 크기에 의해 물리 주소 공간의 범위가 결정
- 가상주소
- 프로세스 관점에서 사용하는 주소
- 가상 주소는 논리적이므로, 물리 메모리의 제약 없이 더 큰 주소 공간을 사용
- CPU 관점의 주소는 물리 주소도, 가상 주소도 될 수 있다.
- 프로세스는 실제 어느 물리주소에 매핑될지 모른다.
- 프로세스간 메모리가 겹치면 안되니깐 자신만 쓴다고 생각하고 진행
- 실제로 물리 주소에 매핑해주는 것은 OS가 할 일이다.
초창기 컴퓨터의 주소 관리
- OS가 메모리 매핑을 해주지 않았을 때
- 물리 주소를 Compile Time에 생성
- 컴파일러는 프로그램이 실행될 물리 메모리 주소를 알고 있어야 했습니다.
- 코드가 작성될 때 메모리의 시작 주소와 크기를 지정한 후 컴파일을 수행.
- 동일한 binary 파일을 다양한 환경에서 실행하기 어렵다.
- 다양한 프로그램이 실행됨에 따라서 물리 주소를 정하기 어려워짐
- 멀티프로그래밍(Multiprogramming) 환경에서는 문제
- Compile Time에 결정된 물리 주소는 다른 프로그램과 겹칠 가능성이 있음.
- 프로그램의 실행 순서나 메모리 할당 상태에 따라 물리 메모리를 재조정해야 함.
다양한 시점에서의 가상 주소 생성

- Compile Time 에 주소 결정
- 컴파일러가 Symbol Table을 생성
- Symbol Table은 프로그램 내 변수, 함수 등의 이름과 위치 정보를 저장
- Relocatable Object 파일 생성
- 컴파일된 Object 파일(.o 파일)은 주소 0부터 시작
- Link Time 에 주소 결정
- Linker가 여러 Object 파일(.o 파일)과 시스템에서 제공하는 라이브러리(.lib 또는 .dll)를 결합
- 전체 Symbol Table을 보고 하나의 Symbol Table로 연결
- Executable 파일(.exe) 생성
- 생성된 실행 파일은 가상 주소 공간의 0번지부터 시작