Kim Seon Deok

[OS] Main Memory Management, 메모리 낭비 방지 본문

운영체제

[OS] Main Memory Management, 메모리 낭비 방지

seondeok 2022. 11. 29. 03:58

 

 

os의 기능

1. Process management : cpu자원관리

2. Main memory management

 

 

메모리 역사

최초의 메모리는 core memory이다. 이후 50~60년대 진공관 메모리, 70~60년대 트랜지스터 메모리를 거쳐 현재에는 SRAM,DRAM과 같은 집적회로 메모리를 사용한다.

또한 메모리 용량은 70년대부터 현재까지 시간이 지날수록 굉장히 커져 64kb메모리에서 출발해 수 GB의 메모리를 현재 사용하고 있다.

 

프로그램이 기계어/어셈블리에서 high level language로 다양해짐에 따라 프로그램의 크기는 증가했고 메모리 용량 또한 증가할 필요성이 커졌다. 따라서 메모리는 항상 부족한 상황이다. 그렇기 때문에 낭비를 최소화 하면서 메모리를 효과적으로 사용하는 것이 중요하다.

 

 

 

메모리는 주소와 데이터로 구성된다.

cpu는 메모리의 몇 번지를 읽을 지 address를 버스를 통해 보내고, 메인메모리에서는 해당 address에 저장되어있는 내용을 cpu에게 보낸다.(Data read). 또한 cpu는 계산한 결과를 메인메모리로 보냄(Data write) 따라서 data bus는 쌍방향이다.

프로그램은 코드와 데이터 스택으로 구성된다.

 

프로그램 생성과정은 다음과 같다.

maic.c → high level language 프로그램

main.o → binary 파일

linker → 오브젝트 파일과 하드디스크에 있는 라이브러리를 연결

main.exe → 실제 실행 파일 

loader → os의 memory management에 존재하고, exe파일을 메인메모리로 load해 실행

 

 

MMU는 cpu가 내보내는 address가 프로그램 주소번지에 해당하는지 확인해주는 역할을 한다.

MMU는 base, limit, relocation register로 구성된다.

만약 address가 프로그램 주소번지 범위에 있지 않다면 cpu에게 인터럽트 신호를 보내 프로그램을 강제종료하도록 한다.

 

ex) 하드디스크에 hwp프로그램이 있다 하자.

hwp파일은 cpu가 보내는 0번지의 주소로 적재되어야 하는데, 실제로 500번지에 적재되었다.

이는 mmu의 relocation register가 특정 값을 cpu주소값에 더해서 전체적인 주소값을 바꿔주었기 때문이다. → cpu에게 0번지에 적재되었다고 속인 것

 

ex) hwp프로그램은 오늘은 500번지에 적재되었는데, 다음날 1000번지에 적재될 수도 있다.

이럴 경우, cpu가 보내는 address값이 0으로 똑같을 때, MMU값은 500에서 1000으로 변경해주면 된다.(address translation)

 

ex) hwp : 5000번지, game : 10000번지

cpu가 두 프로그램으로 보내는 주소값이 0으로 동일하고 hwp에서 game으로 context switch가 일어난다 할 때, MMU값은 5000에서 10000으로 바뀌어 각각의 주소값에 더해져 메인메모리의 별개의 장소에 적재된다. → cpu는 두 프로그램이 0번지에 있다 생각한다.

 

∴  MMU를 기준으로 CPU가 보는 주소와 메인 메모리가 보는 주소가 별개로 생기는 효과를 가져온다.

이 때 cpu가 보는 주소를 logical address, 메인메모리가 보는 주소를 physical address라 한다.

 

 

 

 

 

메모리 낭비 방지

1. 동적 적재(Dynamic Loading)

전체 프로그램 중 프로그램 실행에 필요한 데이터만 메인메모리에 올리는 것을 말한다.

Booting : os를 메인메모리로 올리는 것

Load : 어플리케이션 혹은 exe파일을 메인메모리로 올리는 것

 

 

2. 동적 연결(Dynamic Linking)

p1.c파일과 p2.c파일에 printf()코드가 모두 있다면, 각각의 실행파일 생성과정에서 이를 중복해서 실행파일로 만들어 주게 된다면 메모리의 낭비가 발생한다. printf()코드는 하드디스크에 라이브러리 형태로 존재하기 때문에 p1.c, p2.c파일에서 printf()부분만을 제외하고 exe파일을 만들어 준 다음 링커단계에서 printf()를 합쳐주면 메모리를 효율적으로 사용할 수 있게된다.

static linking : linker → exe파일 각각 생성 → p1,p2 메인메모리에 로드

dynamic linking : 중복되는 코드 빼고 p1,p2메인메모리에 로드 → p1,p2실행될 때 빠진 코드가 없다면 중복된 코드 하드디스크에서 메인메모리로 로드하고 link 

 

 

 

3. 스와핑(Swapping)

메인메모리에 로드되어있는데 사용되고 있지 않는 프로세스 이미지를 backing sotre로 몰아내고 (Swap out), 다시 필요해 질 때 쯤 메인메모리로 로드하는 것을 말한다 (Swap in).

swap out을 하면 메인메모리에 빈 공간이 생겨 다른 프로세서를 수행할 수 있으므로 메모리의 낭비를 방지한다.

 

 

 

 

 

 

'운영체제' 카테고리의 다른 글

[OS] Paging  (2) 2022.11.30
[OS] Contiguous Memory Allocation  (0) 2022.11.30
[OS] Deadlocks, Monitors  (0) 2022.11.29
[OS] Classical Synchronization Problems  (2) 2022.11.29
[OS] Thread, Process Synchronization, Semaphore  (0) 2022.11.27
Comments