ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [OS] 운영체제와 메모리
    운영체제 2020. 10. 22. 17:26
    728x90

    메모리

    프로세스 수행 중 명령어를 실행시키려면 최소 1회의 메모리 접근이 필요함

    1. PC 값을 이용하여 메모리로부터 실행해야할 instruction을 불러옴

    2. 명령어 해동 후 메모리에서 피연산자를 가져온 뒤

    3. 명령어 실행 후 필요 시 메모리에 결과값 저장

    Base, Limit 레지스터

    • Base 레지스터( = Relocation 레지스터) : 프로세스의 시작 메모리 주소

    • Limit 레지스터 : 프로세스의 메모리 주소공간의 크기

      • Base 레지스터 값 + Limit 레지스터 값 = 프로세스의 메모리 끝 주소

      • 유효성 검사 : if ( base < address < base + limit) OK else ERROR

    이 범위를 벗어나는 메모리에 접근 시 에러를 발생 시킴

    운영체제의 영역을 보호하기 위함과 동시에 하나의 메모리에 여러 프로세스를 동시에 올려놓기 위해 그들간의 구분을 분명히 할 필요가 있기 때문

    Address binding

    Logical 메모리를 Physical 메모리에 맵핑하는 것

    int a -> 컴파일 -> 프로그램 시작 주소에서 14바이트 떨어진 곳에 a 를 할당 -> Linker 또는 Loader 가 절대경로 1014 번지로 할당함

    Address binding 시점

    • Compile time : 프로세스가 메모리의 몇번지에 올라가는 미리 알고 있을 때

    • Load time : 컴파일 타임에는 주소공간을 모르지만 로딩 후에는 주소가 변하지 않을 때

    • Execution time

    Logical address vs Physical address

    • Logical address

      • CPU 에서 만들어낸 Virtual(가상의) memroy

      • Execution-time 이 되어야 비로소 의미를 가짐

    • Physical address

      • Memory unit 에서 바라보는 실제 주소

    MMU (Memory Management Unit)

    Runtime 에 가상 메모리 주소를 물리 메모리로 맵핑시켜주는 하드웨어 장치

     

    Dynamic loading : 프로세스의 실행 시점에 프로세스를 메모리에서 필요한 만큼만 가져오는 것 (보통 코드 영역을 분리하여 천천히 가져옴)

    Static loading : 프로세스를 실행 시 프로세스 전체를 로딩하는 방법

    Dynamic linking : 프로세스 실행 중 필요할 때 라이브러리를 링크하는 방식 : 메모리 절약 가능, 유지보수 용이

    Static linking : 라이브러리와 프로그램 코드가 바이너리 이미지로 만들어 질 때 합쳐져서 나오는 것

    Continuous Memory allocation

    한 프로세스는 연속적인 공간 내에 할당됨

    • 고정 분할 기법

      • 메모리를 동일한 크기의 파티션으로 분할

      • 하나의 프로세스는 하나의 파티션에 할당

      • 큰 프로세스를 할당하기 위해서는 파티션을 크게크게 나누어야하니 낭비가 심함

    • 가변 분할 기법

      • OS는 가용한 메모리 공간을 테이블로 관리

      • 가용한 메모리 공간에 프로세스를 할당

    Multiple partition allocation

    Memory fragmentation : 메모리 단편화

    • Internal fragmentation : 파티션이 너무 커서 프로세스가 파티션을 다 쓰지 못하는 낭비

    • External fragmentation : 프로세스가 종료되어 메모리상에 구멍(Hole)이 난 경우

    Variable partition : 파티션의 크기를 가변적으로 가져가는 것으로, 프로세스가 필요한 만큼만 파티션을 할당해주는 방법임. 이 경우 Internal fragmentation 은 적게 발생하지만 External fragmentation 이 발생

    Dynamic storage-allocation problem

    • First fit : 프로세스가 들어갈 수 있는 hole 을 발견하면 바로 할당됨 : 가장 빠름

    • Best fit : 프로세스가 들어갈 수 있는 hole 중 최소의 메모리를 가진 hole 에 할당됨

    • Worst fit : 프로세스가 들어갈 수 있는 hole 중 최대의 메모리를 가진 hole 에 할당됨

    Compaction : 할당된 주소를 싹 정리하여 한쪽에 몰아버림으로서 Fragmentation을 해결 : High overhead

    Segmentation 기법

    프로세스를 내부적으로 몇 가지 세그먼트로 쪼개어 메모리에 할당하는 것

    세그먼트 단위 : main program, functiiotn, local variable, global variable, code, stack, heap ...

    즉 하나의 프로세스가 여러개의 세그먼트로 나누어져서 관리된다는 것

    Segment table

    프로세스 별 Base, Limit 레지스터의 값과 Validation bit, read/write/execute privileges(권한)을 관리하는 테이블

    Validation bit : 하나의 프로세스가 여러 세그먼트로 나뉘기 때문에 현재 동작중인 프로세스더라도 아직 메모리에 올라오지 않은 세그먼트에 접근할 수 있음. 이를 구분하기 위해 메모리에 올라온 세그먼트는 validation 값이 1이고, 올라오지 않은 부분은 0임

     

    Paging

    Logical 메모리에서 모든 메모리를 4KB 단위로 쪼개어 한 조각을 Page 라 부르고, Physical 메모리에서도 마찬가지로 4KB 단위로 쪼개어 Frame 이라 부름. 이 둘을 맵핑, 할당하는 기법을 페이징 기법이라 함

    따라서 가변적으로 파티션의 크기를 할당할 때 페이지 단위로 할당하므로 external fragmentation 은 발생하지 않으며, Internal fragmentation 도 조금은 발생하지만 거의 발생하지 않음

     

    프로세스가 N개의 페이지를 요구하게 되면 N개의 가용한 프레임을 OS가 파악하여 할당해줌

     

    주소 변환법

    • Page number : 테이지 테이블 내에서의 인덱스값

    • Page offset : 페이지 내에서 찾고자하는 데이터의 인덱스

     

    페이지 테이블은 페이지의 물리 메모리 주소를 갖고 있음

     

     

    Frame table 은 가용한 Free frame 을 정리한 테이블로, OS가 관리하고 있다가 프로세스가 Page 를 할당요청하면 Frame table 에서 필요한만큼 꺼내어 할당해줌

     

    페이지 테이블의 구현

    • 페이지 테이블을 메인 메모리에 올려놓고 유지

    • Context switch 되면 PTBR(Page Table Base Register)에 해당 프로세스의 PT 값을 넣어줌

    • 마찬가지로 PTLR(Page Table Length Register)에 페이지 테이블의 크기 값을 넣어줌

    • 따라서 메모리에 한 번 접근하려면 페이지 테이블을 거쳐야하니 두 번의 메모리 액세스 발생

    • 이를 위해 TLB(Translation Look-aside Buffer) 라는 페이지 테이블 캐시를 둠

     



    TLB 동작 방식

    메모리 접근 요청 발생 시 TLB와 Page table 에 동시에 요청을 날리고, 당연히 TLB가 훨씬 빠르기 때문에 그 결과가 먼저 리턴됨. TLB 에서 캐시 미스가 났으면 Page table 의 요청을 계속 진행시키고, 그렇지 않다면 취소시킴

    Effective Memory Access Time(EAT)

    • a = 80% = TLB’s Hit rate

    • e = 20ns = TLB search time

    • m = 100ns = Memory access time

    • EAT = a * m(Segmentation table access) + (1 - a) * 2m(Segmentation table, Page table)

    • EAT = 0.8 * 100 + 0.2 * 200 = 120ns

    Shared memory

    여러 프로세스가 메모리를 공유하고 싶으면 Page number 를 공유하기만 하면 됨

     

    '운영체제' 카테고리의 다른 글

    [OS] 가상메모리 주소공간과 MMU  (0) 2020.11.26
    [OS] OS 페이징 기법  (0) 2020.10.22
    CPU 스케쥴링  (0) 2020.10.19
    운영체제의 프로세스  (0) 2020.10.19
    운영체제 기본지식과 리눅스  (0) 2020.10.18

    댓글

Designed by Tistory.