콘텐츠로 이동

07. The Abstraction Address Space

메모리 관점의 시스템 발전사

초기 컴퓨터 시스템

초기에는 고려하지 않았던 목표들

  • 사용 편의
  • 고성능
  • 신뢰성

초기에 비해 컴퓨터 사용이 증가하고, 다양한 사용자가 사용하면서 중요도 상승

초기 메모리 구조

  • 운영체제가 사용하는 양을 제외한 나머지 영역은 실행 중인 프로그램 하나의 영역

Untitled

  • 가상화 개념은 거의 존재하지 않았음

멀티 프로그래밍

multi-programming

  • 여러 프로세스가 실행 준비 상태
  • 운영체제는 프로세스를 전환하며 실행

    입출력 발생 → 입출력 대기 중 다른 프로세스로 전환

    CPU 이용률 증가

  • 이전에 배웠던 공정성 위주의 프로세서 스케줄링(라운드 로빈 등)과 관련

시스템의 가격이 (현대에 비해 상대적으로 더) 고가였으므로 이러한 형태의 효율성 개선이 필요

시분할

time-sharing

배경

컴퓨터 사용 증가, 다수가 일괄처리방식 컴퓨팅에 한계를 경험.

여러 사람이 동시에 컴퓨터를 사용, 현재 실행 중인 작업의 즉각적인 응답을 원해 대화식 이용(interacitivity) 개념이 중요하게 되었다.

컴퓨터 프로그램 흐름에 따라 순차적으로 자료를 처리하는 방식

이전에 학습한 스케줄러 중 순차적으로 일을 처리하는 스케줄링 방식이 이와 연관

간단 구현 방법

  • 모든 메모리 접근 권한 부여
  • 중단 시 모든 상태를 디스크 장치에 저장(모든 물리 메모리 포함)
  • 중단 시 저장이 완료되면 다른 프로세스의 상태를 탑재하여 동일 과정 반복
  • 느리며, 메모리가 커질수록 느리다

    레지스터 상태 저장 복원과 달리 메모리의 내용 전체를 디스크에 저장하는 작업이 느리므로

과제

  • 프로세스를 메모리에 그대로 유지하면서, 운영체제가 시분할 시스템을 효율적으로 구현하는 방식이 필요
  • 한 프로세스가 다른 프로세스의 메모리를 읽거나 쓸 수 있는 상황을 방지할 보호(protection) 기능 필요

주소 공간

address space

실행 중인 프로그램이 가정하는 메모리의 모습. 임의의 물리 주소에 탑재되지만 실행 중인 프로그램에게는 전용 물리 메모리를 소유한 것처럼 제공한다는 개념(abstraction).

운영체제가 메모리를 가상화하는 방법에 대한 핵심

한 프로세스가 다른 프로세스의 메모리를 읽거나 쓸 수 있는 상황을 방지코자, 사용하기 쉬운(easy-to-use) 메모리 개념이 필요하여 생긴 개념. 악의적으로 메모리를 제어하려는 사용자 프로그램 뿐 아니라, 실수로 다른 프로세스의 메모리를 읽고 쓰는 상황도 방지하기 위해서

주소공간의 구성

32비트 주소라고 가정했을 때, 가상으로 프로세스에 주어지는 공간은 “보통” 4GB이다.

공간의 구분

프로세스마다 주어지는 가상 공간이지만, 커널 공간(kernel space)과 사용자 공간(user space)으로 나뉜다. 단, 주소 공간의 구성으로서 이야기하는 코드(text), 데이터(data), 스택 등은 보통 사용자 공간에 있는 것을 지칭.

  • 커널 공간 (32비트 주소라고 가정 시 대략 1GB, 커널 스택)
  • 사용자 공간 (32비트 주소라고 가정 시 대략 3GB, 유저 스택)
  • 이전에 학습했던 내용 중 03. Mechanism - Limited Direct Execution 의 문맥 교환 — 커널 스택에 대한 내용과 같음

코드(code, text)

프로그램의 명령어, 코드. 반드시 메모리에 위치하므로 주소 공간에도 존재.

스택(stack)

함수 호출 체인 상의 현재 위치, 지역 변수, 함수 인자와 반환 값 등 저장

자기 자신을 반환하면서 다른 함수를 지속적으로 호출하는 릴레이 방식의 프로그래밍 패턴

메서드 체인(Method Chaining)

힙(heap)

동적으로 할당되는 메모리

기타

정적으로 초기화된 변수, 전역 변수 등. KAIST 영상에서는 프로그램 코드와 힙 사이에 위치하며 데이터(data)라고 표기하였음.

주소공간 활용의 관례

Untitled 1

주소 공간에 여러 스레드가 공존할 때는 이 방식으로 주소 공간을 나누면 동작하지 않으며,
관례일 뿐이므로 다르게 구현하는 것도 가능하다.

메모리 관점의 프로그램

프로세스 구성

프로세스는 고립된 단위(unit of isolation)를 말하며 Pintos 기준으로 다음과 같이 구성되어 있다.

  • 페이지 테이블 (page table)
  • 커널 스택 (커널 공간, kernel stack)
  • 실행 상태 (run state)
    • sleep, running, ready, dying …

스레드 구성

스레드는 실행 단위(unit of execution)를 말하며,

  • 레지스터
  • 스택(유저 스택)
    • 지역 변수
    • 함수 호출 반환 주소 (function call return address)

으로 구성되어 있다.

메모리 가상화

운영체제는 프로그램에 실제 물리적으로 사용 중인 주소 대신 가상 주소(virtual address)를 제공한다.

이 가상 주소를 프로그램이 읽었을 때, 운영체제는 물리 주소 내 해당 프로그램용으로 제공한 공간에 접근할 수 있도록 보장해야 한다.

목표

투명성(transparency)

실행 중인 프로그램이

  • 가상 메모리의 존재를 인지하지 못하도록 시스템 구현
  • 자신이 전용 물리 메모리를 소유한 것처럼 행동하도록

많은 작업이 메모리를 공유할 수 있도록 하는 작업은 운영체제와 하드웨어가 모두 담당한다.

효율성(efficiency)

  • 시간과 공간 측면에서 효율적

    • 시간적 — 프로그램이 너무 느리게 실행되어선 안된다.

      → TLB 등 하드웨어 지원을 받아 구현

      가상 메모리를 물리적 주소로 변환 시 속도 향상을 위해 사용하는 캐시. 칩의 메모리 관리부(MMU, Memory Management Unit) 일부

      최근 발생한 가상 주소와 물리 주소간 변환 테이블을 저장하고, 이후 가상 주소로부터 물리 주소를 불러올 때 가장 먼저 참조하게 된다.

      정확히는 페이지 테이블 혹은 세그멘트 테이블 항목 중 일부를 저장한다.

      • 페이지 테이블의 각 항목 — 가상 주소와 그에 해당하는 물리 주소
      • 세그멘트 테이블의 각 항목 — 가상 주소와 그에 해당하는 세그멘트 주소
      • 페이지와 세그먼트의 차이

        공통: 프로세스 주소 공간을 작은 단위로 쪼갤 때 방식

        페이지: 고정된 크기로 나눈다.

        세그먼트: 가변 크기로 나눈다.

    • 공간적 — 가상화 지원을 위해 너무 많은 메모리를 사용해선 안된다.

보호(protection)

운영체제는

  • 프로세스를 다른 프로세스로부터 보호
  • 자신도 프로세스로부터 보호

프로세스 탑재, 저장, 명령어 반입 등 실행 시 어떤 방법으로도 다른 프로세스, 운영체제의 메모리 내용에 접근하거나 영향을 줄 수 없어야 한다.
= 고립(isolate)시켜야 한다.


마지막 업데이트 : 2025년 4월 23일
작성일 : 2023년 4월 2일