• 가상기억장치
     : 프로그램을 실행하는 동안 종종 프로그램 전체를 모두 사용하지 않는다.
     : 프로그램을 실행할 때 한 순간에 프로그램 전체를 필요로 하지 않는다.
     : overhead의 단점 때문에, VM은 Real-time(embedded) system에 부적합

    - 프로그램의 일부만 주기억장치에 있어도 실행이 가능하도록 하면 얻을 수 있는 장점
     : 프로그램은 더 이상 물리적 주기억장치 크기에 제한을 받지 않는다.
     : 각 프로그램이 적은 공간을 차지하므로 동시에 여러 프로그램을 주기억장치에 적재(multiprogramming degree 향상)
     : 프로그램을 적재하는데 걸리는 입출력 비용을 줄일 수 있다.
     : 가상기억장치는 요구 페이징(demand paging)기법을 이용하여 구현한다. 세그먼테이션과 결합하여 사용

  • 요구 페이징
     : 스왑핑 + 페이징을 결합하여 사용
     : 프로세스 전체를 스왑하지 않고, 지연 스왑퍼(lazy swapper = pager)를 사용한다. 이 스왑퍼는 페이지가 필요할 경우에만 적재한다.
     : 주기억장치에 있는 페이지와 디스크에 있는 페이지를 구분하기 위해 유효비트 사용 (1 이면 주기억장치, 0 이면 디스크), TLB, 보호비트, 디스크의 일부분을 스왑 공간으로 사용

     

     ① 접근하는 페이지에 대해 페이지 테이블을 참조하면 유효비트가 현재 0이므로 페이지 결함 트랩(page fault trap) 발생
     ② 트랩이 발생하면 프로세스의 PCB를 검사하여 참조의 유효성을 검사. 즉, 디스크에 있는 페이지에 대한 참조인지 프로세스의 가상 주소 공간을 벗어난 참조인지를 검사한다. 후자이면 프로세스 종료.
     ③ 빈 프레임을 찾는다.
     ④ 디스크 입출력을 이용하여 페이지를 프레임에 적재한다.
     ⑤ 디스크 입출력이 종료되면 프로세스의 내부 테이블과 페이지 테이블을 수정한다.
     ⑥ 페이지 결합 트랩을 발생시킨 명령어를 다시 수행한다.

      ■ Effective Access Time (EAT)

       : (1-p) * Memory Access Time + p * Page Fault Time (p, Page fault rate 0 <= p <= 1)
       : Page Fault Time = page fault overhead + swap page out + swap page in + restart overhead

      ■
     Copy-on-Write
       : 부모 프로세스가 자식 프로세스를 생성할때 부모 프로세스의 주소 공간을 복사하는 것은 낭비, 변경된 페이지 내용만 복사하고 나머지는 모두 공유

     

  • 페이지 교체
     : 10 페이지 크기의 프로세스가 실제 5 페이지만 사용하면 요구 페이징 기법은 디스크 입출력을 줄일 수 있고, 다중 프로그래밍의 정도를 높일 수 있다.
     : but, 다중 프로그래밍의 정도를 높이면 프레임 공간이 부족할 수 있다. 또한 주기억장치의 모든 프레임을 사용자 프로세스에게 할당해줄 수 없다.
     : 프로세스 종료, 프로세스 스왑 아웃, 페이지 교체 등으로 해결
     - 페이지 교체(page replacement)
       : 적재되어 있는 기존 페이지를 새 페이지로 교체한다.
       : 페이지 결함이 발생할 때 페이지 교체 절차
      

       ① 디스크에서 페이지의 위치를 찾는다.
       ② 빈프레임을 찾는다.
         : 있으면, 거기에 페이지를 적재
         : 없으면, 페이지 교체 알고리즘을 이용하여 희생 프레임을 선택한 다음 희생 프레임에 있는 페이지를 디스크에 쓰고, 프레임에 새 페이지를 적재한다. 
       ③ 페이지 테이블과 프레임 테이블을 변경한다.
       ④ 프로세스를 재개한다.
        : 빈 프레임이 없으면 항상 두 번의 디스크 입출력이 필요하다. 디스크 입출력은 변경 비트를 이용하여 줄 일 수 있다.(하드웨어적으로 구현)
        : 제공되어야 하는 두 가지 알고리즘
        - 프레임 할당 알고리즘
          : 한 프로세스에게 할당할 프레임의 수를 결정하는 알고리즘
          : Fixed allocation vs Priority allocation
          : Global allocation vs Local allocation (다른 프로세스의 페이지 vs 자신의 페이지)
  •     - 페이지 교체 알고리즘
         : 빈 프레임이 없을 때 희생자를 선택하는 알고리즘
        
       ■ FIFO (First-In-First-Out)
        : 가장 오래전에 들어온 페이지가 선택
        : Belady의 모순: 프레임 수가 증가하면 페이지 결함 발생 수는 감소해야 정상인데 증가하는 경우가 있음
       ■ Optimal
        : 가장 오래 동안 사용되지 않을 페이지가 희생자로 선택
        : 미래를 예측하기 힘들다
       ■ LRU (Least-Recently Used)
        : 가장 오래전에 참조한 페이지가 희생자로 선택
        : 가장 널리 사용 됨 
       ■ LRU-Approximation
        : 충분한 하드웨어 지원이 없을 경우
        : Additional-Reference-Bits, Second-Chance, Enhanced Second-Chance
       ■ Counting-Based
        : LFU, MFU

  • 스레싱
     : 계속하여 페이지 결함이 발생하는 현상을 스레싱이라 한다. 실행하는 시간보다 페이지 결함을 처리하는 시간이 더 많아지면 이 현상이 발생하였다고 한다.
     : 프로세스에 할당된 프레임 수가 필요한 최소의 프레임 수 이하로 내려가면 스레싱 발생
     : 다중 프로그래밍 정도 <-> CPU 사용 효율, 반비례 관계
     : 지역성 모델(locality model): 이 모델에 의하면 프로세스는 실행되는 동안 한 지역에서 다른 지역으로 이동한다. 여기서 지역이란 현재 활동적으로 사용하고 있는 페이지들의 집합을 말한다. 현재 프로세스의 지역을 수용할 수 있는 만큼의 프레임을 할당해주면 스레싱은 발생하지 않는다.
     ■ 작업 집합 모델 
      : 지역성 가정에 기반한 모델



'Major > Operating System' 카테고리의 다른 글

운영체제 - Memory Management  (0) 2015.11.11
운영체제 - Deadlock  (1) 2015.11.11
운영체제 - Process synchronization  (0) 2015.11.10
운영체제 - CPU schedulering  (0) 2015.11.10
운영체제 - Thread  (0) 2015.11.10
  • 주기억장치 관리
    - 주소 바인딩
     : 프로그램을 작성할 때, 프로그래머는 기호 주소를 사용한다. 즉, 변수를 선언하고 이 변수 이름을 통해 주소를 접근
     : 프로그램은 실행되기 전에 이런 기호 주소를 실제 주소로 바인딩해주어야 한다.
     : 주소 바인딩 시기
     ■ 컴파일 시간(Compile time)
      : 컴파일러가 프로세스가 어디에 적재될지 알고 있으면 컴파일할 때 주소를 바인딩할 수 있다.
     ■ 적재 시간(Load time)
      : 컴파일할 때 프로세스가 어디에 적재될지 모르면 컴파일러는 재배치 가능 코드를 생성한다. 실제 바인딩은 적재할 때까지 지연된다. 재배치 가능 코드란 기준 위치 주소를 사용하는 코드를 말한다.
     
    ■ 실행 시간(Execution time)
      : 실행 도중에 프로세스의 적재 위치가 바뀔 수 있으면 바인딩은 실행될 때 이루어진다.



    - 논리(Logical) vs 물리적(Physical) 주소 공간
     : CPU에 의해 생성되는 주소는 보통 논리적 주소
     : 주기억장치가 접하게 되는 주소는 물리적 주소(MAR, Memory Address Register에 적재되는 주소)
     : 실행 시간 바인딩의 경우에는 논리적 주소와 물리적 주소가 다르며, 이 경우에는 논리적 주소를 가상주소(virtual address)라 한다.
     : 실행 시간 바인딩에서 논리적 주소와 물리적 주소 간에 매핑은 주기억장치-관리 장치(MMU, Memory-Management Unit)라 하는 하드웨어에 의해 이루어진다.
     

    - 가상주소는 왜 사용?
     : 현재 실행에 필요한 page만 memory에 올리고, 나머지는 swap device쪽에 있어라
     : 한 프로세스당 차지하는 memory 공간을 줄이자 (= multiprogramming degree를 높인다 = CPU utilization / throughtput이 높아진다)
     : 프로그래밍이 쉽다 (프로그래머가 물리적 메모리 사용량을 신경쓰지 않아도 됨)
     : memory에 프로세스를 load, swap하는 시간이 적게 든다.

    - 동적 적재 (Dynamic loading)
     : 초창기에는 프로그램이 실행되기 위해서는 전체 프로그램이 모두 주기억장치에 적재되어야 했다. -> 프로세스의 크기가 물리적 주기억장치 크
    기에 의해 제한된다.
     : 루틴이 호출될 때 주기억장치에 적재하는 방법
     : 모든 루틴은 재배치 가능 코드 형태로 디스크에 유지된다.
     : main 프로그램이 먼저 적재되며, 실행 도중에 다른 루틴을 호출해야 하면 이 루틴이 현재 주기억장치에 있는지 검사하고 없으면 재배치 가능 연결 적재기(relocatable linking loader)를 이용하여 루틴을 주기억장치에 적재한다.
     : 사용하지 않는 루틴은 주기억장치에 적재되지 않는 장점이 있다.


    - 동적 연결과 공유 라이브러리
      ■ 정적 연결(static linking)   
       : 프로그래밍 언어에서 제공하는 라이브러리를 프로그램과 결합하여 사용하는 방식
       : 모든 프로그램은 라이브러리의 복사본을 가지고 있다. 따라서 디스크 공간과 주기억장치 공간이 모두 낭비 된다.
      ■ 동적 연결(dynamic linking)
       : 라이브러리와의 연결이 실행 시간까지 연기되는 방식
       : 각 프로그램에 stub가 포함되며, 이 것은 주기억장치에 공유되고 있는 라이브러리 루틴에서 프로그램이 필요하는 루틴을 찾아주는 적은 양의 코드이다.
       : 어떤 루틴을 처음 호출할 때만 stub가 필요하며, 그 루틴을 다시 호출하면 주소 정보를 이용하여 바로 호출한다.
       : 라이브러리 갱신이 용이하고, 디스크 공간과 주기억장치 공간을 절약할 수 있다.
       : 다른 주소 공간을 접근해야 하므로 운영체제 지원이 필요하다.

    - 스왑핑 (Swapping)
      : 프로세스는 실행 도중에 일시적으로 주기억장치에서 디스크로 옮겨진 후에 나중에 다시 주기억장치에 적재되어 실행을 재개할 수 있다. 이 과정을 스왑핑(Swapping)이라 한다.

     

    - 연속적 공간 할당
     : 주기억장치는 운영체제 영역과 사용자 프로세스 영역으로 분리되며, 보통 운영체제는 하위 주소에 위치
     : 각 사용자 프로세스는 연속된 단일 영역을 할당받는다.
     : 운영체제를 사용자 프로세스로부터 보호해야 하며, 사용자 프로세스를 다른 사용자 프로세스로 부터 보호해야한다.
     : 이를 위해 기저(Base) 레지스터, 한계(Limit) 레지스터를 사용한다.
     
     : 운영체제는 현재 사용되고 있는 공간과 사용되지 않는 공간을 테이블에 유지한다.
     : 처음에는 운영체제가 적재되어 있는 공간을 제외하고는 모두 사용 가능하며, 사용 가능한 영역을 홀(hole)라 한다.
     : 어떤 홀에 프로세스를 할당할 것인가?

        ■ First-fit
    : 충분히 큰 첫 번째로 발견한 홀에 할당
        ■ Best-fit: 프로세스를 수용할 수있는 가장 작은 홀에 할당
        ■ Worst-fit: 가장 큰 홀에 할당

         =>
     외부 단편화 발생
             모든 홀을 합하면 프로세스를 수용할 수 있으나 연속 공간이 아니기 때문에 프로세스를 할당할 수 없는 경우
             -> 할당되어 있는 프로세스의 적재 위치를 재배치하여 하나의 큰 홀을 얻는 compaction 방법을 이용
         => 내부 단편화 발생
             할당된 메모리가 요구된 메모리보다 커서 사용되지 않아 낭비되는 경우

    - 페이징

       : 현재 가장 널리 사용되는 기법으로 프로세스에게 연속된 공간을 할당해주지 않아도 된다.
       : 운영체제 + 하드웨어를 연관시켜 구현
       : 물리적 기억장치는 고정된 크기의 프레임(frame)으로 나눔
       : 논리적 주소공간도 프레임과 같은 크기의 페이지(page)로 나눔
       : 오늘날은 4KB 또는 8KB의 페이지 크기 사용
       : 프로세스가 실행될 때 그것의 페이지는 사용한 어떤 프레임에도 할당될 수 있다.
       : 페이지 번호(p)와 페이지 오프셋(d)로 구성
      

       

      
      : 페이징을 사용하면 프로세스의 마지막 페이지는 프레임 크기보다 작을 수 있어서 최악의 경우 한 프레임의 대부분이 낭비될 수 있는 내부 단편화 발생
      : 페이지 크기를 줄여서 내부 단편화를 줄일 수 있지만 페이지 테이블의 크기가 커짐
      : 각 프로세스마다 페이지 테이블을 유지, 보통 PCB에 유지되어서 context switching 시간을 증가시킨다.
      : 운영체제는 주기억장치를 관리하므로 할당의 자세한 내용을 알고 있어야 하는데, 이를 위해 프레임 테이블을 유지, 프레임 테이블에는 실제 프레임마다 하나의 항이 존재히며, 프레임의 할당여부, 할당되어 있을 경우에는 어떤 프로세스의 몇 번째 페이지가 할당되어 있는지를 유지
     
     
      ■ 페이지 테이블 하드웨어 구현
         : 보호비트나 PTLR(Page-Table Length Register)을 사용하여 페이지 테이블의 크기를 나타내어 보호

        - 전용 레지스터 집합을 사용
        : 페이지 테이블이 작은 경우에만 가능
        : 주기억장치의 특정 영역에 페이지 테이블을 저장하고, 이것을 가리키는 주소만 레지스터에 저장한다. 이 레지스터를 PTBR (Page-Table Base Register)이라 한다.
        : 주기억장치를 접근하기 위해 항상 두 번의 접근이 필요하므로 접근 속도가 느리다.

       
    - 전용 캐시를 사용하는 방법
       : 이 캐시를 TLB(Translation Look-aside Bufer)라 하며, 보통 캐시와 마찬가지로 연관 매핑 방식을 사용한다.
       : TLB는 크기가 제한적이며, 비용이 비싸므로 페이지 테이블에 일부만 가지고 있으며, 캐시처럼 먼저 TLB를 검색한 다음에 찾고자 하는 페이지 정보가 없으면 주기억장치에 있는 페이지 테이블을 참조한다.

      


     
     ■ 페이지 테이블 구조
      - 계층구조 페이징
      
      

      - 해시 페이지 테이블
      


      - 역 페이지 테이블
      : 주기억장치의 각 프레임에 대한 항만을 가지고 있어, 이 항에는 이 프레임에 저장되어 있는 가상주소와 이것을 사용하는 프로세스의 식별자로 구성되어 있다.

     
      - 공유 페이지
      : 공통 코드의 공유 가능성이 있지만 여러가지 조건이 필요하여 쉽지 않다.


    - 세그먼테이션
     : 보통 사용자들은 주기억장치를 연속적 선형 공간으로 생각하지 않고, 순서가 없는 다양한 크기의 세그먼트의 집합으로 생각하는데 세그먼테이션이 이런 사용자 관점을 지원해주는 주기억장치 관리 기법
     : 외부 단편화가 발생할 수 있다.
     : 세그먼트 테이블을 사용하여 세그먼트 주소와 물리적 주소 간에 매핑

     : 세그먼트 이름과 오프셋을 이용하여 주소를 지정, 컴파일러가 사용자 프로그램을 번역할 때 자동적으로 세그먼트를 구성

     
     
     


'Major > Operating System' 카테고리의 다른 글

운영체제 - Virtual Memory Management  (0) 2015.11.11
운영체제 - Deadlock  (1) 2015.11.11
운영체제 - Process synchronization  (0) 2015.11.10
운영체제 - CPU schedulering  (0) 2015.11.10
운영체제 - Thread  (0) 2015.11.10
  • 교착상태
    : 자원은 주기억장치 공간, CPU 시간, 파일, 입출력 장치 등
    : 프로세스는 여러 프로세스가 여러 자원에 대해 경쟁
    : 어떤 집합 내에 있는 모든 프로세스가 대기 상태이며, 이 집합 내에 있는 각 프로세스가 이 집합내에 다른 프로세스가 가지고 있는 자원을 기다리고 있으면 교착상태에 있다고 한다.




    - 데드락의 4가지 조건
     : 4가지 모두 충족되어야 교착상태가 발생(1, 3는 자원 관련, 2, 4는 시스템 관련)
     1. 상호배제(Mutual Exclusion)
      : 최소한 하나는 비공유 방식으로 점유되어야 한다. 비공유 방식의 점유란 한번에 하나의 프로세스만 자원을 사용할 수 있음을 말한다.
     2. 점유와 대기(Hold and Wait)
      : 프로세스는 최소한 하나의 자원을 점유하고 있고, 다른 프로세스가 점유하고 있는 다른 프로세스를 기다리고 있어야 한다.
     3. 비선점(No Preemption)
      : 점유된 자원은 강제로 해제될 수 없고, 프로세스가 자원의 사용을 끝마치고 자발적으로 해제할 때까지는 그 자원을 얻을 수 없어야 한다.
     4. 순환 대기(Circular Wait)
      : 다음을 만족하며 대기하는 프로세스의 집합 {P0, P1, P2 ... Pn}이 존재해야 한다. P0는 P1, P1은 P2, Pn은 P0가 점유한 자원을 기다리고 있다. 자원 순환 그래프에서 사이클을 가지지 않으면 데드락이 아니지만 만약 사이클을 가지면 데드락일 수도 있고 아닐 수도 있다. (자원 갯수에 따라)


    - 교착상태를 처리하는 방법
    1. Prevention
     : deadlock이 발생하는 4가지 조건 중 하나라도 없애는 것
    2. Avoidance
     : Deadlock이 일어날 수 있는 상황에 가지 않도록 자원 관리, 
    Banker’s algorithm
    3. Detection
     : Deadlock이 일어난 것을 확인하고 후 처리


'Major > Operating System' 카테고리의 다른 글

운영체제 - Virtual Memory Management  (0) 2015.11.11
운영체제 - Memory Management  (0) 2015.11.11
운영체제 - Process synchronization  (0) 2015.11.10
운영체제 - CPU schedulering  (0) 2015.11.10
운영체제 - Thread  (0) 2015.11.10

+ Recent posts