티스토리 뷰
메모리란?
: 메인 메모리, RAM을 뜻한다. 프로그램 실행 시 필요한 주소, 정보들을 저장하고 가져다 사용할 수 있게 만드는 공간.
즉, 작업을 위해 사용되는 공간.
메모리 관리가 필요한 이유는?
: 사용자들이 프로그래밍을 하면서 쉽게 메모리를 사용할 수 있도록 해준다. 사용자가 프로그래밍 언어를 활용해 코드를 작성할 떄 내부적으로 운영체제가 메모리를 관리해준다는 것이다. 운영체제가 메모리를 관리를 해준다는 것은 효율적으로 사용할 수 있도록 도와준다는 뜻이다. 또한, 메모리를 보호해준다. 메모리 보호란, A라는 프로세스가 있는데 다른 B라는 프로세스가 동시에 실행중에 있다. 그런데 B가 A의 메모리를 침범한다면 서로의 프로세스가 섞이기는 일이 발생할 것이다. 이러한 문제를 막는 행위이다.
운영체제의 역할
실행파일이 로더에 의해 메모리에 올라오고 운영체제는 이 실행파일을 메모리에 어느 부분에 올릴지 결정한다.
링킹(Linking) 이란?
위 그림을 보자면 C++코드가 동작하는 과정을 도식화 한 그림이다. 그림에서 Linking이라고 써져 있는 부분이 우리가 지금 배울 링킹이라는 것이다. 제일 처음엔 사용자들이 이해 할 수 있는 소스 코드가 가장 먼저 존재하고 이를 컴퓨터가 이해 할 수 있는 기계어(object code)로 변환하는 과정을 컴파일링이라고 한다. 그리고 마지막으로 이 기계어를 실행가능한 파일로 변환하는 것을 링킹이라고 한다.
링킹을 수행하는데 라이브러리 파일들과 소스코드를 기계어로 변환시킨 object 파일들이 링킹되어 만들어지는 것이 실행가능한 파일이다.
링킹에는 두가기 종류가 있는데 정적 링킹(Statuc Linking)과 동적 링킹(Dynamic Linking) 이 있다.
- 정적 링킹 : 라이브러리 파일이 링킹하는 과정에 이미 포함이 되기 때문에 컴파일 하는 시간이 단축되며, 해당 코드의 유출을 막는다. 하지만 여러개의 파이썬 코드가 있다고 하면, 여러개의 파일에 공통적으로 사용되는 라이브러리들이 개별 파일 마다 포함이 되면 메모리를 엄청나게 차지하는 단점이 있다.
- 동적 링킹 : 정적 링킹의 단점을 보안하기 위해 공통적으로 사용하는 라이브러리들 (DLL, Dynamic-Link Library) 를 한번에 올려 놓고, 매번 왔다갔다 하면서 사용하는 링킹 방법이다. 하지만, 컴파일 성능 오버헤드가 발생 할 수 있다.
로딩이란?
로딩이란, A.exe라는 프로그램을 실행시킬 때, A.exe에 있는 파일이 메모리에 올라가는 것을 말한다. 로딩에는 두가지 동류가 있는데 동적 로딩와 오버레이 로딩 방법이 있다.
- 동적 로딩 : 메모리의 크기가 프로세스 크기보다 클 때 사용하는 방식이다. 또한 필요한 시점에만 루틴을 호출해 메모리에 적재하고 이후에 메모리에서 빼내는 방식으로 동작한다.
- 오버레이 로딩 : 프로세스의 크기가 메모리의 크기보다 클 때 사용하는 방식이다.
현재 pass1,2프로그램을 합친것이 여유 메모리보다 크다. 그런데 pass 1이 끝나면 pass 2를 올리는 오버레이 방식을 사용하면 된다. 위 예시를 보면 overlay driver 라는 메모리를 적게 차지하는 드라이버를 볼 수 있는데, 이게 pass1과 2 를 메모리에 올렸다 내렸다 하는 중재자 역할을 한다. 하지만 이런 방식은 사용자가 직접 구현을 해주어야 하는데 이걸 운영체제가 아닌 사람이 한다는 것은 매우 복잡한 일이 였기에 사용되지 않고, 현재는 Paging 기법, VMM을 사용한다. 이것이 운영체제가 사람 대신 메모리 관리를 해주는 것이다.
스와핑과 VMM(Virtual Machine Monitor)
VMM에 대해 알아보기 전에 스와핑의 개념부터 알아보자. 스와핑이란 메모리의 최대 프로세스양을 넘어서 추가로 실행할 프로세스를 실행해야 될 때 사용하는 것이다. 만약 10개가 최대일때 11번째의 프로세스가 들어온다면, 하나를 내리고 올려야 되는데 이때를 Swap Out 이라고 하고 11번째 프로세스가 끝났을 때 아까 내려간 하나를 다시 메모리에 올리는 것을 Swap In 이라고 한다.
VMM은 가상 메모리라는 개념을 사용하는데, 가상 메모리란 메인 메모리가 8GB인데, 10GB짜리 프로그램을 실행 가능 하게 해주는 것이다. 이러한 일이 어떻게 되냐면 8GB만 메인 메모리에 올리고 나머지 2GB를 보조기억장치에 기억하고 있다가 필요시 바꿔주는 일종의 스와핑을 수행한다. VMM은 프로세스 단위로 수행되는 스와핑보다 더 적은 단위인 Paging 단위로 스와핑을 해준다.
메모리 주소 할당(바인딩)
- 물리적 주소 : 메모리의 기능은 데이터를 저장하는 곳 이다. 단순히 크기가 큰 배열이라고 생각해도 되는데 배열이기에 인덱스 값을 가진다. 이 인덱스 값을 물리적 주소 하고 한다. 물리적 주소는 메모리 자체의 인덱스이다.
- 논리적 주소 : 논리적 주소는 가상 주소라고도 한다. 같은 메모리를 공유할 때 서로 침범을 하지 않게 할려면 본인 프로그램이 사용하는 주소 공간을 표시해주면 된다. 그러기 위해서는 시작주소와 크기만 있으면 된다. 시작 주소 + 크기 가 끝 주소가 되기에 이 사이를 침범할려면 에러를 표시하면 된다. 이렇게 모든 프로세스는 "시작 주소=Base Register" , "크기=Limit Register"를 나타내는 레지스터가 정의 되어 있다.
어떤 프로세스가 물리적 주소에 접근할려면 논리적 주소를 물리적 주소로 Mapping 하는 과정이 필요한데, MMU(Memory Management Unit)이 이 역할을 한다. 주소 매핑 과정은 빈번히 일어나기에 MMU는 하드웨어적으로 구현이 되어 있다. 아래와 같이 논리적 주소에 base register(=relocation register) 값을 더해주면 된다.
주소 매핑은 주소 할당돠 같은데, 논리적 주소를 물리적 주소로 매핑한다는 것은 논리적 주소에게 새로운 물리적 주소를 할당한다는 것이다. 위와 같이 한 프로세스의 모든 논리적 주소에 동일한 base register를 더하는 것을 연속 할당이라고 한다.
어떤 데이터를 메모리에 저장할 때, 이 데이터에는 이 데이터가 메모리의 어느 번지수에 저장되어 있는지 메모리 주소를 할당해줘야 된다. 이때 데이터에 메모리 주소를 언제 할당하느냐에 따라 주소 할당 방법이 3가지로 나뉜다.
Ex )
data = 10; // data 메모리 번지에 10을 입력하는 프로그램 |
store $98000 10 // 실제로 cpu가 수행하는 것 98000이 data의 논리적 주소 |
1. Compile Time Binding
컴파일 시 메모리 주소를 할당해주는 것이다. 즉, 프로그램 내부에서 사용하는 주소 (= CPU에 의해 생성되는 주소) 와 물리적인 주소(=메모리 자체의 인덱스) 가 동일하다는 것이다. 한 프로그램이 주소 바인딩을 198000~1000000에 되었다고 하자. 이 프로그램을 실행하기 위해서는 모든 사용자들은 해당 주소가 비어있어야지 실행이 된다. 즉, 이런 바인딩은 멀티 프로그램이 실행되지 않을 때 사용하는 것이다.
2. Load Time Binding
메모리에 로딩할 때 할당해주는 방법이다. 논리적 주소와 물리적 주소가 분리되어 있기 때문에 멀티 프로그램이 가능하다. relocation register가 있기에 프로세스의 주소가 메모리의 어디에나 위치할 수 있다. 하지만, 프로그램안의 모든 주소를 relocation 해야 되서 로딩 시 시간이 오래 걸리고 한번 relocation이 되면 바뀌는 일이 없기에 컴파일러가 주소를 특정할 수 없으면 전부 다시 relocation 해야된다. 예를 들어, 프로세스의 크기가 커져서 다른 프로세스의 영역을 침범하게 되면 전체 코드를 복사해서 여유 있는 공간에 다시 붙여넣기 해야된다. 이러면 오버헤드가 심해진다는 문제점이 있다.
3. Execution Time Binding
2번은 한번에 relocation을 해서 오버헤드가 생기니까 실행 중 하나씩 relocation 하자 라는 것이 이 방법이다. 코드가 한줄 한줄 실행 될때 논리적 주소를 물리으로 바인딩해준다.
'cs 스터디' 카테고리의 다른 글
[웹/SW] CSRF,XSS에 대해 (1) | 2024.03.14 |
---|---|
[데이터 베이스] 트랜잭션 (0) | 2024.02.22 |
웹 보안 (0) | 2024.02.05 |
[WEB] 렌더링 (0) | 2024.01.30 |
[WEB] 브라우저 동작 방법 (0) | 2024.01.29 |