전공/운영체제
13. The Abstraction: Address Space
nongdamgom
2024. 1. 4. 19:19
Memory virtualization ?
- OS가 process에게 메모리 독점의 환상을 줌
- 한 process가 physical memory 전체를 사용한다는 느낌을 주는 것
- 모든 procss는 같은 구조의 address space를 가짐
OS in the Early System
- poor utilization and efficiency
- 예전에는 한 프로세스가 피지컬 메모리를 사용하면, 다 끝날 때까지 다른 프로세스가 사용 x
Multiprogramming and Time Sharing
- memory에 multiple process를 load
- memory 내에서 부분 부분을 각 process가 switch 하며 사용
- 위 보다 utilization과 efficiency가 상승
- protection issue 발생
- 메모리 공간에 바운더리(장벽)이 없어서, 한 프로세스가 다른 프로세스의 메모리의 주소를 안다면, 다른 프로세서의 메모리를 읽거나 쓸 수 있게 됨 => 문제 발생
Address Space
- 위 문제를 해결하고자 도입한 개념
- phsical memory를 virtualization 할 수 있는 방법
- address space는 code, data, heap, stack 을 포함, process의 거의 모든 것을 담고 있음
- 각 process마다 address space가 존재하고, process들은 phsical memory를 볼 수 없고 address space만 볼 수 있음
- 위에선 process마다 사용하는 physical memory 주소가 달랐는데, address space는 각 process마다 고유의 가상화 된 메모리 주소를 가지고 있고, 각 프로세스의 시작 addr와 끝 addr이 모두 같기 때문에 protection 문제가 발생하지 않는다.
- code => instruction
- heap => malloc, new.. , dynamically allocate memory
- stack => local, 함수가 recursive하게 중첩 되거나, 많이 불리면 stack크기가 커짐
Virtual address
- process가 보는 모든 address는 다 virtual address라고 보면 됨
- OS가 virtual memory address를 physical address로 바꿔 줌
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
// 주소에만 관심 있으므로 (void *)로 형변환
printf("location of code : %p\n", (void * ) main); // main의 함수 포인터
/*main 함수가 존재하는 시작 주소와 근사하게 찍힘 */
printf("location of heap : %p\n", (void * ) malloc(1));
/* heap을 1 정도로만 할당 후 찍으면, heap의 시작 주소와 근사하게 찍힌다 */
int x = 3;
printf("location of stack : %p\n", (void * ) &x);
/* 거의 첫 local var의 주소를 찍으면, stack의 시작주소와 근사하게 찍힘 */
return x;
}