메모리관리

원래벌레·2022년 12월 18일
0

🌞메모리 관리의 개요


🌻 메모리 관리 개념과 정책

🌱메모리관리

  • 프로세스들을 위해 메모리 할당, 회수, 보호하는 활동이다.
    -> 프로그램을 실행하려면 먼저 디스크에서 메모리로 적재해야 한다.
    -> 여러 프로세스가 메모리에 상주할 수 있도록 OS가 동적으로 메모리를 세분화한다.
  • OS의 메모리 관리모듈과 메모리 관리장치 MMU가 함께 진행된다.

🌱메모리관리의 목표

  • 편리한 프로그래밍을 위한 메모리 추상화
    -> 프로세스 간의 상호 보호
  • 부족한 용량의 메모리를 효과적으로 활용
    -> 경쟁적인 프로세스들에게 적절히 나누어 할당한다.
    -> 메모리 이용률과 시스템 처리량을 최대화 한다.

🌱메모리 관리 정책

  1. 적재 정책
    -> 디스크에서 메모리로 언제 들어 올지 결정하는 정책이다.

    요구적재
    참조 요청시 적재
    예상 적재
    예측되는 참조 요청까지 미리 적재

  2. 배치 정책
    -> 메모리의 어느 위치에 저장할 지 결정하는 정책이다.
    -> 가변분할방식에서 first/best/worst fit이 있다.
  3. 교체 정책
    -> 메모리가 충분하지 않을 때 현재 메모리에 적재된 내용 중 제거할 부분을 결정하는 교체 정책
    -> 페이지 교체 알고리즘 중 FIFO, LRU, NUR 등등

정답

없다.
배치정책
예상적재


🌻메모리의 구조와 매핑(사상)

🌱메모리의 구조

  1. 논리적 주소
  2. 물리적 주소

🌱메모리 주소 변환

  • 논리적 주소를 물리적 주소로 변환한다.

문제 : 가상주소와 물리주소의 대응 관계로 가상주소로부터 물리주소를 찾아내는 것을 무엇이라고 하는가?
정답 : 매핑

🌱프로세스의 주소 바인딩

  • 프로세스의 논리적 주소를 물리적 주소에 매핑하는 작업이다.

  • 주소 매핑이란 논리적 주소와 물리적 주소 간의 대응을 뜻한다.

🌱주소 바인딩의 시점


주소 바인딩의 시점은 총 세가지이다
1. 컴파일 시간
-> 컴파일러가 절대 주소를 생성한다. 메모리 적재 위치를 바꾸려면 다시 컴파일한다.
2. 적재 시간
-> 로더가 절대 주소를 생성한다. 이때 컴파일러는 상대 주소를 생성한다.
-> 메모리 적재 위치를 바꾸려면 재적재한다.
3. 실행 시간
-> 실행시간에 절대 주소를 생성한다.
-> 실행 시간에 적재 위치를 이동 할 수 있다.
-> 하드웨어의 지원이 필요하다(MMU, base and limit registers)

🌱Memory-Management Unit(MMU)

  • 논리 주소를 물리 주소로 바꾸는 하드웨어 장치이다.

정답

프로세스의 논리적 주소를 물리적 주소로 바꿔주는 것이다.
실행 시간


🌻메모리 관련 용어

🌱동적적재

  • 동적 링킹이라고도 한다.

  • 프로그램 내의 루틴이 호출되는 시점에 적재를 한다.

  • 적재가 미뤄진 라이브러리 코드는 실행 파일에 포함되지 않는다.

  • 장점
    -> 프로그램 초기 적재 시간 절약 -> 실행 파일 크기가 작다.
    -> 메모리 절약 : 사용되지 않는 루틴은 메모리에 적재되지 않는다.
    -> 사용 빈도가 낮고 크기가 큰 루틴에 유용하다 (오류처리 루틴 등)

먼저 주 프로그램이 메모리에 적재되어 실행된다.
주 프로그램이 호출한 루틴이 이미 메모리에 적재되어 있지 않다면,
재배치 가능 연결 적재기가 불려져 요구된 루틴을 메모리로 적재하고,
이러한 변경사항을 프로그램의 주소 테이블에 기록해 둔다.
그 후, CPU 제어는 그 루틴으로 보내진다.

🌱정적적재와 동적적재의 비교

정적적재
1. 실행 파일에 필요한 루틴들이 모두 들어 있다.
2. 실행 속도가 빠르다.
3. 메모리 효율이 낮다.

동적적재
1. 실행파일에 DLL은 포함이 되지 않는다.
-> DLL : 실행 파일에서 해당 라이브러리의 기능을 사용 시에만, 라이브러리 파일을 참조하여 호출한다.
2. 실행속도가 느리다.
3. 메모리 효율이 높다.

🌱중첩(overlay)

  • 실제 메모리보다 큰 프로그램을 실행하는 기술이다.
  • 프로그램 실행 중에 불필요한 모듈 위에 필요한 모듈을 중첩하여 적재한다.
  • 프로그래머가 프로그램을 미리 분할하여 중첩 가능한 모듈을 지정한다.
  • 운영체제 영역과 프로그램 실행에 꼭 필요한 명령어와 데이터에는 적용 안하고, 일시적으로 필요한 모듈에만 적용한다.
  • 오버레이란 데이터나 익스트럭션 블록을 다른 블록으로 교체하는 것을 의미한다.
    주로 가상 메모리를 지원하지 않는 임베디드 시스템에서 많이 사용한다.
    임베디드 시스템에 자주 사용되는 저렴한 프로세서들은 메로리 관리장치를 제공하지 않기 때문에 이와같은 경우 오버레이 방법이 여전히 유용하게 사용된다. 또한 오버레이 방식이 페이징보다 더 예층가능한 시간안에 동작하기 때문에 실시간 시스템에서도 여전히 많이 사용한다. 예를 들어 우주 왕복선의 PASS는 오버레이 방식을 사용한다.

🌱스와핑(프로세스 교체)

  • 메모리의 프로세스와 보조기억장치의 프로세스를 교체하는 ㄱ법
    -> Swap Out : 프로세스가 보조기억장치로 이동
    -> Swap In : 프로세스가 메모리로 이동

스와핑은 가상기억장치의 페이징 기법으로 발전하였다.
메모리가 모자라서 쫓겨난 프로세스는 저장장치의 특별한 공간에 모아두는데 이를 스왑영역이라고 한다.

정답

1번
4번

🌱연속/불연속 메모리 할당

연속메모리 할당
1. 한프로세스에 연속된 메모리를 할당하는 것이다.
2. OS오버헤드가 적다. 왜냐하면 주소변환이 단순하기 때문이다.
3. 프로세스의 수행시간이 짧다
4. OS의 제어가 쉽다.
5. 고정분할에 경우 내부단편화가 발생한다. 가변분할에 경우에는 발생하지 않는다.
6. 고정분할에 경우에는 외부단편화가 발생하지 않는다. 가변분할에는 발생하낟.

불연속메모리 할당
1. 한프로세스에 불연속한 메로리르 할당한다.
2. OS오버헤드가 많다. 주소변환이 복잡하기 때문이다.
3. 프로세스의 수행시간이 길다.
4. OS의 제어가 어렵다
5. 페이징의 경우에는 내부단편화가 있다. 세그먼테이션에는 없다.
6. 페이징에는 외부단편화가 없다. 세그먼테이션에는 있다.

정답

3번

🌞연속 메모리할당

🌻단일 프로그래밍 환경에서 연속 메모리 할당

  • 운영체제 영역과 사용자 영역으로 구분된다.

  • 경계 레지스터를 이용하여 운영체제를 보호한다.


🌻다중 프로그래밍 환경에서 연송 메모리할당

  1. 고정 분할
  2. 가변 분할

🌱고정분할

  • 고정분할 방법은 다시 같은크기 분할과 다른크기 분할로 나뉜다.

  • 할당 알고리즘은 빈공간과 프로세스의 요구 메모리량을 고려하여야 한다.

  • 메모리를 미리 분할하여 프로세스에게 분할된 영역을 할당한다.

  • OS의제어가 쉽다.

  • 내부단편화가 있다.

  • 외부단편화가 없다.

  • MFT

🌱가변분할

  • 최초적합, 최적적합, 최악적합으로 나뉜다.

  • 분할된 부분을 탐색하면서 딱맞는 크기의 메로리홀에 넣을지 아니면 최초에 확인한 경우 홀에 넣을지 아니면 가장큰 홀에 넣을지를 결정한다.

  • 메모리를 미리 분할하지 않고 프로세스가 요구하는 크기만큼씩 할당한다.

  • OS의 제어가 어렵다

  • 내부단편화가 없다.

  • 외부단편화가 있다.

  • MVT

정답

20비트

정답

34KiB

크기가다른 고정분할 방법

  • 이 방법은 또 두가지로 나뉜다. 큐를 하나를 두는 방법과 여러개를 두는 방법
  • 나뉘어진 크기가 다르기 때문에 이렇게 큐를 나누어주면 고정분할을 할 때에 최초할당을 하면서 최적할당을 함께 할 수 있다.
  • 내부 단편화가 적게 발생하는 방법이다.

🌻가변분할의 배치

  1. 최초 적합 방법
  2. 최적 적합 방법
  3. 최악 적합 방법

🌱최초적합 방법

  • 들어갈 수 있는 첫번째 공간에 할당을 한다.
    -> 가능 공간의 리스트 맨 앞 부터 검색을 한다.
    -> 이전 검색이 끝난 곳부터 검색을 한다.

  • 장점
    -> 속도

  • 단점
    -> 공간 활용률이 낮다.

🌱최적적합방법

  • 들어갈 수 있는 가장 작은 공간에 할당한다.

  • 장점
    -> 공간 활용률이 높다.

  • 단점
    -> 할당 과정에 많은 시간이 소요된다.
    -> 가용 공간이 정렬되어 있지 않으면 전체를 검색해야한다.
    -> 가용 공간 반복 정렬이 필요하다.

🌱최악적합방법

  • 들어갈 수 있는 가장 큰 공간에 할당한다.

  • 장점
    -> 최적 적합보다 공간 활용률이 높다.

  • 단점
    -> 할당 과정에 많은 시간이 소요된다.
    -> 가용 곤간이 정렬되어 있지 않으면 전체를 검색해야 한다.
    -> 가용 공간 반복 정렬이 필요하다.

정답

20K공백
17K공백
32K공백

정답

40K
20K

🌱가변 분할에서 외부 단편화를 해결하는 법

  1. 인접한 빈메모리를 통합한다.

  2. 메모리를 압축한다. (조각모음)

정답

외부 단편화를 해결하기 위한 방법 중 메모리를 압축하는 방법이다.

  • 메모리 압축의 단점
    -> 압축하는 동안 시스템은 모든 일을 중지해야 한다.
    -> 대화형 프로세스는 응답시간이 증가한다.
    -> 실시간 시스템은 심각한 문제가 발생한다.
    -> 프로그램을 적재할 때 재배치 관련 정보를 보관해야 한다.
    -> 시스템 자원의 소모가 크다.

🌱성능 향상을 위한 결정 사항

  • 고정 분할일 경우 영역별 큐 / 통합 큐 둘중에 하나를 선택해야 한다.

  • 고정 분할일 경우 분할 영역의 크기와 개수
    -> 시스템 부하 분석이 필요하다
    -> 개수는 다중 프로그래밍의 정도이다.
    -> 영역의 크기에 따라 시스템 전체의 효율이 다르다.

  • 가변 분할일 경우 메모리 압축 시기 혹은 주기


🌻다중 프로그래밍 환경의 버디 시스템

  • 큰 공간을 반복적으로 이등분하여 공간들을 만들며, 가능할 때마다 인접한 빈 공간들을 합치는 과정을 반복한다.
    -> 고정 분할 방식처럼 구역이 생기고 내부 단편화가 발생한다.
    -> 가변 분할 방식처럼 유동적인 메모리 분할이 가능하다.

  • 이등분 시 서로를 버디라고 한다.


🌞페이징(불연속 메모리 할당)

🌻 페이징의 개념

  • 프로세스의 가상 메모리를 동일한 사이즈의 페이지 단위로 나누어 물리적 메모리에 불연속적으로 저장하는 방식이다.

정답

6번

🌱페이징 시스템에서 프로그램 실행준비

  • 프로세스 가상 메모리에 페이지 번호를 부여한다.
  • 프로세스를 적재할 빈 프레임 위치를 파악한다.
  • 프로세스의 페이지를 빈 프레임에 적재한다.

🌱페이징의 특징

  • 빈 프레임에 어떤 페이지든 적재할 수 있음
  • 외부 단편화가 없음
  • OS의 페이지 관리 부담이 크다.
  • 내부 단편화가 발생한다.

정답

페이지의 크기는 2^12
가상 주소 공간의 크기는 2^18

페이지 개수는 2^6
가상 메모리 비트수는 18개
6비트, 12비트

정답

1, 0
1, 3
2, 0
10,3
0, 256


🌻페이징 시스템의 하드웨어 구조와 원리

정답

1KB
2^6
64KB

정답

4B
4개
2+2 = 4b
16B
4B
8개
3+2 = 5b
32B

정답

8B
8개
64B
8B
8개
64B

정답

2^12B
2^20개
2^32B
2^12B
2^20개
2^32B

정답

13
15
64개

정답

26
2^10
22
2^16
23


🌻다단계 페이징 시스템의 구조와 원리

🌱페이징 시스템의 문제점

  • 가상 메모리의 크기가 매우 커지는 추세에 있으므로 논리적 비트 수도 커진다.
  • 논리적 비트 수가 많으면 페이지 테이블의 크기가 증가한다.
  • 너무 큰 페이지 테이블을 연속된 메모리 공간에 올리는 것이 부담스럽다.

🌱다단계 페이징 시스템

  • 페이지 테이블이 계층적 구조를 가지는 페이징 시스템이다.
  • 페이지 테이블을 작게 쪼개는 효과가 있다.
  • 페이지 테이블들 중 일부만 메모리에 적재가 가능하다.
  • outer page table, page of page table로 구성됨

🌻페이지 테이블의 구현

  • 페이지 테이블 구현은 메모리 액세스 성능을 좌우한다.

  • 페이지 테이블의 구현 방법
    -> 페이지 테이블 전용 레지스터들
    -> 직접매핑 : 페이지 테이블을 메모리에 적재한다.
    -> 연관매핑 : 페이지 테이블을 연관 기억장치에 적재한다.
    -> 연관.직접 결합 매핑 : 페이지 테이블의 일부는 연관 기억장치, 나머지는 메모리에 적재

  • 페이지 테이블 전용 레지스터들
    -> 매우 빠른 주소 변환 가능
    -> 페이지 테이블 항목이 적어야 한다.
    -> 대부분의 컴퓨터에서 불가능하다.

  • 직접매핑
    -> 페이지 테이블을 메모리에 적재
    -> 페이지 테이블 기준 주소는 PCB에 저장
    -> 페이지 테이블 기준 레지스터를 사용한다.
    -> 메모리 액세스 시간문제
    -> 프로세스 메모리 위치에 액세스할 때 항상 두번씩 액세스

  • 연관매핑
    -> 페이지 테이블을 연관 기억장치에 적재
    -> 페이지 번호를 연관 기억장치의 모든 키와 동시에 비교하여 해당 프레임 값 추출
    -> 장점 : 매우 빠르게 검색 가능
    -> 단점 : 하드웨어가 비쌈 : 모든 프로세스의 페이지 테이블 항목을 저장할 만큼 크기가 충분한 연관기억장치를 갖추기 곤란하다.

정답

연관 매핑
직접 매핑

  • 연관직접결합매핑
    -> 페이지 테이블은 메모리에 저장
    -> 최근에 사용한 페이지만 기억장치에 저장
    -> 연관 기억장치에 해당 페이지가 없을 때만 직접 매핑한다.
    -> 지역성을 활용한다.
    -> 프로세스가 메모리를 균일하게 액세스하지 않고 집중적으로 액세스한다.
    -> 유효 접근 시간의 예
    -> 적중률 : 페이지 번호를 연관레지스터에서 발견하는 비율
    -> 적중률이 80퍼일때 (0.8800)+(0.21550)=950나노초

  • TLB (Translation Look-aside Buffer)
    -> 변환 우선참조 버퍼
    -> 페이지 테이브릐 캐시
    -> 최근에 일어난 논리적 주소와 물리적 주소의 변환 테이블을 저장
    -> 가상 주소가 주어지면 프로세서는 먼저 변환 우선참조 버퍼를 조사하여 페이지p를 찾는다.
    원하는 페이지 테이블의 항목이 있으면 프레임 번호 PFN을 조사하여 메모리 주소를 추출한다.
    없으면 프로세서는 페이지 번호를 사용하여 페이지 테이블을 조사한다.
    이떄 원하는 항목이 있다면 해당 페이지는 메인메모리에 적재되어 있으므로 변환 우선참조 버퍼를
    갱신하여 메모리 주소를 추출한다.

정답

400ns
2000.75 + 4000.25 = 150+100 = 250


🌻공유페이지

  • 여러 프로세스가 공통적으로 사용하는 페이지이다.
    -> 공통 코드나 라이브러리 코드에 적용한다.
    -> 여러 프로세스가 동시에 수행 가능하다.
    -> 읽기 가능 수정 불가
    -> 재진입 코드 또는 순수 코드

정답

공유페이지는 같은 프로세스가 달라도 같은 프레임 번호를 가진다.

불연속 메모리 할당 에서만 이러한 메모리 공유가 가능하다. 연속메모리에서는 못한다.


🌻페이징에서 보호

페이지 테이블의 유효 비트

  • Invalid인 페이지는 디스크에 있다.
  • valid인 페이지는 메모리에 있다.

페이지 테이블의 접근 제어 비트

  • vrwe (유효비트, 리드, 라이트, 실행)

참조비트

  • 가상메모리에서 메모리에서 프레임을 쫓아 낼 때 사용한다.
  • 최근에 참조를 한적이 있으면 다시 참조 할 가능성이 있다.

수정비트

  • 수정비트는 고쳐진 녀석이라면 내쫓을 때, 디스크에 copy를 하고 나서 내쫓아야 한다. 이 비트가 0이라면 copy를 안하고 바로 버려버리면 된다.


PTLR - 논리적 주소 공간 밖의 주소 사용 금지
페이지 테이블의 유효 비트 - 페이지의 주기억장치 적재여부
페이지 테이블의 접근제어 비트 - 권한 있는 프로세스만 페이지 읽기, 쓰기, 실행

🌞세그먼테이션

  • 프로그램(사용자) 관점을 지원하는 메모리 관리 체계

  • 프로세스 주소 공간을 세그먼트로 나누어 불연속적으로 할당
    -> 컴파일러가 프로그램을 실행파일로 변환하면서 세그먼트들로 구성

  • 가변 분할 방법으로 할당
    -> 세그먼트 크기가 다르다.

  • 세그먼트는 논리적 단위이다.

  • 프로그램은 세그먼트의 집합이다
    -> 메인프로그램
    -> 함수, 프로시저, 모듈
    -> 스택
    -> 전역변수

  • 세그먼테이션 테이블은 limit와 base로 구성됨

🌱 페이징과 세그먼테이션의 비교

  1. 프로세스가 cpu 위에 올라 올 때, 페이징은 별다른 처리가 없지만, 세그먼테이션은 구분을 짓는 논리저 단위를 만든다.
  2. 논리적 주소 공간이 여러개 vs 한개
  3. 실제 메모리의 미리 금을 긋는 것과 아닌 것
  4. 페이징은 같은 크기 세그먼테이션은 다른 크기로 프로세스의 논리적 공간이 나뉘어져 있다.
  5. 세그먼테이션은 논리적 단위이다. 페이징은 그냥 크기로 단순하게 잘라 놓은 것이다.
  6. 페이징은 테이블에 프레임 번호만 있으면 된다면 세그먼트는 base와 limit 두개가 필요하다.

정답

4400
6600


🌻세그먼트 공유

  • 여러 프로세스가 공통적으로 사용하는 세그먼트의 공유

  • 적절한 보호 체계가 필요하다

  • 페이지 공유보다 단순하다.

  • 페이징보다 세그먼테이션에서의 보호와 공유는 더 효율적이다.

  • 보호에서는 세그먼테이션 역시 rwx 비트를 테이블에 추가하는데, 세그먼테이션은 논리적으로 나누기 때문에 해당 비트를 설정하기 매우 간단하고 안전하다.

  • 페이징은 code+data+stack 영역이 있을 때 이를 일정한 크기로 나누므로 두가지 영역이 섞일 수가 있다.

  • 그러면 비트를 설정하기가 매우 까다롭다.

  • 공유에서도 마찬가지이다.

  • 페이징에서는 한 페이지가 code 영역 외에 다른 영역도 포함할 확률이 높다.

  • 하지만 세그먼테이션은 정확히 code 영역만 나누기 때문에 효율적으로 공유를 수행 할 수 있다.


🌻페이징과 세그먼테이션 비교

🌱세그먼테이션의 장점

  • 내부단편화가 없음
  • 보호와 공유가 효율적이다
  • 전체 프로그램을 연속된 공간에 할당하는 것 보다 세그먼트 대치/할당이 쉬움
  • 일반적으로 페이지 테이블 보다 세그먼트 테이블의 크기가 작다

🌱세그먼테이션의 단점

  • 외부단편화
  • 메모리 할당 시 동일 크기 가용 공간을 찾는 것보다 비효율적이다.
  • 스와핑시 비효율적이다.

정답

Segmentation Fault
Segmentation Fault

2번


🌻페이지화된 세그먼테이션

  • 세그먼테이션을 하되 각 세그먼트를 페이지 단위로 쪼개어 저장한다.
    -> 외부 단편화 문제를 제거하면서 할당 과정을 쉽게 해결한다.

  • 페이징과 세그먼테이션의 장점을 취합했다
    -> 페이징은 할당 과정이 단순하고 메모리를 효율적으로 사용한다.
    -> 세그먼테이션은 공유와 보호를 편리하게 한다.

profile
학습한 내용을 담은 블로그 입니다.

0개의 댓글

관련 채용 정보