여러 프로그램을 동시에 메모리에 올리기 위해 만들어진 개념
(옛날 방식처럼 프로세스 전환때 마다 프로그램의 현재상태를 디스크에 저장하는 것은 너무 비효율적)
한 프로세스가 다른 프로세스의 메모리를 읽거나 악용하는 상황을 방지하기 위해 만든 사용하기 쉬운 메모리 영역, protection이 중요한 문제
아래 그림과 같이 힙과 스택영역으로 구분됨
힙과 스택을 주소공간의 양 끝단에 배치해야 두 영역 모두 확장 가능
아래예시는 관례일뿐 다른방식으로도 배치 가능,
여러 쓰레드가 공존 시 아래 예시의 주소공간은 동작하지 않음
동적 할당되는 메모리를 저장
모든 할당과 반환이 프로그래머에 의해 명시적으로 처리됨
스택 메모리 반환 여부에 관계없이 오랫동안 값을 써야되는 경우 사용
realloc()은 더 큰 새로운 영역을 확보하고 옛 영역의 내용을 복사한 후 새영역에 대한 포인터를 반환
함수 호출 체인 상의 현재 위치, 지역 변수, 함수 인자와 반환 값등을 저장
할당과 반환은 컴파일러에 의해 암묵적으로 이뤄짐, 때문에 자동(automatic) 메모리 라고도 불림
메모리 할당 잊어버리기
대부분의 루틴은 자신이 호출되기 전 메모리가 미리 할당되었다고 가정함,
할당되지 않은 메모리를 인자로 넘겨주면 문제가 발생하기 마련
메모리를 부족하게 할당
할당받은 영역을 벗어난 메모리에 값을 쓰게될 수 있음, 이러한 오버플로우는 보안취약점의 원인이 됨
프로그램이 올바르게 실행될 수도 있고 아닐수도 있음.
메모리 누수
장시간 실행되는 응용프로그램이나 시스템 프로그램에서 큰 문제를 방생시킴,
사용이 끝난 메모리가 반환되지않아 결국 메모리가 부족해지며 시스템을 재시작 할 수 밖에 없음
garbage collection 기능이 있는 언어도 메모리 청크에 대한 참조가 계속 존재하면 메모리 할당이 해제 되지 않으므로 메모리 누수가 문제가 됨
메모리 사용이 끝나기 전에 메모리 해제
메모리 사용이 끝나기 전에 메모리를 해제하는것을 dangling pointer라고 하며 프로그램 크래시나 유효 메모리 영역을 덮어쓸 수 있음
purify, valgrind
실제 메모리를 운영체제에서 주소 공간으로 분리해 프로세스에 분배하는 것
사용자 프로그램에서 볼 수 있는 주소는 모두 가상주소,
실제 프로세스의 물리 메모리 주소를 알 수 있는것은 운영체제 뿐
운영체제는 하드웨어의 도움을 받아 가상메모리를 물리 주소로 변환
실행중인 프로그램이 가상 메모리의 존재를 인지하지 못하도록 가상메모리 시스템을 구현
시간/공간 측면에서 효율적으로 구현
시간 효율적인 가상화 구현시 운영체제는 하드웨어의 지원(TLB등)을 받아서 구현
프로세스는 자신의 주소공간 밖의 어느것도 접근 불가능 하도록 서로 격리해야함
(다른 프로세스나 운옃제제의 메모리에 접근 X)
서로 적절히 잘 분리된 개체는, 한 개체가 실패하더라도 다른 개체에게 아무 영향을 주지 않음을 암시함
신뢰할 수 있는 시스템을 구축하는데 중요한 원칙