컴퓨터 공학 - VAS, stack, heap 학습
VAS (가상 주소 공간, Virtual Address Space)
- OS가 프로세스 시작할 때 할당해주는 가상 메모리 공간
- OS가 제공하는 가짜 메모리(프로그래머는 실제 메모리라 간주하고 사용하면 된다.)
- 프로세스 시작하면 운영체제(OS)가 4GB 할당(page table 4GB를 만들어준다고 생각하면 된다.)
- 프로세스마다 페이지 테이블을 main memory(RAM)에 만들고, pagetable에 첫 주소를 가르켜준다.
프로그램 실행 순서
- 프로그램 실행 시, 운영체제(OS)는 main Memory(RAM)에 page table 생성하고, 실행에 필요할 것 같은 페이지만 우선 프레임에 매핑(preparing = demand paging -> 내가 필요할 때 요청해서 올린다는 개념)
- RAM에서의 주소값(physical address)과 일치하는 VAS에서의 주소값(logical address)을 pagetable에 저장
- MMU가 VAS 주소값을 RAM 주소값으로 변환하여 MAR로 전달
- 제일 처음엔 frame#이 없어 page fault 발생
- page fault 발생 시, hard disk에서 코드를 받아와야 하므로 50만 ~ 500만 cycle 기다려야 한다.
- MMU (Memory Management Unit) : 논리주소 -> 물리주소 변환
- MAR (Memory Address Register) : 물리주소 저장
- PC가 이 주소를 읽어와 인스트럭션 가져오고(fetch), 실행(execute)
- 제일 처음엔 frame#이 없어 page fault 발생
- RAM이 꽉 차 있으면, 한 프로세스에서 새로운 page#을 받아올 때, valid bit가 0이 된다. -> page fault 발생 -> 잘 돌고 있는 RAM 데이터의 page frame(victim page)을 hard disk의 page file에 옮기고(page out), hard disk에서 새로운 코드를 RAM에 저장하여 frame#을 만든다.(page in)
- page file : hard disk에서 속도 증대를 위해 RAM 처럼 사용하는 영역
- page out + page in –> paging –> RAM + page file
가상 메모리
- 한정된 물리 메모리의 한계를 극복하고자 디스크와 같은 느린 저장장치를 활용해, 애플리케이션들이 더 많은 메모리를 활용할 수 있게 해주는 것
- 메인메모리(RAM)를 확장하기 위해 페이지 파일(page file)로 불리는 하드디스크의 일정 부분을 메인 메모리처럼 사용하는 것
- 메인메모리 + 하드디스크 페이지파일 = 물리 메모리
- thrashing(스레싱) : 더욱 빨라진 CPU 속도로 인해 요청 수가 급격히 증가하게 되고, page fault 발생 수가 현저히 증가하여 paging이 빈번하게 되는 현상
- fan이 미친듯이 윙~ 돌게 되는 현상
stack VS heap
stack
- 장점
- 메모리 할당주소를 찾는 활동 불필요
- stack pointer가 가르키고 있는 곳 위로 데이터를 쌓기 때문
- 메모리 할당주소를 찾는 활동 불필요
- 단점
- 저장용량이 default 값으로 1Mbyte 이므로, 용량 초과 시 stack over flow 발생
heap
장점
- stack 과 heap 사이 공간이 꽉 채워지지 않을 때까지 계속해서 메모리 저장 가능
- stack처럼 저장용량이 default값으로 저장되지 않음
- stack 과 heap 사이 공간이 꽉 채워지지 않을 때까지 계속해서 메모리 저장 가능
단점
- 메모리 누수
- heap에 데이터 저장하고 그 메모리주소를 가르키는 변수가 사라질때 발생한다.
- 이 상태에서 for 문으로 계속 돌리다보면, heap에 메모리 누수가 계속 발생하게 되어 결국 서버가 터지게 된다.
- Garbage collection
- 언어차원에서 메모리 관리 제공(heap 관리) -> 메모리 누수 방지
- reference counter(참조한 횟수 카운트)하여 그 값이 0이 되면, Garbage collection이 heap에 저장된 데이터를 지워준다.
- 느린 속도
- melloc 함수 자체가 느리다.
- 데이터 저장 앞부분 header에게 데이터가 저장될 공간이 있는지 순차적으로 확인해야 한다.
- 메모리 단편화(memory fragmentation)
- 메모리 전체 공간은 충분하나, 메모리가 듬성듬성 쪼개져 있어서 사실상 할당이 불가능한 것
- python은 heap에서 메모리 저장 공간을 divide하여 stack처럼 쌓을 수 있도록 자동 변환(dynamic heap 기법)
- 메모리 단편화(memory fragmentation) 문제 해결
- 메모리 누수
Posted
tags:
{ Computer Science }
{ Study }