[OS] 주소 공간의 개념

장선규·2023년 7월 2일
0

[OS] OSTEP Study

목록 보기
8/28

주소 공간의 개념

초기에는 컴퓨터 시스템을 구현하는 것이 쉬웠다.
사용자가 많은 것을 기대하지 않았기 때문이다.
하지만 이후 "사용자 편이", "고성능", "신뢰성" 등을 기대한 사용자들이 등장하였고, 그때부터 시스템을 구축하는 것이 복잡해졌다.

1. 초기 시스템

메모리 관점에서 초기 컴퓨터는 비교적 단순하게 구성되어있다.

  • 운영체제는 원래 물리주소 0부터 64KB 까지의 메모리에 상주하는 루틴(라이브러리)의 집합이었음
  • 물리 메모리에 하나의 실행중인 프로그램(프로세스)가 존재
  • 특별한 가상화는 거의 존재하지 않았음

2. 멀티프로그래밍과 시분할

컴퓨터가 고가 장비였기 때문에, 컴퓨터 자원을 효과적으로 공유해야했음.

  • 멀티프로그래밍 시대
    • 여러 프로세스가 실행 준비 상태에 있고, 운영체제는 이들을 전환하면서 실행
    • 이러한 전환은 CPU의 이용률을 증가시킴
    • 효율성 개선이 중요한 과제였음

컴퓨터를 더 많이 사용하고 싶은 수요 증가

  • 시분할(time-sharing) 시대
    • 하나의 프로세스를 짧은 시간동안 실행시키고 전환
    • 일괄처리방식 컴퓨팅의 한계를 인식하여 등장
    • 많은 사용자가 동시에 컴퓨터를 사용하고, 현재 실행중인 작업으로부터 즉시 응답을 원하기 때문에 대화식 이용(interactivity)의 개념이 중요해짐
    • 과거의 시분할 방식은, 프로세스 전환 시점의 모든 상태를 디스크 종류의 장치에 저장했음 -> 매우 느림
    • 따라서 프로세스 전환 시 프로세스를 메모리에 그대로 유지하면서 효율적으로 시분할하는 운영체제 시스템 필요
      • 운영체제가 한 프로세스(예를 들어 A)를 선택하면, 다른 프로세스들(B,C)은 준비 큐에서 실행을 기다림
      • 시분할 시스템이 대중화되면서 보호라는 요구사항이 부과됨
      • 여러 프로그램이 메모리에 동시에 존재할 때, 프로세스 간의 불필요한 메모리 읽기/쓰기를 막는 수단이 필요

3. 주소공간

여러 프로그램이 메모리에 동시에 존재할 때, 프로세스 간의 불필요한 메모리 읽기/쓰기를 막는 수단이 필요.
또한 운영체제는 사용하기 쉬운 메모리 개념을 만들어야 했고, 그 개념이 바로 주소공간이다.

주소공간(address space)

  • 실행 중인 프로그램이 "가정"하는 메모리의 모습
  • 운영체제가 실행 중인 프로그램에게 제공하는 가상의 개념(abstraction)
    • 실제로 프로그램이 물리주소 0에서 16KB에 존재하는 것이 아님
    • 실제로는 임의의 물리주소에 탑제됨
    • 이를 메모리 가상화(virtualizing memory)라고 함
  • 코드(code, 명령어): 반드시 메모리에 존재해야 하므로 주소공간에 존재
    • 코드는 정적이므로 저장하기 쉬움, 주소공간의 상단에 배치되고 추가 메모리를 필요로 하지 않음
  • 스택(stack): 함수 호출 체인 상의 현재 위치, 지역변수, 함수 인자와 반환 값 등을 저장
    • 프로그램 실행 중에 확장되거나 축소될 수 있음
    • 메모리를 효율적으로 사용하기 위해 힙 영역과 반대되게 배치
      (나중에 쓰레드가 공존할 때 반대되게 해야만 잘 동작)
  • 힙(heap): 동적으로 할당되는 메모리를 위해 사용
    • 프로그램 실행 중에 확장되거나 축소될 수 있음
    • 메모리를 효율적으로 사용하기 위해 스택 영역과 반대되게 배치
      (나중에 쓰레드가 공존할 때 반대되게 해야만 잘 동작)

핵심 질문: 메모리를 어떻게 가상화 하는가
운영체제는 물리 메모리를 공유하는 다수의 프로세스에게 어떻게 해당 프로세스 전용의 주소 공간이라는 개념을 제공할 수 있는가?

메모리 가상화(virtualizing memory)

  • 운영체제가 프로세스에게 물리 메모리를 직접 부여하는 것이 아니라, 가상의 주소공간을 제공하는 것
  • 각각의 프로세스는 자기가 전체 메모리(32비트, 64비트)를 다 가지고 있다고 생각함
    • 프로세스 A의 입장에서 주소 0은 물리주소 320KB
    • 프로세스 B의 입장에서 주소 0은 물리주소 192KB
    • 프로세스 C의 입장에서 주소 0은 물리주소 128KB
    • 각각의 프로세스가 생각하는 주소를 가상주소(virtual address)라고 함
  • 운영체제는 하드웨어 지원을 통해 프로세스가 가상주소를 사용할 때 이를 물리주소로 읽도록 보장해야 함

4. 메모리 가상화의 목표

1) 투명성(transparency)

운영체제는 실행중인 프로그램이 가상 메모리의 존재를 인지하지 못하도록 가상 메모리 시스템을 구현해야 한다.

  • 오히려 프로그램은 자신이 전용 물리 메모리를 소유한 것처럼 행동해야 함
  • 프로그램이 메모리 쓴다? 전부 가상 메모리임
  • 하지만 이를 프로그램이 눈치채선 안 되고, 뒤에서 하드웨어와 운영체제가 프로그램의 가상 메모리 사용을 전부 물리 메모리로 변환

2) 효율성(efficiency)

운영체제는 가상화가 시간과 공간 측면에서 효율적이도록 해야한다.

  • 시간적으로 너무 느리면 안 됨
  • 공간적으로 너무 많은 메모리를 사용해선 안 됨
  • 운영체제는 TLB(Translation Lookaside Buffer) 등의 하드웨어 기능을 포함하여 하드웨어의 지원을 받아야 함 (나중에 배움)

3) 보호(protection)

운영체제는 프로세스를 다른 프로세스로부터 보호해야 하고, 운영체제 자신도 프로세스로부터 보호해야 한다.

  • 프로세스 탑재, 저장, 혹은 명령어 반입 등을 실행할 때 다른 프로세스나 운영체제의 메모리 내용에 접근하거나 영향을 주면 안 됨

  • 자신의 주소 공간 밖의 어느 것도 접근해서 안 됨

  • 프로세스들을 서로 고립(isolate)시켜야함

    고립의 원칙

    두 개체가 서로 적절하게 고립이 된 경우, 한 개체가 실패해도 다른 개체에 영향 X

    메모리 고립 == 프로그램이 운영체제 동작에 영향을 줄 수 없음

profile
코딩연습

0개의 댓글