멀티 프로세서와 스레드 스케줄링

|

Multi-Processor Scheduling


Homogeneous Processor

  • Queue에 한 줄로 세워서 각 프로세서가 알아서 꺼내가게 할 수 있다
  • 반드시 특정 프로세서에서 수행되어야 하는 프로세스가 있는 경우에는 문제가 더 복잡해짐


Load sharing (= Load balancing)

  • 일부 프로세서에 job이 몰리지 않도록 부하를 적절히 공유하는 메커니즘
  • 별개의 큐를 두는 방법 vs 공동 큐를 사용하는 방법


Symmetric Multiprocessing(SMP)

  • 각 프로세서가 각자 알아서 스케줄링


Asymmetric multiprocessing

  • 하나의 프로세서가 시스템 데이터의 접근과 공유를 책임지고 나머지 프로세스는 거기에 따름




Thread Scheduling


Local Scheduling

  • User level thread의 경우 스레드가 속한 프로세스에 의해 스레드의 스케줄링이 결정된다


Global Scheduling

  • Kernel level thread의 경우 커널의 단기 스케줄러가 스케줄링을 결정한다


ref. KOCW

안드로이드 아키텍처

|

Logical layers

  • GUI를 가진 시스템은 4가지의 추상 레이어로 구분된다

User Interface (UI) Layer

Application Layer

Domain Layer

Infrastructure Layer


UI Layer

  • 렌더링을 담당한다
  • UI 요소로 이벤트를 캡처하여 어플리케이션 레이어에 전달한다 (핸들링 x)


Application Layer

  • UI 레이어의 이벤트를 핸들링한다
  • UI 레이어에서 전달받은 이벤트 처리를 위해 도메인 레이어로 전달한다
  • 도메인 레이어에서 전달 받은 결과를 UI 레이어로 전달한다


Domain Layer

  • 비즈니스 로직을 처리한다


Infrastructure Layer

  • 특정 도메인이 아닌 일반적인 기능을 제공한다 (DB, 네트워크 등등)


Presentation Layer

  • UI Layer + Application Layer



MVx

  • Presentation Layer 아키텍처 패턴의 일종 (MVC, MVP, MVVM, etc)
  • View(UI)를 디커플링하는 것이 목표
    • Activity와 Fragment로부터 UI로직을 분리하여 Controller 역활을 하게한다
  • Model
    • 상태, 비즈니스 로직, 자료구조를 의미한다 (구현체에 따라 의미가 달라진다)
  • View
    • User Interface (모든 MVx 구조에서 동일하다)
  • X
    • 상태, 비즈니스 로직, 자료구조를 의미한다 (구현체에 따라 의미가 달라진다)

MVP

img

  • View는 Presenter에게 이벤트를 전달만 하는 역활(수동적)이므로 쉽게 대체 될 수 있어야만 한다

  • View는 재사용할 수 있어야만 한다


UI 로직 특성

  • 디테일하고 정확한 계산이 필요하다
  • 다른 레이어보다 변화가 자주 일어난다
  • 읽을 수 없다??
  • 수동으로 테스트하기 가장 쉽다
  • 자동으로 테스트하기 가장 어렵다


Activity

  • UI 로직 외에 많은 책임을 가진다
    • 라이프사이클, 화면 이동, 런타임 퍼미션, 로더, 프레그먼트, 다이얼로그, DI …
    • Activity 자체만으로는 UI 로직을 분리하는 것이 불가능하다
    • Activity가 View 인터페이스를 상속받고 구현함으로서 분리한다
    • 추후에 별도로 View 인터페이스를 구현한 클래스로 Activity의 UI 로직을 옮긴다
    • 그리고 Acivity에서 View 인터페이스를 구현한 클래스를 사용한다
    • 그러면 Activity의 역활은 MVx의 x가 된다 -> x와 연관된 모든 로직이 Activity에 구현 되어 있다는 걸 의미하지는 않는다
    • 이것이 상속보단 구성을 사용하는 예제가 된다
    • 다른 MVx 아키텍처에서도 각각의 컴포넌트들이 구성이 될 수 있다

UI 레이어와 Application 레이어 중간에 Decoupling 레이어를 둠으로써 두 레이어 사이에 직접적인 의존관계를 끊는다.

UI 레이어에서 Listener를 통해 Application 레이어(Activity)에게 결과를 알린다.

따라서 View는 Activity와 직접적인 의존관계는 가지지 않으며 Listener를 통해 변화를 알린다.

decouplingLayer

가상 메모리

|


‘운영체제와 정보기술의 원리’ 8장을 학습한 내용을 정리한 포스팅입니다


가상 메모리


가상 메모리

​ 운영체제는 프로그램이 자기 자신만이 메모리를 사용하는 것처럼 가정해 프로그램하는 것을 지원한다.

​ 이렇게 되면 프로그램은 0번지부터 시작하는 자기 자신만의 메모리 주소 공간을 가정할 수 있는데 이러한 메모리 공간을 가상 메모리라고 부른다


운영체제는 어떤 식으로 프로세스에게 메모리를 할당 하는가?

  • 모든 프로그램들에게 공평하게 같은 크기의 메모리를 할당하기 보다는 몇몇 프로그램들에게 집중적으로 메모리를 할당한 후 시간이 흐르면 이들에게서 메모리를 회수해서 다른 프로그램들에게 다시 집중적으로 할당하는 방식을 채택한다. 그 이유는 프로세스의 빠른 수행을 위해 프로그램마다 최소한 확보 해야하는 메모리의 크기가 존재하기 때문이다.
  • 프로그램을 실행할 때 당장 수행해야 할 부분만 메모리에 올려놓고 나머지 부분은 스왑 영역에 내려놓고 필요할 때마다 메모리에 올라간 부분만 교체하는 방식을 사용한다
  • 디스크의 스왑 영역이 사용될 수 있으므로 프로그램 입장에서는 물리적 메모리 크기에 대한 제약을 생각할 필요가 없어진다
  • 프로세스의 주소 공간을 메모리로 적재하는 단위에 따라 가상 메모리 기법은 요구 페이징 방식과 요구 세그멘테이션 방식으로 구현될 수 있다


요구 페이징 기법

  • 프로세스를 구성하는 페이지 중에 당장 사용될 페이지만을 메모리에 올리는 방식을 말한다
    • 프로그램이 물리적 메모리의 용량 제약을 벗어날 수 있도록 하는 것이 주된 효용
  • 메모리 사용량 감소, 프로세스 전체를 메모리에 올리는 데 드는 입출력 오버헤드 감소
  • 유효-무효 비트를 두어 각 페이지가 메모리에 존재하는 지를 표시한다.


요구 페이징 기법의 페이지 부재 처리

CPU가 참조하려는 페이지가 현재 메모리에 올라와 있지 않아 유효-무효 비트가 무효로 세팅되어 있는 경우를 우리는 ‘페이지 부재’가 일어 났다고 한다

  • CPU가 무효 페이지에 접근하면, MMU가 페이지 부재 트랩을 발생 -> CPU 제어권이 커널모드로 전환 -> 페이지 부재 루틴 실행

    페이지 부재 루틴

    1. 운영체제는 해당 페이지 접근이 적법한지를 체크 2. 적법하지 않은 경우 해당 프로세스 종료시키고, 적합한 경우 물리적 메모리에 비어 있는 프레임을 할당 받아 그 공간에 페이지를 읽어온다 3. 만약 비어 있는 프레임이 없다면 기존에 메모리를 사용하고 있는 페이지 중 하나를 스왑 아웃 시킨다 4. 물리적 메모리에 페이지를 읽어오는 과정은 I/O 과정이므로 다른 프로세스에게 CPU를 빼앗기고 blocked 된다 5. I/O가 완료되어 인터럽트가 발생하면 페이지 테이블에서 해당 페이지의 유효-무효 비트를 유효로 설정하고 봉쇄되었던 프로세스를 준비 큐로 이동 시킨다 6. 이 프로세스가 다시 CPU를 할당받으면 PCB에 저장해 두었던 값을 복원시켜 이전에 중단되었던 명령부터 실행을 재개한다


요구 페이징 기법의 성능

요구 페이징에 가장 큰 영향을 미치는 요소는 페이지 부재의 발생 빈도다

  • 페이지 부재가 일어나면 디스크로부터 메모리로 읽어오는 막대한 오버헤드가 발생하기 때문이다
  • 페이지 부재 발생이 적을수록 요구 페이징의 성능은 향상될 수 있다
  • 요청한 페이지를 참조하는 데 걸리는 유효 접근 시간으로 성능을 측정한다




페이지 교체

  • 물리적 메모리에 빈 프레임이 존재하지 않을 시 메모리에 올라와 있는 페이지 중에 하나를 디스크로 쫒아내 메모리에 빈 공간을 확보하는 작업이 필요하다. 이것을 우리는 페이지 교체라고 한다
  • 페이지 교체를 할 때에 어떠한 프레임에 있는 페이지를 쫒아낼 것인가를 결정하는 알고리즘을 교체 알고리즘이라고 한다
  • 이 알고리즘은 페이지 부재율을 최소화하는 것이 목표다


교체 알고리즘

  • 빌레드의 최적 알고리즘
    • 물리적 메모리에 존재하는 페이지 중 가장 먼 미래에 참조될 페이지를 쫒아낸다
    • 미래에 페이지가 어떤 순서로 참조될지 미리 알고 있다는 전제 하에 알고리즘을 운영하므로 실제 시스템에서 온라인으로 사용할 수 없다 ( 오프라인 알고리즘 )
    • 어떠한 알고리즘 보다도 가장 적은 페이지 부재율을 보장하므로 다른 알고리즘의 성능에 대한 상한선을 제공한다


  • FIFO 알고리즘
    • 페이지 교체 시 물리적 메모리에 가장 먼저 올라온 페이지를 우선적으로 내쫓는다
    • 물리적 메모리가 증가하더라도 페이지 부재가 증가할 수 있다 (이상 현상)

FIFO page-replacement algorithm with 3 memory frames.


  • LRU 알고리즘 (Least Recently Used)

    • 페이지 교체시 가장 오래 전에 참조가 이루어진 페이지를 내쫓는다

    LRU Cache Elimination Process


  • LFU 알고리즘 (Least Frequently Used)

    • 페이지의 참조 횟수로 교체시킬 페이지를 결정한다. 즉 물리적 메모리 내에 존재하는 페이지 중에서 과거에 참조 횟수가 가장 적었던 페이지를 내쫓고 그 자리에 새로 참조될 페이지를 적재한다. 최저 참조 횟수를 가진 페이지가 여러 개 존재하는 경우에는 임의로 하나를 선정해 그 페이지를 내쫒는다
    • 페이지 참조 횟수를 계산하는 방식에 따라 Incache-LFU와 Perfect-LFU로 구현할 수 있다
      • Incache-LFU
        • 페이지가 물리적 메모리에 올라온 후부터 참조 횟수를 카운트 하는 방식이다. 따라서 페이지가 메모리에서 쫓겨났다가 다시 들어온 경우 참조 횟수는 1부터 새롭게 시작된다
      • Perfect-LFU
        • 메모리에 올라와 있는지의 여부와 상관없이 그 페이지의 과거 총 참조 횟수를 카운트한다
        • 페이지의 참조 횟수를 정확히 반영할 수 있지만 오버헤드가 상대적으로 더 크다

    LFU Cache Elimination Process


  • 클럭 알고리즘

    • LRU 알고리즘과 LFU 알고리즘과는 달리 하드웨어적인 지원을 통해 동작한다(선정 속도가 빠르다)

    • LRU를 근사시킨 알고리즘으로 NUR(Not Used Recently), NRU(Not Recently Used) 알고리즘으로도 불린다

    • LRU 알고리즘이 가장 오래전에 참조된 페이지를 교체하는 것에 비해 클럭 알고리즘은 오랫동안 참조되지 않은 페이지 중 하나를 교체한다

    • 대부분 시스템에서 페이지 교체 알고리즘으로 클럭 알고리즘을 채택한다

    • 교체할 페이지를 선정하기 위해 페이지 프레임들의 참조 비트를 순차적으로 조사한다

    • 참조 비트는 각 프레임마다 하나씩 존재하며 그 프레임 내의 페이지가 참조될 때 하드웨어에 의해 1로 자동 세팅된다클럭 알고리즘은 참조 비트가 1인 페이지는 0으로 바꾼 후 그냥 지나가고 참조 비트가 0인 페이지는 교체한다

      Clock Algorithm




페이지 프레임의 할당

  • 프로세스가 여러 개가 동시에 수행되는 상황에서는 각 프로세스에 얼마만큼의 메모리 공간을 할당할 것인지를 결정해야 한다
  • 할당 알고리즘의 종류
    • 균등 할당 방식
      • 모든 프로세스에게 페이지 프레임을 균일하게 할당한다
    • 비례 할당 방식
      • 프로세스의 크기에 비례해 페이지 프레임을 할당하는 방식
    • 우선순위 할당 방식
      • 프로세시 중에서 당장 CPU에서 실행될 프로세스와 그렇지 않은 프로세스를 구분하여 전자 쪽에 더 많은 페이지 프레임을 할당하는 방식
  • 할당 알고리즘만으로는 프로세스의 페이지 참조 특성을 제대로 반영하지 못할 수 있다. 현재 수행중인 프로세스의 수가 지나치게 많을 경우 프로세스당 할당되는 메모리량이 과도하게 적어질 수 있기 때문이다. 또한 반복문(loop)을 실행 중인 프로세스의 경우 반복문을 구성하는 페이지들을 한꺼번에 메모리에 올려놓는 것이 유리하다. 이와 같은 종합적인 상황을 고려해서 각 프로세스에 할당되는 페이지 프레임의 수를 결정할 필요가 있으며, 경우에 따라서는 일부 프로세스에게 메모리를 할당하지 않는 방식으로 나머지 프로세스들에게 최소한의 메모리 요구량을 충족시킬 수 있어야 한다


전역 교체와 지역 교체

  • 전역 교체
    • 모든 페이지의 프레임이 교체 대상이 될 수 있는 방법
  • 지역 교체
    • 현재 수행중인 프로세스에게 할당된 프레임 내에서만 교체 대상을 선정할 수 있는 방법


스레싱(Thrashing)

​ 집중적으로 참조되는 페이지들의 집합을 메모리에 한꺼번에 적재하지 못하면 페이지 부재율이 크게 상승해 CPU 이용률 이 급격히 떨어질 수 있다. 이와 같은 현상을 스레싱이라고 부른다

  • 스레싱이 발생 -> 운영체제는 메모리에 적재된 프로세스의 수(MPD)가 적다고 판단 -> 메모리에 더 많은 프로세스 적재

    -> 각 프로세스에 할당되는 메모리의 양이 급격히 감소 -> 페이지 부재 빈도수 증가 -> 무한 루프…

  • 스레싱 발생을 방지하기 위해 MPD를 조절하는 알고리즘이 필요하다

Figure 1: Typical shape of the throughput function with thrashing


MPD 조절 알고리즘

  • 워킹셋 알고리즘
    • 프로세스는는 일정 시간 동안 특정 주소 영역을 집중적으로 참조하는 경향이 있다. 이렇게 집중적으로 참조되는 페이지들의 집합을 지역성 집합이라고 한다
    • 이러한 지역성 집합이 메모리에 동시에 올라갈 수 있도록 보장하는 메모리 관리 알고리즘을 워킹셋 알고리즘이라 한다
    • 워킹셋을 구성하는 페이지들이 한꺼번에 메모리에 올라갈 수 있는 경우에만 그 프로세스에게 메모리를 할당한다. 그렇지 않을 경우에는 프로세스에게 할당된 페이지 프레임들을 모두 반납시킨 후 그 프로세스의 주소 공간 전체를 디스크로 스왑 아웃 시킨다
    • 워킹셋 윈도의 크기를 효과적으로 결정하는 것이 워킹셋 알고리즘의 핵심

os_11_14


  • 페이지 부재 빈도 알고리즘
    • 프로세스의 페이지 부재율을 주기적으로 조사하고 이 값에 근거해 각 프로세스에 할당할 메모리량을 동적으로 조절한다
    • 어떤 프로세스의 페이지 부재율이 시스템에서 정해놓은 상한값을 넘게되면 이 프로세스에 할당된 프레임의 수가 부족하다는 것을 의미하므로 이 프로세스에게 프레임을 추가로 더 할당한다. 이 때, 추가로 할당할 빈 프레임이 없다면 일부 프로세스를 스왑 아웃시켜 메모리에 올라와 있는 프로세스의 수를 조절한다.
    • 이런 방식으로 메모리 내에 존재하는 모든 프로세스에 필요한 프레임을 다 할당한 후에도 프레임이 남는 경우 스왑 아웃되었던 프로세스에게 프레임을 할당함으로써 MPD를 높인다.

os_11_15


ref. 운영체제와 정보기술의 원리

ref. LFU, LRU Algorithm

ref. FIFO

ref. Thrashing

ref. 이미지

메모리 관리

|


‘운영체제와 정보기술의 원리’ 7장을 학습한 내용을 정리한 포스팅입니다


메모리 관리


컴퓨터 시스템에서의 주소

​ 컴퓨터 시스템은 32비트의 주소 체계를 사용하고 있다. 따라서 2^32가지의 서로 다른 메모리 위치를 구분할 수 있다.

​ 전국의 모든 위치를 숫자로만 구분하지 않고 행정 구역을 통해 ‘서울시 광진구 천호대로 120길 8’ 식으로 계층적으로 나누어 관 리한다. 컴퓨터 상의 주소도 32비트를 그대로 사용하지 않고 효율적인 운영을 위해 연속된 일련의 영역을 행정 구역처럼 묶어서 사용한다. 보통 4KB 단위로 묶어서 페이지라는 하나의 행정 구역을 만들게 된다.


주소 바인딩

​ 프로그램이 실행을 위해 메모리에 적재되면 그 프로세스를 위한 독자적인 주소 공간이 생성된다. 이 주소를 논리적 주소 또는 가 상 주소라고 부른다. CPU는 이와 같이 프로세스마다 독립적으로 갖는 논리적 주소에 근거해 명령을 실행한다. 논리적 주소는 각 프로세스마다 독립적으로 할당되며 0번지부터 시작된다. 반면, 물리적 주소는 물리적 메모리에 실제 올라가는 위치를 말한 다. 프로세스가 실행되기 위해서는 해당 프로그램이 물리적 메모리에 적재되어 있어야 하고 CPU가 기계어 명령을 수행하기 위 해 논리적 주소를 통해 메모리 참조를 하게 되면 해당 논리적 주소가 물리적 메모리의 어느 위치에 매핑되는 지를 확인해야 한 다. 이렇게 프로세스의 눈리적 주소를 물리적 메모리 주소로 연결시켜주는 작업을 주소 바인딩이라 한다.


주소 바인딩 방식

프로그램이 적재되는 물리적 메모리의 주소가 언제 결정되느냐에 따라 세 가지로 분류할 수 있다

  • 컴파일 타임 바인딩

    • 컴파일 하는 시점에 해당 프로그램이 물리적 메모리의 어느 위치에 적재될 것인지 결정된다
    • 프로그램이 절대 주소로 적재된다는 뜻에서 절대 코드를 생성하는 바인딩 방식 이라고 말하기도 한다
    • 물리적 메모리 위치를 변경하려면 다시 컴파일 해야하는 수고가 필요하다
  • 로드 타임 바인딩

    • 프로그램이 실행될 때 물리적 메모리 주소가 결졍되는 방식

    • 로더의 책임하에 물리적 메모리 주소가 부여되며 프로그램이 종료될 때 까지 물리적 메모리 상의 위치가 고정된다

      로더란 사용자 프로그램을 메모리에 적재시키는 프로그램을 말한다

  • 실행 시간 바인딩 (런타임 바인딩)

    • 프로그램이 실행을 된 후에도 그 프로그램이 위치한 물리적 메모리 상의 주소가 변경될 수 있는 바인딩 방식

    • 이 방식에는 CPU가 주소를 참조할 때마다 해당 데이터가 물리적 메모리의 어느 위치에 존재하는지 주소 매핑 테이블을 사용하여 바인딩을 점검해야 한다

    • 다른 방식들과 달리 기준 레지스터와 한계 레지스터, MMU(Memory Management Unit)라는 하드웨어적인 자원이 뒷받침 되어야 한다

      MMU

      논리적 주소를 물리적 주소로 매핑해주는 하드웨어 장치

      8


동적 로딩

​ 동적 로딩은 여러 프로그램이 동시에 메모리에 올라가서 수행되는 다중 프로그래밍 환경에서 메모리 사용의 효율성을 높이기 위 해 사용하는 기법 중 하나이다. 동적 로딩에서는 프로세스가 시작 될 때 그 프로세스의 주소 공간 전체를 메모리에 다 올려 놓는 것이 아니라 메모리를 좀 더 효율적으로 사용하기 위해 해당 루틴이 불려질 때 그 루틴만을 메모리에 적재하는 방식을 사용한다. 실제 프로그램의 상당 부분은 오류 처리 루틴과 같이 아주 특별한 경우에만 가끔씩 사용되는 방어용 코드다. 이런 코드까지 모두 메모리에 올리는 경우 메모리 낭비가 초래된다. 프로그램 자체에서 구현이 가능하며 운영 체제가 라이브러리를 통해 지원 할 수 도 있다.


동적 연결

연결이란 프로그래머가 작성한 소스 코드를 컴파일하여 생성된 목적파일과 이미 컴파일된 라이브러리 파일들을 묶어 하나의 실행 파일을 생성하는 과정을 말한다.

​ 동적 연결은 컴파일을 통해 생성된 목적 파일과 라이브러리 파일 사이의 연결을 프로그램의 실행 시점까지 지연시키는 기법을 말한다. 동적 연결과 대비되는 정적 연결에서는 프로그래머가 작성한 코드와 라이브러리 코드가 모두 합쳐져서 실행 파일이 생 성된다. 따라서, 실행 파일의 크기가 상대적으로 크며, 동일한 라이브러리를 각 프로세스가 개별적으로 메모리에 적재해야 하므 로 물리적 메모리가 낭비되는 단점이 있다. 그에 비해 동적 연결은 해당 라이브러리가 메모리에 이미 존재하는 지 살펴보고 존재 하는 경우 그 루틴으로 가서 메모리에서 직접 참조하고, 그렇지 않을 경우 디스크에서 동적 라이브러리 파일을 찾아 메모리로 적 재한 후 수행하게 된다.


중첩

​ 프로세스의 주소 공간을 분할해 실제 필요한 부분만을 적재하는 기법을 말한다. 이러한 기법은 동적 로딩과 개념적으로 유사하 다. 하지만 동적 로딩과 중첩을 사용하는 이유는 다르다. 중첩은 하나의 프로그램의 크기에 비해 물리적 메모리가 작을 때 사용 하는 방법이고, 동적 로딩은 다중 프로세스를 동시에 올려놓고 효율적으로 메모리를 관리하기 위한 목적으로 사용된다.


스와핑

스와핑이란 메모리에 올라온 프로세스의 주소 공간 전체를 디스크의 스왑 영역에 일시적으로 내려 놓는 것을 말한다. 스왑 영역 은 백킹 스토어라고도 부르며 디스크 내에 파일 시스템과는 별도로 존재하는 일정 영역을 말한다. 파일 시스템은 전원이 나가더 라도 그 내용이 유지되어야 하는 비휘발성 저장 공간임에 비해 스왑 영역은 프로세스가 수행중인 동안에만 디스크에 일시적으로 저장하는 공간이므로 저장 기간이 상대적으로 짧은 저장 공간이라고 할 수 있다. 작업의 방향에 따라 스왑 인(swap in), 스왑 아 웃(swap out)으로 나뉜다.


스와핑이 일어나는 과정

​ 스와퍼라고 불리는 중기 스케줄러에 의해 스왑 아웃시킬 프로세스를 선정한다. 스와핑의 가장 중요한 역활은 메모리에 존재하는 프로세스의 수를 조절할 수 있다는 점이다. 너무 많은 프로그램이 메모리에 동시에 올라오게 되면 프로세스당 할당되는 메모리 의 양이 지나치게 적어져 시스템 전체의 성능이 크게 떨어지게 된다. 스와핑은 이러한 문제를 해결하기 위해 몇몇 프로그램을 통 째로 디스크의 스왑 영역에 내쫒음으로써 메모리에 남아있는 프로그램들에게 필요한 메모리 공간을 보장한다.

memory swapping


물리적 메모리 할당방식

물리적 메모리는 운영체제 영역과 사용자 프로세스 영역으로 나뉘어 사용된다

사용자 프로세스의 영역의 관리는 프로세스를 메모리에 올리는 방식에 따라 연속 할당 방식과 불연속 할당 방식으로 나뉜다

  • 연속 할당 방식
    • 각각의 프로세스를 물리적 메모리의 연속적인 공간에 올리는 방식
    • 물리적 메모리를 다수의 분할로 나누어 하나의 분할에 하나의 프로세스가 적재되도록 한다
    • 분할을 관리하는 방식에 따라 고정분할 방식과 가변분할 방식이 있다

contigous-memory-allocation

  • 불연속 할당 방식

    • 하나의 프로세스를 물리적 메모리의 여러 영역에 분산해 적재하는 방식
    • 불연속 할당에는 각 프로세스의 주소공간을 동일한 크기의 페이지로 잘라서 메모리에 페이지 단위로 적재시키는 페이징 기법과 프로그램의 주소 공간을 코드, 데이터, 스택 등 의미 있는 단위인 세그머늩로 나누어 세그먼트 단위로 적재하는 세그먼테이션 기법, 그리고 세그먼트하나를 다수의 페이지로 구성하는 페이지드 세그먼테이션 기법 등이 있다

    noncontigous-memory-allocation

연속 할당 방식

  • 고정 분할 방식

    • 물리적 메모리를 주어진 개수만큼의 영구적인 분할로 미리 나누어 두고 각 분할에 하나의 프로세스를 적재해 실행시킬 수 있게 한다
    • 분할의 크기를 모두 동일하게 할 수도 있고 다르게 할 수도 있다
    • 동시에 메모리에 올릴 수 있는 프로그램의 수가 고정되어 있고 프로그램의 최대 크기 또한 제한된다
    • 외부조각, 내부조각이 발생할 수 있다

    외부조각

    내부 조각으로 발생한 사용되지 않는 공간의 합

    사진의 내부조각의 합은 4MB이므로 P5를 할당할 수 있는 크기이나 연속적이지 않으므로 할당할 수 없다

    내부조각

    프로그램의 크기보다 분할의 크기가 큰 경우 해당 분할에 프로그램을 적재하고 남는 메모리 공간을 뜻한다. 하나의 분할 내부에서 사용되지 않는 메모리 조각을 말한다.

os Fixed Partitioning

  • 가변 분할 방식

    • 메모리에 적재되는 프로그램의 크기에 따라 분할의 크기, 개수가 동적으로 변하는 방식

    • 내부 조각은 발생하지 않으나, 이미 메모리에 존재하는 프로그램이 종료될 경우 중간에 빈 공간이 발생하게 되며, 이 공간이 새롭게 시작되는 프로그램의 크기보다 작을 경우 외부조각이 발생할 가능성이 있다

    • 주소 공간의 크기가 n인 프로세스를 메모리에 올릴 때 물리적 메모리 내의 가용공간 중 어느 위치에 올릴 것인지를 결정하는 것이 주요 쟁점 (동적 메모리 할당 문제)

      • 최초 적합 (first-fit) - 가장 먼저 찾아지는 곳에 프로세스를 할당한다 (시간효율적)
      • 최적 적합 (best-fit) - 가용 공간 중 가장 작은 가용 공간을 찾아 새로운 프로그램을 할당한다 (공간효율적)
      • 최악 적합 (worst-fit) - 가용 공간 중 가장 큰 공간에 새로운 프로그램을 할당한다
    • 외부 조각 문제를 해결하기 위해 컴팩션이라는 방법이 있다

      컴팩션

      물리적 메모리 중에서 프로세스에 의해 사용중인 메모리 영역을 한쪽으로 몰고 가용 공간들을 다른 한쪽으로 모아서 하나의 큰 가용 공간을 만드는 방법. 비용이 많이 드는 작업이고 실행 도중에 프로세스의 주소가 동적으로 바뀔 수 있는 실행 시간 바인딩 방식에서만 수행될 수 있다.


불연속 할당 방식

  • 페이징 기법

    • 프로세스의 주소 공간을 동일한 사이즈의 페이지 단위로 나누어 물리적 메모리에 불연속으로 저장하는 방식을 말한다

    • 페이징 기법에서는 각 프로세스 전체를 한꺼번에 물리적 메모리에 올릴 필요가 없으며 일부는 백킹 스토어에, 일부는 물리적 메모리에 혼재 시키는 것이 가능하다

    • 페이징 기법에서는 물리적 메모리를 페이지 크기와 동일한 크기의 프레임으로 미리 나누어 둔다

    • 특정 프로세스의 몇 번째 페이지가 물리적 메모리의 몇 번째 프레임에 들어 있다는 페이지별 주소 변환 정보를 유지하고 있어야 하므로 모든 프로세스가 각각의 주소 변환을 위한 페이지 테이블을 가지고 있으며, 이 테이블은 프로세스가 가질 수 있는 페이지의 개수만큼 주소 변환 엔트리를 가지고 있게 된다

    • 페이징 기법에서는 프로세스의 주소 공간과 물리적 메모리가 모두 같은 크기의 페이지 단위로 나누어지기 때문에 외부 조각 문제가 발생하지 않는다. 그러나 프로그램의 크기가 항상 페이지 크기의 배수가 된다는 보장이 없기 때문에 프로세스의 주소 공간 중 제일 마지막에 위치한 페이지는 내부 조각이 발생할 가능성이 있다

    • Page table은 main memory에 존재하고 있다

    • Page-Table Base Register(PTBR) : Page table을 가리키는 포인터라고 할 수 있다.

    • Page-Table Length Register(PTLR) : Page table의 size를 나타낸다.

    • Main memory에 있는 Page Table에 접근하고 Data를 Physical Memory에 올리는 접근, 두번 접근을 해야 하기 때문에 성능이 떨어질 수 있다.

      Translation Look-aside Buffer(TLB)

      Register 사용 시 접근을 두번해야한다는 단점을 극복하기 위해 빠른 look up이 가능한 associative memory, TLB로 Hardware cache를 이용하는 방법이다.

      Page Table을 검색하기 전에 Cahce에 있는 TLB를 먼저 확인함으로써 TLB에서 발견된다면 Main Memory에 존재하는 Page table을 검색하지 않고 한번의 look up으로 해결할 수 있다.

      TLB 중 일부는 address-space identifier(ASID)를 사용하여 고유한 process id를 저장하여 Protection을 한다.

      TLB는 Page Table의 일부를 저장한 것이기 때문에 TLB Hit가 높아질수록 성능이 좋아진다.

img


계층적 페이징 기법

  • 현대의 컴퓨터는 주소 공간이 매우 큰 프로그램 지원
    • 32 bit 주소 사용시 : 2^32(4GB)의 주소 공간을 사용할 수 있다
    • page size가 4KB라 가정하면 1M개의 page table entry가 필요하다
    • 각 page entry가 4B이면 프로세스당 4MB의 page table이 필요하다 (1M * 4B = 4MB)
    • 그러나 대부분의 프로그램은 4GB의 주소공간 중 지극히 일부분만 사용하므로 page table 공간 낭비가 심하다
    • page table 자체를 page로 구성
    • 사용되지 않는 주소 공간에 대한 outer page table의 엔트리 값은 NULL

img


세그먼테이션

  • 페이징 기법의 경우는 사용자 측면보다는 운영체제 측면에서 메모리를 관리한다. 예를 들어 함께 호출되는 함수를 페이징 기법을 이용할 경우 다른 페이지로 나눠져서 비효율적으로 메모리를 사용할 수 있다.
  • 그에 비해 코드, 데이터, 스택 단위로 나누어 메모리를 좀 더 사용자 친화적으로 효율적으로 사용할 수 있다

os Segmentation

ref. Hardware Support for Relocation and Limit Registers

ref. swapping

ref. paging

CPU 스케줄링

|


‘운영체제와 정보기술의 원리’ 6장을 학습한 내용을 정리한 포스팅입니다


CPU 스케줄링


CPU

​ CPU는 프로그램의 기계어 명령을 실제로 수행하는 컴퓨터 내의 중앙 처리 장치이다. 프로그램이 시작되어 메모리에 올라가면, 프로그램 카운터(PC)라는 이름의 레지스터에 현재 CPU가 수행할 코드의 메모리 주소값을 가지게 되고, CPU는 PC가 가르키는 주소의 기계어 명령을 수행하게 된다.


기계어 명령

  • CPU 내에서 수행하는 명령
    • Add - CPU 내의 레지스터에 있는 두 값을 더해 레지스터에 저장하는 명령
  • 메모리 접근을 필요로 하는 명령
    • Load - 메모리에 있는 데이터를 CPU로 읽어 들이는 명령
    • Store - CPU에서 계산된 결과값을 메모리에 저장하는 명령
  • 입출력을 동반하는 명령
    • CPU와 메모리 접근을 필요로 하는 명령보다 많이 느리다
    • 키보드로부터 입력을 받는 경우 / 처리된 결과를 화면에 출력하는 경우
    • 디스크에서 파일 데이터를 읽는 경우 / 파일로 저장하는 경우


사용자 프로그램

​ CPU burst과 I/O burst의 반복으로 구성되며, 각 프로그램마다 burst가 차지하는 비율이 균일하지는 않다.

​ I/O 요청이 빈번해 CPU 버스트가 짧게 나타나는 프로세스를 I/O 바운드 프로세스라 하고,

​ I/O 작업을 거의 수행하지 않아 CPU 버스트가 길게 나타나는 프로세스를 CPU 바운드 프로세스라 한다.

​ I/O 바운드 프로세스의 예로는 대화형 프로그램이 이에 해당하고, 프로세스의 상당 시간을 입출력 작업 없이 CPU 작업에 사용하는 프로세스는 CPU 바운드 프로세스에 속한다.

  • CPU burst

    • 프로그램이 I/O를 한 번 수행한 후 다음번 I/O를 수행하기 까지 직접 CPU를 가지고 명령을 수행하는 작업
  • I/O burst

    • I/O 작업이 요청된 후 완료되어 다시 CPU 버스트로 돌아가기까지 일어나는 일련의 작업

img




CPU 스케줄링의 필요성

컴퓨터 시스템의 수행되는 프로세스들의 대부분은 짧은 CPU를 버스트를 가지며, 극히 일부분만 긴 CPU 버스트를 가진다. CPU 버스트가 짧은 프로세스는 대부분 대화형 작업이므로 사용자와 인터액션을 해가며 프로그램을 수행시키므로 반응속도가 중요하다. 따라서 CPU 스케줄링을 할 때 CPU 버스트가 짧은 프로세스에게 우선적으로 CPU를 사용할 수 있도록 하는 스케줄링이 필요하다


CPU 스케줄링이 발생하는 경우

  • 실행 상태에 있던 프로세스가 I/O 요청 등에 의해 봉쇄(blocked) 상태로 바뀌는 경우 (1)
  • 실행 상태에 있던 프로세스가 타이머 인터럽트 발생에 의해 준비 상태로 바뀌는 경우 (2)
  • I/O 요청으로 봉쇄 상태에 있던 프로세스의 I/O 작업이 완료되어 인터럽트가 발생하고 그 결과 이 프로세스의 상태가 준비 상태로 바뀌는 경우 (3)
  • CPU에서 실행 상태에 있는 프로세스가 종료하는 경우 (4)


CPU 스케줄링 방식

  • 비선점형 방식
    • CPU를 획득한 프로세스가 스스로 CPU를 반납하기 전까지는 CPU를 빼앗기지 않는 방법을 말한다
  • 선점형 방식
    • 프로세스가 CPU를 계속 사용하기를 원하더라도 강제로 빼앗을 수 있는 스케줄링 방법을 말한다
    • 대표적인 방법으로는 할당 시간을 부여한 후 타이머 인터럽트를 발생시키는 방법이 있다
  • (1), (4)가 비선점형 스케줄링의 예가 되며, (2), (3)은 선점형 스케줄링 방식에 해당한다


디스패처

​ CPU 스케줄러가 어떤 프로세스에게 CPU를 할당해야 할지를 결정하고나면 선택된 프로세스에게 실제로 CPU를 이양하 는 작업이 필요하다. 이와 같이 새롭게 선택된 프로세스가 CPU를 할당받고 작업을 수행할 수 있도록 환경설정을 하는 커 널 모듈을 디스패처라고 부른다.

​ 디스패처는 현재 수행중이던 프로세스의 문맥을 그 프로세스의 PCB에 저장하고, 새롭게 선택된 프로세스의 문맥을 PCB 로부터 복원한 후 그 프로세스에게 CPU를 넘기는 과정을 수행한다. 새로운 프로세스의 문맥을 복원시킨 후에는 사용자 모 드로 시스템의 상태를 전환해 사용자 프로그램에게 CPU의 제어권을 넘기게 된다.


스케줄링 성능 평가

시스템 관점의 지표로는 CPU 활동도와 처리량 등이 있으며,

사용자 관점의 지표로는 소요시간, 대기시간, 응답시간 등이 있다

  • CPU 활용도
    • 전체 시간 중 CPU가 명령을 수행한 시간의 비율
    • CPU가 휴면 상태에 머무리는 시간을 최소화 하는 것이 좋다
  • 처리량
    • 주어진 시간동안 CPU 버스트를 완료한 프로세스의 개수
    • 주어진 시간에 더 많은 프로세스들이 CPU 작업을 완료하기 위해서는 CPU 버스트가 짧은 프로세스에게 CPU를 우선할당 하는 것이 유리하다
  • 소요시간
    • 프로세스가 CPU 요청 시점부터 CPU 버스트가 끝날 때 까지 걸린 시간
    • 준비 큐에서 기다린 시간과 실제로 CPU를 사용한 시간의 합
    • 프로그램이 시작해서 종료하는 데까지 걸리는 시간이 아니다 (프로세스에 CPU 버스트는 여러 차례 존재할 수 있다)
  • 대기 시간
    • 프로세스가 준비 큐에서 CPU를 얻기 위해 기다린 시간의 합
    • 시분할 시스템에서 대기 시간이란 이번 CPU 버스트가 끝나기까지 준비 큐에서 기다린 시간의 합을 의미한다
  • 응답 시간
    • 프로세스가 CPU 요청 시점부터 처음으로 CPU를 얻을 때까지 기다린 시간


metaphor

중국집에 주방장이 있고 손님이 있다고 하자. 이 때, 활용도와 처리량은 중국집 입장에서의 척도이고 소요시간, 대기시간, 응답시간은 손님 입장에서의 척도라 할 수 있다. 활용도는 전체 시간 중 주방장이 일한 시간의 비율을 나타내고, 처리량은 주방장이 주어진 시간 동안 몇 명의 손님에게 요리를 만들어 주었는지를 나타낸다. 중국집 입장에서는 주방장을 고용해서 가능한 일을 많이 시키는 것이 좋으므로 활용도가 높은 것을 선호한다. 또한, 많은 손님에게 요리를 판매하는 것이 이익이므로 처리량이 많은 것이 중요한 지표가 된다. 소요 시간은 손님이 중국집에 들어와서 주문한 음식을 다 먹고 나가기까지 소요된 총 시간을 말한다. 대기 시간은 음식을 먹은 시간을 제외한 순수하게 음식을 기다린 시간을 의미한다. 이 때 음식이 조금씩 여러 번에 걸쳐 나왔다면 음식을 먹은 시간을 제외하고 각각의 음식이 나오기까지 기다린 시간을 합한 것이 대기시간이 된다. 응답 시간은 최초의 음식이 나오기까지 기다린 시간을 뜻한다.


스케줄링 알고리즘

FCFS ( First-Come First-Served)

  • 선입선출 방법으로서, 준비 큐에 도착한 프로세스 순서대로 CPU를 할당하고 그 프로세스가 자발적으로 CPU를 반납할 때 까지 CPU를 선점하지 않는다
  • CPU 버스트가 긴 프로세스가 먼저 도착한 경우 CPU 버스트가 짧은 프로세스 여러 개의 대기 시간이 증가하는 것은 물론 I/O 장치들의 활용도까지도 동반 하락하게 된다 (콘보이 현상)


SJF ( Shortest-Job First)

  • CPU 버스트가 가장 짧은 프로세스에게 제일 먼저 CPU를 할당하는 방식
  • 선점형 방식과 비선점형 방식으로 나뉜다
    • SJF의 선점형 방식을 SRTF (Shortest Remaining Time First)라고도 부른다
    • 프로세스들이 준비 큐에 도착하는 시간이 불규칙한 환경에서 선점형 방식이 프로세스 평균 대기시간을 최소화 하는 최적의 알고리즘이 된다
    • 일반적인 시분할 환경에서는 중간중간에 새로운 프로세스가 도착하는 경우가 발생하므로 선점형 방식이 평균 대기 시간을 가장 많이 줄일 수 있는 방식이 된다
  • 계속 CPU 버스트가 짧은 프로세스에만 CPU를 할당할 경우 CPU 버스트가 긴 프로세스는 준비 큐에 줄 서서 무한정 기다려야 하는 문제가 발생할 수 있다 (기아 현상)


우선순위 스케줄링

  • 준비 큐에서 기다리는 프로세스들 중에서 우선순위가 가장 높은 프로세스에게 제일 먼저 CPU를 할당하는 방식을 말한다
  • SJF 방식과 마찬가지로 선점형 방식과 비선점형 방식으로 나뉘며 선점형 방식의 경우 기아현상이 발생할 수 있다
  • 이러한 문제점을 해결하기 위해 노화 기법을 사용할 수 있다

노화 기법

기다리는 시간이 길어지면 우선 순위를 조금씩 높여 CPU를 할당 받을 수 있게 해주는 방법


라운드 로빈 스케줄링

  • 시분할 시스템의 성질을 가장 잘 활용한 스케줄링 방식
  • 각 프로세스가 CPU를 연속적으로 사용할 수 있는 시간이 특정 시간으로 제한되며, 이 시간이 경과하면 이 프로세스로부터 CPU를 회수해 준비 큐에 줄 서 있는 다른 프로세스에게 CPU를 할당하게 된다
  • 할당 시간이 너무 길면 FCFS와 같은 결과를 나타내고, 할당 시간이 너무 짧으면 컨텍스트 스위칭의 오버헤드가 커지게 된다
  • 여러 종류의 이질적인 프로세스가 같이 실행되는 환경에 효과적이다
  • 빠른 응답시간을 보장할 수 있는 장점이 있다


멀티 레벨 큐

  • 준비 큐를 여러 개로 분할 해 관리하는 스케줄링 기법
  • 큐 자체에 대한 스케줄링은 고정 우선 순위 방식, 시분할 방식을 사용한다.
    • 고정 우선 순위 방식
      • 높은 우선 순위의 큐가 비었을 때 낮은 우선 순위의 큐의 작업에 CPU를 할당한다
    • 시분할 방식
      • 각 큐에 CPU 시간을 적절한 비율로 할당한다
      • 고정 우선 순위 방식에서 발생할 수 있는 기아현상을 해소할 수 있다
  • 상위 큐에서는 라운드 로빈 스케줄링을, 하위 큐에서는 FCFS 스케줄링 기법을 주로 사용한다

img


멀티 레벨 피드백 큐

  • CPU를 기다리는 프로세스를 여러 큐에 줄 세운다는 측면에서 멀티 레벨 큐와 동일하나, 프로세스가 하나의 큐에서 다른 큐로 이동가능하다는 점이 다르다
  • 그림의 경우 상위에 있는 큐일 수록 우선순위가 높으며, 상위 두 개의 큐는 라운드 로빈 스케줄링을 사용하고 세 번째 큐는 FCFS 스케줄링 기법을 사용한다

img


다중 처리기 스케줄링

  • 프로세스를 준비 큐에 한 줄로 세워서 각 CPU가 알아서 다음 프로세스를 꺼내 가도록 할 수 있다

  • 대칭형 다중처리
    • 각 CPU가 각자 알아서 스케줄링을 결정하는 방식
  • 비대칭형 다중 처리
    • 하나의 CPU가 다른 모든 CPU의 스케줄링 및 데이터의 접근을 책임지고 나머지 CPU는 거기에 따라 움직이는 방식


실시간 스케줄링

  • 실시간 시스템에서는 작업마다 주어진 데드라인이 있어 정해진 데드라인 안에 반드시 작업을 처리해야 한다
  • 실시간 시스템 분류
    • hard real-time system
      • 미사일 발사, 원자로 제어 등 시간을 정확히 지켜야 하는 시스템을 말한다
      • 이러한 시스템에서는 정해진 시간 안에 반드시 작업이 완료되도록 스케줄링 해야한다
    • soft real-time system
      • 데드라인이 존재하긴 하지만 데드라인을 지키지 못했다고 해서 위험한 상황이 발생하지는 않는 시스템을 말한다
      • VOD 방식으로 영화를 볼 경우 시간당 정해진 프레임 수 만큼의 서비스가 이루어지지 않으면 화면 중간에 끊기는 현상이 발생한다. 그러나, 끊긴다고 해서 시스템이 붕괴되거나 치명적인 결과를 초래하지는 않는다
  • 데드라인이 얼마 남지 않은 요청을 먼저 처리하는 EDF(Earlist Deadline First) 스케줄링을 사용한다



ref. 운영체제와 정보기술의 원리

ref. CPU burst, I/O burst

ref. 멀티 레벨 큐

ref. 멀티 레벨 피드백 큐