[OSTEP] Address Spaces

Soeng_dev·2022년 4월 3일
0

Address Spaces

여러 프로그램을 동시에 메모리에 올리기 위해 만들어진 개념
(옛날 방식처럼 프로세스 전환때 마다 프로그램의 현재상태를 디스크에 저장하는 것은 너무 비효율적)

한 프로세스가 다른 프로세스의 메모리를 읽거나 악용하는 상황을 방지하기 위해 만든 사용하기 쉬운 메모리 영역, protection이 중요한 문제

• 구조

아래 그림과 같이 힙과 스택영역으로 구분됨
힙과 스택을 주소공간의 양 끝단에 배치해야 두 영역 모두 확장 가능

아래예시는 관례일뿐 다른방식으로도 배치 가능,
여러 쓰레드가 공존 시 아래 예시의 주소공간은 동작하지 않음

» 힙

동적 할당되는 메모리를 저장
모든 할당과 반환이 프로그래머에 의해 명시적으로 처리됨

스택 메모리 반환 여부에 관계없이 오랫동안 값을 써야되는 경우 사용

realloc

realloc()은 더 큰 새로운 영역을 확보하고 옛 영역의 내용을 복사한 후 새영역에 대한 포인터를 반환

» 스택

함수 호출 체인 상의 현재 위치, 지역 변수, 함수 인자와 반환 값등을 저장

할당과 반환은 컴파일러에 의해 암묵적으로 이뤄짐, 때문에 자동(automatic) 메모리 라고도 불림

» 흔한 메모리 문제

메모리 할당 잊어버리기
대부분의 루틴은 자신이 호출되기 전 메모리가 미리 할당되었다고 가정함,
할당되지 않은 메모리를 인자로 넘겨주면 문제가 발생하기 마련

메모리를 부족하게 할당
할당받은 영역을 벗어난 메모리에 값을 쓰게될 수 있음, 이러한 오버플로우는 보안취약점의 원인이 됨
프로그램이 올바르게 실행될 수도 있고 아닐수도 있음.

메모리 누수
장시간 실행되는 응용프로그램이나 시스템 프로그램에서 큰 문제를 방생시킴,
사용이 끝난 메모리가 반환되지않아 결국 메모리가 부족해지며 시스템을 재시작 할 수 밖에 없음

garbage collection 기능이 있는 언어도 메모리 청크에 대한 참조가 계속 존재하면 메모리 할당이 해제 되지 않으므로 메모리 누수가 문제가 됨

메모리 사용이 끝나기 전에 메모리 해제
메모리 사용이 끝나기 전에 메모리를 해제하는것을 dangling pointer라고 하며 프로그램 크래시나 유효 메모리 영역을 덮어쓸 수 있음

메모리 관련 오류 디버깅 툴

purify, valgrind

Virtualizing memory(메모리 가상화)

실제 메모리를 운영체제에서 주소 공간으로 분리해 프로세스에 분배하는 것

사용자 프로그램에서 볼 수 있는 주소는 모두 가상주소,
실제 프로세스의 물리 메모리 주소를 알 수 있는것은 운영체제 뿐
운영체제는 하드웨어의 도움을 받아 가상메모리를 물리 주소로 변환

• 설계 목표

» 투명성 (Transparency)

실행중인 프로그램이 가상 메모리의 존재를 인지하지 못하도록 가상메모리 시스템을 구현

» 효율성

시간/공간 측면에서 효율적으로 구현
시간 효율적인 가상화 구현시 운영체제는 하드웨어의 지원(TLB등)을 받아서 구현

» 보호 (Protection)

프로세스는 자신의 주소공간 밖의 어느것도 접근 불가능 하도록 서로 격리해야함
(다른 프로세스나 운옃제제의 메모리에 접근 X)

격리의 원칙

서로 적절히 잘 분리된 개체는, 한 개체가 실패하더라도 다른 개체에게 아무 영향을 주지 않음을 암시함
신뢰할 수 있는 시스템을 구축하는데 중요한 원칙

profile
Software Engineer

0개의 댓글