[CS 기초] 운영체제와 정보기술

Sohyeon Bak·2022년 9월 20일
0

개발 책

목록 보기
16/18
post-thumbnail

07. 메모리 관리

메모리 주소: 이진수(32비트/64비트 주소체계)
byte 단위로 메모리 주소 부여해준다.

주소 바인딩

논리적주소

: 프로그램이 실행을 위해 메모리에 적재되면 그 프로세스를 위한 독자적인 공간이 생긴다.
CPU는 프로세스마다 이 논리적 주소에 근거해 명령을 실행한다.

물리적주소

: 실제로 올라가 있는 위치

  • 프로세스는 물리적 메모리에 올라가 있어야 함
  • CPU가 명령어를 실행하기 위해 논리적 주소 참조
  • 논리적 주소는 물리적 메모리의 어느 위치에 맵핑되어 있는지 확인 필요
    주소 바인딩

주소 바인딩

컴파일 타임 바인딩

: 물리적 메모리 주소가 프로그램을 컴파일 할 때 결정되는 주소 바인딩 방식

  • 컴파일 시점에 물리적 메모리 주소 결정
  • 절대 주소로 적재된다는 뜻으로 적재코드를 생성하는 바인딩 방식

로드타임 바인딩

: 프로그램의 실행이 시작 될 때 물리적 메모리 주소가 결정

  • 사용자 프로그램을 메모리에 적재시키는 프로그램
    • 로더의 책임하에 물리적 메모리가 부여되고, 프로그램이 종료될 때까지 위치를 고정한다.
    • 컴파일러 재배치 가능 코드를 생성한 경우 가능한 주소 바인딩 방식

실행시간 바인딩

: 프로그램이 실행을 시작한 후 위치한 물리적 메모리 주소가 변경되는 방식

  • 주소맵핑 테이블로 바인딩 점검
  • 필요요건
    • 기준레지스터
    • 한계레지스터
    • MMU(Memory Management Unit: 메모리 관리 유닛)

MMU 기법
: 주소값에 기준레지스터 값을 더해 물리적 주소를 얻어냄
(여기서 기준 레지스터는 재배치 레지스터로 물리적 주소를 가짐)

  • 다중 프로그래밍 환경
    : 물리적 메모리 안에 여러 프로세스가 올라올 경우 MMU 방식으로 주소변환을 하면 CPU가 요청한 논리적 주소와 재배치 레지스터 값을 더한 결과가 주소공간을 벗어날 수 있다.
    → 이런 문제를 해결하기 위해 한계 레지스터를 사용
  • 한계 레지스터
    : 프로세스가 자신의 공간을 넘어 참조하는지 체크
    현재 CPU에서 수행중인 프로세스의 논리적 주소의 최대 값을 담고 있다.

메모리 관리와 관련 용어

동적로딩

: 다중 프로그래밍 환경에서 메모리 사용의 효율을 높이기 위해 사용하는 기법

  • 해당 부분 안 메모리에 적재
  • 동적 로딩 기법은 사용되지 않는 많은 코드가 올라가는 것을 막아 효율적으로 사용할 수 있다.

동적 연결

연결
프로그래머가 작성한 코드를 컴하일한 목적 파일, 이미 컴파일 라이브러리 파일을 묶어 하나의 실행 파일을 생성하는 과정

: 목적 파일과 라이브러리 파일 사이 연결 프로그램 실행 시점까지 지연시키는 기법

  • 라이브러리 실행 시점에 연결
  • 실행 파일에 라이브러리 코드 포함하지 않음
  • 프로그램 실행 후 라이브러리 함수 호출할 때 연결이 이뤄짐
    • 스텁 : 라이브러리 호출 시 위치를 찾기 위한 코드
      → 스텁을 통해 라이브러리가 메모리에 있는지 확인

중첩(≒ 동적로딩, 그러나 사용 이유가 다름)

: 프로세스의 주소공간을 분할해 실제 필요한 부분만 메모리에 적재

  • 프로그램 크기가 메모리보다 작다면 한꺼번에 올리지만 크다면 분할해 올림
  • 단일 프로세스만 메모리에 올려 놓는 환경에서 메모리보다 큰 프로세스를 실행하기 위한 방법

스와핑

: 메모리에 올라온 프로세스의 주소 공간 전체를 디스크 스왑영역에 일시적으로 내려 놓는것

백킹스토어
디스크 내에 파일 시스템과 별도로 존재하는 영역

  • 프로세스가 수행 중인 동안에만 디스크에 일시적으로 저장하는 공간으로 저장 기간이 상대적으로 짧다.
  • 특정한 이유로 수행 중인 프로세스의 주소 공간을 일시적으로 메모리에서 디스크로 내려 놓는것
  • 스와핑 방향에 따라 스왑인 (디스크→메모리), 스왑아웃(메모리→디스크)

스와핑 과정

  • 스와퍼(동기 스케줄러)로 스왑 아웃 시킬 프로세스 선정
  • 선정된 프로세스는 메모리에 올라간 주소 공간을 통때로 리스크 스왑 영역에 스왑 아웃
    → 메모리에 존재하는 프로세스 수 조절이 중요
  • 메모리에 프로그램이 충분히 실행되면 사용중이던 프로그램을 메모미에서 내쫒고 스왑 아웃된 프로그램을 다시 올림
    • 컴파일, 로드 타임 바인딩은 스왑아웃 후 인 될 때 나왔던 자리로 들어가나 실시간 바인딩은 빈 메모리 영역 아무곳으로 들어간다.

물리적 메모리의 할당 방식

  • 운영체제 상주 영역
    : 인터럽트 백터 와 함께 메모리의 낮은 주소 영역에 사용되고 커널에 위치한다.
  • 사용자 프로세스 영역
    : 물리적 메모리 높은 주소 영역에 사용되고 사용자 프로세스가 이곳에 적재된다.

사용자 프로세스 영역의 관리 방법

연속 할당

: 물리적 메모리의 연속적 공간에 올리는 방식
→ 하나의 분할, 하나의 프로세스에 적재

  • 고정 분할
    : 물리적 메모리 주소를 주어진 개수 만큼 영구적으로 분할해 하나의 프로세스를 적재해 실행
    ⎼ 동시에 올릴 수 있는 수 고정
    ⎼ 최대 크기 제한

    • 외부조각 : 프로그램의 크기보다 분할 크기가 작은 경우 분할이 비었음에도 적재가 안되는 경우
      ⎼ 특정 프로그램에 배당된 공간 X
    • 내부조각 : 프로그램 크기보다 분할 크기가 큰 경우 프로그램을 적재 후 남는 메모리 공간에 실행
  • 가변분할
    : 분할 크기, 개수가 동적으로 변하는 것

    컴팩션(외부조각 문제 해결방법)
    : 물리적 메모리 중 사용 중인 메모리 영역을 한 쪽으로 몰고 가용공간을 다른 쪽으로 모아 큰 가용 공간을 만드는 방법
    → 비용이 큼

    • 동적 메모리 할당 문제
      : 프로세스를 메모리에 올릴 때 가용공간 중 어떤 공간에 올릴지 결정할 문제
      • 최초적합 방법
        : 크기가 n이상인 가용공간 중 가장 먼저 찾은 곳에 할당하는 방법
      • 최적적합 방법
        : 크기가 n이상인 가장 작은 가용공간을 찾아 새로운 프로세스를 할당
      • 최악적합 방법
        : 가장 크기가 큰 곳에 새로운 프로그램 할당

불연속할당 기법

: 하나의 프로세스가 물리적 메모리의 여러 위치에 분산되어 올라갈 수 있는 메모리 할당 기법

  • 페이징 기법
  • 세그먼테이션 기법
  • 페이지드 세그먼테이션 기법

페이징 기법

: 프로세스의 주소 공간을 동일한 크기의 페이지 단위로 나누어 물리적 메모리의 서로 다른 위치에 페이지들을 저장하는 방식

  • 물리적 메모리를 페이지와 동일한 크기의 프레임으로 미리 나누어 둔다.
    → 메모리에 올리는 단위가 동일한 크기의 페이지 단위이므로 미리 분할을 하더라도 빈 프레임이 있으면 어떤 위치든 사용할 수 있어서 동적 메모리 할당 문제가 발생하지 않는다.

주소 변환 기법

: CPU가 사용하는 논리적 주소를 페이지 번호페이지 오프셋으로 나누어 주소 변환에 사용한다.
페이지 번호는 페이지 테이블 접근 시 인덱스로 사용되고, 인덱스 항목에는 그 페이지 의 물리적 메모리상의 기준 주소 시작 위치가 저장된다.

페이지 테이블의 구현

  • 자료구조
  • 물리적 메모리에 위치
  • 실행 중인 프로세스의 페이지 테이블에 접근 하기 위해 레지스터를 사용
    • 페이지 테이블 기준 레지스터
      : 페이지 테이블의 시작 위치를 가르킴
    • 페이지 테이블 길이 레지스터
      : 페이지 테이블의 크기 보관
  • 메모리 접근 연산 - 2번 필요
    • 주소 변환을 위해 접근
    • 변환된 주소에서 실제 데이터에 접근
      → 메모리에 접근하기 위해 두번의 접근은 오버헤드를 발생시켜 이 오버헤드를 줄이고 메모리 접근 속도를 향상시키기 위해 TLB(Translation Look-aside Buffer)

TLB(Translation Look-aside Buffer)
: 고속의 주소 변환용 하드웨어 캐시 사용

  • 가격이 비싸기 때문에 빈번히 참조되는 페이지에 대한 주소 변환 정보만 담는다.
  • 요청된 페이지 번호가 TLB 내에 없다면 프레임 번호를 알아야한다.
  • 프로세스 별로 주소 변환 정보는 다르기 때문에 문맥교환 시 TLB 내용을 모두 지워야 한다.
  • 페이지 테이블과 TLB에 저장된 정보 구조 차이
    • 페이지 테이블 : 주소 변환 정보가 페이지 번호에 따라 순차적으로 들어가 있다.
    • TLB : 모든 페이지에 대한 정보가 없기 때문에 페이지 번호와 이에 대응하는 프레임 번호가 쌍으로 저장
      • 주소 변환 정보를 찾기 위해 TLB를 모두 확인해야하는 오버헤드를 줄이기 위해 병렬탐색이 가능한 연관 레지스터 사용

계층적 페이징

: 현대 컴퓨터는 주소공간이 큰 프로그램을 지원한다.
수행 중인 프로세스 수가 증가해 전체 메모리의 상당 부분이 주소 변환을 위한 페이지 테이블에 할애되어 실제 사용가능한 메모리 공간이 줄어든다.
이러한 메모리 공간 낭비를 줄이기 위해 2단계 페이징 기법을 사용

2단계 페이징 기법

  • 외부 페이지 테이블 : 사용되지 않는 주소 공간에 대해서 외부 페이지 테이블 항목을 Null로 설정
  • 내부 페이지 테이블
    → 페이지 테이블을 위해 사용되는 메모리 공간을 줄여 공간적인 이득이 있으나 주소 변환을 위한 페이지 테이블 수가 증가하게 됨

프로세스의 주소 공간이 커질 수록 페이지 테이블의 크기도 커져 다단계 페이지 테이블이 필요하다. 다단계 페이지 테이블로 메모리 공간의 소모는 줄일 수 있으나 메모리 접근시간이 늘어나는 문제가 발생한다. 이때 TLB를 함께 사용해 시간적인 효율성을 얻을 수 있다.

역페이지 테이블

: 물리적 메모리의 페이지 프레임 하나당 페이지 테이블에 하나씩의 항목을 두는 방식.
→ 논리적 주소에 대한 페이지 테이블을 만드는 것이 아닌 물리적 주소에 대한 페이지 테이블을 만드는 것

  • 물리적 주소로부터 논리적 주소를 얻기 수월한 구조
    → 주소변환은 비효율적으로 진행
    1. 주소 변환 요청
    2. 주소를 담은 페이지가 물리적 메모리에 존재하는지 여부 판단을 위해 모두 탐색
  • 연관 레지스터에 보관해 테이블 전체 항목에 대해 병렬탐색으로 시간적 효율성

공유 페이지

공유코드 (재진입 가능 코드, 순수 코드)

: 메모리 공간의 효율적인 사용을 위해 여러 프로세스에 의해 공통으로 사용되도록 작성한 코드

공유 페이지

: 공유 코드를 담고 있는 페이지

  • 물리적 메모리에 하나만 적재되 메모리를 더 효율적으로 사용

사유 페이지

: 프로세스들이 공유하지 않고 프로세스별로 독자적으로 사용하는 페이지

  • 논리적 주소 공간 중 어떠한 위치에 있어도 무방

메모리 보호

  • 보호 비트
    : 각 페이지에 대한 접근 권한 내용을 담고 있음
    • '누구'에 해당하는 접근 권한 설정 필요 없음
    • '어떠한' 접근을 허용하는지의 정보가 저장
  • 유효-무효 비트
    : 해당 페이지의 내용이 유효한지에 대한 내용을 담고 있음
    • 유효 : 해당 메모리 프레임에 그 페이지가 존재함 - 접근 허용
    • 무효 : 프로세스가 그 주소 부분을 사용하지 않거나 해당 페이지가 물리적 메모리에 올라와 있지 않고 백킹스토어에 존재 - 접근 권한 없음

세그먼테이션

하나의 프로세스를 구성하는 주소 공간은 코드, 데이터, 스택 등 의미있는 단위로 구성

세그먼트

: 주소 공간을 기능 단위 또는 의미 단위로 나눈 것

  • 코드, 데이터, 스택 등 기능 단위로 세그먼트 정의
  • 의미를 가질 수 있는 논리적인 단위로 나눠 크기가 균일하지 않다.
  • 의미 단위의 세그먼트로 나누어 관리해 크기가 균일하지 않은 세그먼트들을 메모리에 적재하는 부가적인 관리 오버헤드가 필요
  • 세그먼트 번호
    : 논리적 주소가 프로세스 주소 공간에서 몇번째 속하는지 나타냄
  • 오프셋
    : 세그먼트 내에서 얼마만큼 떨어져 있는지에 대한 정보
  • 세그먼트 테이블
    • 기준점 : 물리적 메모리에서 시작 위치
    • 한계점 : 세그먼트 길이
  • 주소 변환
    • 세그먼트 테이블 기준 레지스터
    • 세그먼트 테이블 길이 레지스터

세그먼테이션 기법

논리적 주소를 물리적 주소로 변환하기 전 확인 사항
1. 요청된 세그먼트 번호가 STLR에 저장된 값보다 작은 값인지
2. 논리적 주소의 오프셋값이 그 세그먼트 길이보다 작은 값인지

공유 세그먼트

: 공유하는 모든 프로세스의 주소공간에서 동일한 논리적 주소에 위치

  • 공유와 보안 측면에서 페이징 기법에 훨씬 효과적
  • 가용공간 할당 방식에는 최초적합과 최적적합 방식이 있다.

페이지드 세그먼테이션

: 반드시 동일한 크기 페이지들의 집합으로 구성, 물리적 메모리에 적재하는 단위는 페이지 단위

  • 논리적 주소를 물리적 주소 변환 과정
    1. 논리적 주소의 상위 비트인 세그먼트 번호를 통해 세그먼트 테이블의 해당 항목에 접근
      • 세그먼트 길이와 페이지 테이블 시작 주소가 있다.
    2. 세그먼트 길이 값과 하위 비트인 오프셋 값을 비교
    3. 세그먼트 테이블의 항목을 통해 세그먼트를 위한 페이지 테이블로 얻은 시작 위치로 페이지 번호만큼 떨어진 페이지 테이블 항목을 찾아 페이지 프레임 위치를 얻는다.
    4. 떨어진 위치에 있는 곳이 물리적 메모리 주소가 된다
profile
정리하고 기억하는 곳

0개의 댓글