[운영체제] 메모리 관리

Letmegooutside·2022년 1월 17일
0

운영체제

목록 보기
13/16

연속메모리 할당

각 프로세스가 메모리 내의 연속된 단일 공간을 요청하고 사용하는 기법이며 과거의 운영체제에서 사용했다.

프로세스가 100MB를 요구하면 연속된 100MB를 할당하는 것이 원칙이다.

어느 순간에 작은 빈공간들이 메모리 전체에 띄엄띄엄 흩어져 있게 되는 단편화 현상이 발생하는데 이렇게 되면 연속된 공간을 할당할 수 없게된다.

동적 메모리 할당 방식의 문제

작은 빈 공간들이 여러개 있을 때 어떤 공간을 선택해서 메모리를 할당할지에 대한 문제 (어느 방법이든 단편화가 생긴다)

  • First-Fit(최초 적합)
    요구한 프로세스보다 크기가 큰 홀 중에 첫번째 홀에 할당한다.

  • Best-Fit(최적 적합)
    요구한 프로세스보다 크기가 큰 홀중에 가장 크기가 딱 맞는것, 즉 가장 작은 것에 할당한다.
    모든 홀을 다 조사해봐야하며 남는 메모리가 제일 작다.

  • Worst-Fit(최악 적합)
    가장 큰 홀에 할당한다.
    가급적 큰 홀을 만들자는 것을 목표로 한다.

Fragmentation (단편화)

프로세스들이 메모리에 적재되고 제거되는 일이 반복되다보면 프로세스들이 차지하는 메모리 틈 사이에 사용하지 못할 만큼 작은 자유공간들이 늘어나게 되는데 이것이 단편화이다.

  • 내부 단편화
    프로세스가 사용하는 메모리 공간에 포함된 남는 부분
    프로세스가 필요한 메모리 양 보다 더 큰 메모리가 할당되었을 경우 발생

  • 외부 단편화
    메모리 공간 중 사용하지 못하게 되는 일부분. 모두 합치면 충분한 공간이지만, 분산되어 있을 때 발생
    프로세스가 필요한 메모리 양만큼 연속적으로 할당하지 못하는 경우

compaction : 메모리의 모든 내용들을 한군데로 몰고 모든 자유공간들을 다른 한 군데로 몰아서 큰 블록을 만드는 작업. 런타임 바인딩을하는 시스템에서만 사용가능하다.

메모리 낭비 방지 기법

Dynamic Loading(동적 적재)

프로세스가 시작될 때 그 프로세스의 주소 공간 전체를 메모리에 올려놓는 것이 아니라 메모리를 효율적으로 사용하기 위해 필요한 루틴이 호출될 때 해당 루틴을 메모리에 적재하는 방식이다.

실제 호출 전까진 메모리에 올리지 않고 디스크에서 대기한다.
먼저 main(프로그램의 진입점)이 메모리에 올라와 실행된다.
main이 다른 루틴을 실행하면 그 루틴이 메모리에 적재되어있는지 조사하고 적재되어 있지 않다면 relocatable linking loader이 요구된 루틴을 메모리에 올린다.

동적 적재는 루틴이 필요한 경우에만 적재하기 때문에 효율적이고 발생빈도는 적어도 많은 양의 코드를 필요로 하는 경우에 유용하다. (ex) 오류 처리 루틴)

Dynamic Linking (동적 연결)

실행 가능한 목적 파일을 만들 때 프로그램에서 사용하는 모든 라이브러리 모듈을 복사하지 않고 해당 모듈의 주소만을 가지고 있다가 런타임에 실행 파일과 라이브러리가 메모리에 위치될 때 해당 모듈의 주소로 가서 필요한 것을 들고오는 방식

동적 연결에서는 라이브러리를 부르는 곳 마다 stub(스텁)이라는 코드조각이 생성된다.
스텁은 라이브러리를 어떻게 찾을지를 알려주고 스텁이 실행되면 라이브러리 루틴이 메모리에 적재되었는지 검사한 후 없으면 디스크에서 가져온다.

동적 연결을 사용하면 5개의 프로그램에서 A라는 외부함수를 이용한다고 해도 A라는 함수의 정보는 하나만 있으면 된다.
각각의 실행 가능한 목적파일에서는 A 자체가 아니라 A가 있는 곳의 주소만 가리키고 있기 때문이다. 따라서 메모리와 디스크공간을 더 아낄 수 있다.

static linking : 프로그램이 사용하는 모든 라이브러리 함수가 프로그램의 일부로 포함된 것

swapping

주기억장치에 적재한 하나의 프로세스와 보조기억장치에 적재한 다른 프로세스의 메모리를 교체하는 기법

부하조절을 위해 프로세스의 일부를 디스크로 내보내는데 이 때의 메모리 관리 기법을 swapping이라고 한다.
디스크와같은 보조기억장치를 메모리의 확장으로 본다.

backing store : swapping에 사용되는 디스크

Virtual Memory (가상메모리)

실제 메모리 크기와 상관 없이 메모리를 이용할 수 있도록 가상의 메모리 주소를 사용하는 방법

실제 물리 메모리 개념과 사용자의 논리 메모리 개념을 분리한 것으로 실제 주기억장치보다 큰 메모리 영역을 제공하는 방법으로 사용된다.

만약 가상메모리를 사용하지 않는 시스템에서 애플리케이션 수행 시 1000바이트의 용량을 차지하는 프로그램이 있다고 가정해보자.
이 때 시스템의 메모리는 최소 1000바이트 이상이 되어야 하므로 여기서 1바이트라도 모자라면 메모리 부족 오류가 날 것이다.

가상메모리는 프로그램이 차지하는 주소공간의 개념에 대해 프로그램을 실행하는데 얼마나 많은 메모리가 필요한가?에 집중하지 않고 프로그램을 실행하는데 필요한 최소한의 메모리는 얼마인가?에 대해 집중한다.

메모리 접근은 순차적이고 지역화되어있다는 특성 때문에 어플리케이션을 실행시키는데 필요한 메모리는 1000바이트보다 훨씬 적게된다.
따라서 프로그램 실행과 관련있는 부분만 메모리에 올리고, 나머지는 보조기억장치에 위치시키자는 것이다. (RAM과 캐시의 관계와 유사하다)

Logical vs Physical 주소 공간

  • 논리주소(가상주소)
    CPU가 만들어내는 주소, CPU 명령어에 포함되어 있는 주소

    • 논리주소 공간 : CPU가 만들어낸 논리 주소가 가질 수 있는 범위
  • 물리주소
    실제 RAM상의 주소

    • 물리주소 공간 : RAM의 크기와 같다

MMU : Memory Management Unit의 약자로 논리주소를 물리주소로 변환하는 동작을 하는 하드웨어 장치이다.

가상 메모리 관리 기법

Paging

물리 메모리를 사용할 때 페이지를 고정크기의 프레임 단위로 나누고 논리메모리도 같은 프레임 단위인 페이지로 나누어서 프레임과 페이지를 대응하게 하여 연속적인 물리 메모리가 아니더라도 원하는 크기의 프레임을 사용할 수 있도록 하는 기능

프로그램의 페이지가 N개라면 필요한 메모리 공간은 N개의 프레임이고 이 프레임은 물리공간에서 연속적일 필요가 없다.
따라서 외부단편화 현상은 발생하지 않지만 프로그램의 크기가 페이지의 크기의 배수가 아닌 경우 페이지의 크기가 프레임보다 작을 수 있어 내부단편화는 여전히 발생한다.

CPU에서 나오는 모든 주소는 페이지 번호와 페이지 변위 두 개의 부분으로 나누어진다.
페이지 번호는 페이지 테이블을 접근할 때 사용되고 페이지 테이블의 페이지 기준 주소에 페이지 변위를 더하면 장치로 전송될 물리 주소가 된다.

  • Page Fault : 요구하는 페이지가 존재하지 않을 때 발생한다.

  • TLB : 페이지 테이블 내용의 일부를 저장하는 캐시

  • 프레임(Frame) : 물리 메모리를 일정한 크기로 나눈 블록

  • 페이지(Page) : 가상 메모리를 일정한 크기로 나눈 블록

  • 페이지 테이블(Page Table) : 프로세스의 각 페이지가 어느 프레임에 있는지 나태내는 표. 프레임의 기준 주소를 가지고 있다.

Segmetation

가상메모리를 서로 크기가 다른 논리적 단위인 Segment로 분할하고 메모리를 할당하여 주소를 변환한다.

세그먼트들의 크기가 서로 다르기 때문에 물리 메모리를 페이징 기법처럼 미리 분할해 둘 수 없고, 메모리가 적재될 때 빈 공간을 찾아 할당하는 사용자 관점의 가상메모리 관리 기법이다.

페이징기법과 마찬가지로 mapping을 위해 세그먼트 테이블을 필요로 한다.
이 기법은 하나의 세그먼트 단위로 통제가 가능한 장점이 있다.
내부단편화가 발생하지 않는다.

하지만 서로 다른 크기의 세그먼트들에 대해 필요할 때 메모리에 올리고 필요없을 경우 내리는 작업을 반복하다보면 외부 단편화가 생기는 문제점이 있다.

Segmentation Fault : 프로그램이 허용되지 않은 메모리 영역에 접근을 시도하거나, 허용되지 않은 방법으로 메모리 영역에 접근을 시도할 경우 발생한다.




Reference
https://live-everyday.tistory.com/69
https://sycho-lego.tistory.com/10
https://ko.wikipedia.org/wiki/가상_메모리
https://m.blog.naver.com/PostView.nhn?blogId=kywpcm&logNo=30168638211&proxyReferer=https:%2F%2Fwww.google.com%2F

0개의 댓글