⚡주소를 통해 접근하는 매체
논리적 주소 (가상주소)
: 프로그램이 실행되면 독자적인 주소공간 생성!
: CPU가 바라보는 주소
물리적 주소
: 실제 메모리의 주소
📍 주소 바인딩(결정)
: 프로그램 메모리를 물리적인 메모리의 어느 위치로 올릴지 결정하는 것
: symbolic address -> logical address -> physical address 순으로 올라감
📍 주소 변환
: 바인딩 과정에서 결정된 위치로 메모리를 올리는 과정
💡 주소 바인딩과 변환은 다르다!
바인딩은 위치를 결정하는것, 변환은 메모리를 올리는 행위 그 자체!
👉 바인딩을 (어디에) 했다/ 변환을 했다!
symbolic address
: 프로그래머가 쉽게 기억하고 사용할 수 있는 메모리 위치에 대한 이름
: 실제 메모리 주소 X, 소스 코드에서 사용되는 레이블!
ex) START
logical address
: OS가 메모리 위치를 나타내는 가상 주소
: CPU에 의해 생성 👉 메모리 관리 장치 (MMU)에 의해 물리 주소로 변환
ex) 0x1000
physical address
: RAM의 메모리 위치의 실제 주소
: 물리 메모리의 메모리 셀을 고유하게 식별
ex) 0x401000
그럼 이 결정이 어떻게 이루어질까?
주소 바인딩을 자세히 살펴보도록 하자!
우선, 전체적인 순서도는 다음과 같다.
Compile time binding
: 컴파일시에 주소 결정(절대위치 부여)
: 컴파일 주소를 변경하고싶다면, 새로 컴파일이 이루어져야 함
: 현대 컴퓨터에는 사용되지 않음(비효율적)
Load time binding
: 프로그램 실행이 시작될 때 결정
Run time binding(Execution time binding)
: load time과 마찬가지로 실행이 시작될 때 결정
: 다만 프로그램 실행 중간에 주소 변환 가능
: 하드웨어적인 지원 필요
주소를 변환해주는 하드웨어
Relocation register (base register)
: 접근할 수 있는 물리적 메모리 주소의 최소값
Limit register
: 논리적 주소의 범위
메모리 관련 용어 4가지를 배웠다!
프로세스 전체를 메모리에 미리 다 올려놓지 않고 해당 루틴이 불려질(필요할) 때 메모리에 load한다.
👉 가끔씩 사용되는 많은 양의 코드가 있는 경우 유용
👉 쓸 것만 불러와 매우 효율적!
os 라이브러리를 사용해 프로그래머가 직접 구현
📍 backing store(swap area)
: 쫓겨난 프로세스를 저장하는 공간
: 많은 사용자의 프로세스 이미지를 담을 만큼 충분히 빠르고 큰 저장공간 보유
상태
(1) 쫓겨남: swap-out
(2) 다시 들어옴: swap-in
compile time, load time binding에서는 원래 메모리 위치로 swap-in
run time binding에서는 빈 메모리 영역 아무곳에나 올릴 수 있음
📍 linking: 여러 곳에 존재하는 컴파일된 파일들을 한데묶어 실행파일로 만드는 작업
동적 링킹의 유연성이 더 높다!
⚡ 메모리는 OS 상주 영역(낮은 주소 영역)과 사용자 프로세스 영역(높은 주소 영역)으로 나뉘어 사용
프로그램이 메모리에 올라갈 때 통채로 올라감(지금까지 소개된 방식)
📍 연속적 할당 방식은 또 두 가지로 나뉜다.
📍 분할 과정에서 발생할 수 있는 문제는 다음과 같다.
: 프로그램을 구성하는 주소 공간을 쪼개 하나의 프로세스가 분산되어 올라감
📍 이 할당 또한 세 가지의 방식으로 나뉜다. 다음 시간에 더 자세히! 오늘은 간단하게~