IT/OS

운영체제 3차 정리 - Memory Management (1)

김효랑이 2018. 10. 26. 11:17
728x90
반응형

 호야의 블로그 

[OS] 운영체제 3차 정리

저번 운영체제 정리에 이어 이번에는 메모리 관리에 대한 정리를 시작하겠습니다.


Memory Management (1)

  - 메모리의 기본 단위는 "byte" 또는 "word"이며 일반적으로 프로세서는 메모리로부터 처리할 내용을 가져오거나 처리 결과를 메모리에 저장함

  - 명령어 실행과정에서 메모리는 단지 메모리 주소의 연속으로 보기 때문에, 프로그램이 메모리의 주소를 어떻게 생성하는지 알 수 없어 프로그램을 실행시키기 위한 메모리 load 방법을 알 필요가 있음

  - Process를 메모리에 Load 하는 방법으로 연속적으로 메모리를 할당하는 방법과 프로세스를 페이지나 세그먼트 단위로 나누어 여러 곳에 흩어져 적재하는 분산 적재로 구별할 수 있음

  - 다중 프로그래밍 시스템에서는 메모리의 사용자 영역을 여러 프로그램이 상주할 수 있도록 세분화 해야 하고, 이 작업은 운영체제에 의해 동적으로 이루어지는 과정을 메모리 관리함

  - 메모리 관리를 함으로써, CPU의 효율을 극대화할 수 있어야 하고, resource 차원에서 관리되어야 함

  - 다중 프로그래밍 시스템에서는 여러 프로세스 간에 다른 프로세스로 메모리 영역 침범이 이루어지지 않도록 관리해야 함

  - 메인 메모리로 탑재되기 위해 기다리는 프로세스의 집합을 Input Queue라 하며, 이 큐에서 하나의 프로세스를 선택해서 메모리에 적재함

  - 프로세스가 종료되면 프로세스가 사용했던 기억공간은 다른 프로세스가 사용할 수 있는 기억공간으로 변함


* Logical Memory & Address, Physical Memory & Address

  - Logical Memory : 프로세스가 인지하는 정의 공간이며 프로그래머가 프로그래밍에 사용하는 공간이다. 크기는 워드의 길이에 따라 다르며 Word가 32bit면 4GB를 가진다. Physical Memory보다 클 수도 작을 수도 있으며, 보통 relocatable address를 사용한다. 프로세스는 Physical storage를 인지하는 것이 아닌 Logical storage를 인지하기 때문에 둘이 같지 않다면 번역이 필요하다.

  - Physical Memory : 하드웨어의 실제 메모리 공간으로 실제 데이터나 프로그램이 저장되는 공간인 RAM을 의미하며, 사용하는 단위는 byte이다.

  - Logical Address : CPU가 생성하는 주소이며, Virtual Address라고도 한다.

  - Physical Address : 메모리가 취급하게 되는 주소이다.


* Address Binding

  - 고급언어를 통하여 주소를 변수(Symbolic address)의 개념으로 표시하는데, 이러한 주소를 Logical Address라고 하면 이 주소를 Physical address로 변환하는 과정을 Address Binding이라 하고 모든 address를 Absolute Address로 바꾸며 메인 메모리의 고정된 부분에 적재하는 것을 의미한다.

  - 원시 프로그램인 코드 파일을 어셈블러, 링커, 로더를 통하여 실행파일로 만드는데 그사이에서의 relocatable address를 언제 Physical address로 변환시켜주는지를 정해야 한다.


* Multi step Processing of a User Program

  - Compile Time Binding : 컴파일 중에 프로세스가 메모리에 적재될 위치를 알 수 있을 때 컴파일러가 Physical address(absolute address)를 만들 수 있으며, 이와 같은 시기에 생성되는 메인 메모리의 실제 주소로 변환되는 과정을 절대 재배치라고 한다. 만약 프로세스의 시작 위치가 변하면 코드를 재컴파일 해야 한다.

  - Load Time Binding : 컴파일을 하면서 프로세스가 메모리 내의 어디에서 적재되어야 하는지 알려주지 않고 Logical address를 relocatable address로 만들어주고, 컴파일 때는 프로그램의 시작주소를 0으로 가정하고 object module을 생성한다. 프로세스의 시작위치가 바뀌게 되면 reload 해주면 되고, 이와 같은 과정을 Static relocation이라 한다.

  - Execution Time Binding : 실행될 때 메모리의 주소가 결정되는 것으로 logical address와 physical address가 다르게 된다. 이에 따라 주소 번역 기능이 필요하고 이 번역기능은 Memory Management Unit(MMU)에서 해주게 된다. 실행되면서 Binding이 일어나므로 Dynamic Relocation이라 한다. 주소 번역 기능을 수행해야 하기 때문에 메모리 접근 시간이 2배로 늘어나지만 관리 측면에서 좋고, 현대의 운영체제는 이를 사용하고 있다.

      : MMU : 가상 주소를 물리 주소로 바꾸어 주도록 하는 하드웨어 장치로, Base register는 Relocation register라고 불린다. User program은 logical address만 다루고 physical address는 다루지 않게 된다.

  - Assembler : 어셈블리어 명령어를 기계어로 변환하며, 명령어를 형식화하고, labels와 variable의 위치를 reconcile 한다. 보통 주소는 relocatable address로 만들며 프로그램의 첫 번째 주소는 0번지로 가정한다. Link module을 만든다.

  - Linker : 여러 relocatable link module을 하나의 Load module로 만든다. Load module에는 기계 명령어와 데이터가 있으며, 코드 등의 다양한 정보가 들어있다. external reference를 Reconcile 한다. 

  - Loader : Load module을 메모리에 위치시키며, 필요한 곳에 주소를 Reconciling 한다. 


* Dynamic Loading

  - 주소 바인딩 시간을 최대한 늦춰서 실행되기 직전에 주소를 확정하면 시스템 운영과 메모리 활용에 도움을 줄 수 있고 이를 위해 동적 적재(Dynamic Loading)를 사용한다.

  - 모든 Routine은 Relocatable load Format의 형태이며, 사용되지 않는 Routine은 load 되지 않고, Unloaded routine이 로딩되면 relocatable address가 physical address가 되며, 제어권이 새 loaded code로 넘어간다.

  - 프로그램의 전체 양이 많을지라도 실제 사용된 코드는 많지 않아서 process의 주소가 물리 주소보다 커도 문제 되지 않는다.

  - OS는 특별한 지원은 하지 않으며, 동적 링크 적재기(library)를 제공한다.


* Dynamic Linking

  - Execution Time까지 로딩이 될 때까지도 linking을 하지 않는다.

  - 이 기능을 사용하지 않으면 Library가 프로세스마다 전부 있어야 하는데, 동적 링크를 하게 되면 1개의 라이브러리로 동적으로 추가하면 된다. 이에 따라 메모리 낭비를 줄일 수 있는 효과를 본다.

  - Stub을 사용하여 address의 routine을 대체하며, 해당 routine을 실행시킨다.

  - OS는 Stub을 보고 프로세스의 메모리 공간에 없으면 해당 library를 추가시키는 일을 한다.

  - 새로운 버전의 routine으로 대체하는 데에 효율적이며 Library를 공유할 수 있도록 해준다.

  - 하나의 Library를 공유하기 때문에 서로 다른 process 사이의 address 공간 문제가 발생한다.


* Swapping

  - Round Robin 등의 Preemption algorithm에서 프로그램이 끝날 때까지 메인 메모리에 저장되는 것이 불편하므로 잠시 보조기억 장치(Backing store)로 보냈다가 다시 오는 작업이 필요했다.

  - main memory에서 backing store로 프로세스가 잠시 나가는 것을 swap out, 다시 들어오는 것을 swap-in이라 하며, 우선순위 알고리즘에 의해서 잠시 나가는 것을 roll-out, 다시 들어오는 것을 roll-in이라 한다.

  - Swapping을 하기 위해 System은 hard disk와 backing store에 있는 process를 관리하는 Queue를 유지해야 한다.

  - Process가 I/O 중에 Swap 된다면 device controller에 문제가 생길 수 있으므로 고려해야 한다.

  - 평상시에는 사용하지 않으며, 메모리 할당의 Threshold를 넘으면 trigger 된다.

  - Swap-in 될 때, Compile Time Binding & Load Time Binding은 전과 같은 물리 주소로 mapping 돼야 하지만, Execution Time binding은 같은 물리 주소에 mapping 되지 않아도 된다.


* Overlay

  - 프로세스의 모든 논리 주소 공간이 프로세스가 수행되기 전에 실제 메모리에 적재되어야 하므로 프로세스의 크기는 실제 메모리 크기로 제한된다.

  - 프로세스에 할당된 메모리보다 큰 프로그램은 Overlay(중첩)를 사용하여 해결할 수 있다.

  - 프로그램 실행에 필요한 명령어와 데이터를 적재시키고 필요한 시기에 overlay driver 영역에서 코드를 불러오는 방법이다.


* Single-Partition Allocation

  - Main memory는 User process 영역과 OS 영역으로 나뉠 수 있는데 OS는 interrupt vector 때문에 low memory 공간을 사용하고, User process는 high memory 공간을 사용한다.

  - Single-partition Allocation에서는 하나의 User process만이 기억장치에 상주하고, kernel space의 바로 다음 공간부터 적재되어 사용된다.

  - 메모리 보호를 위해 Relocation-register Scheme(재배치 레지스터 기법)을 사용한다.

  - Relocation register는 가장 작은 물리 주소를 가지며, limit register는 logical address의 범위 값을 가진다. 

  - 다른 프로그램을 사용할 수 없으므로, 다중 프로그래밍할 수 없고, 입출력 작업이 많으면 overhead가 그대로 생겨서 좋지 않다.

  - Address binding을 간단하게 Compile Time Binding 하면 된다. (장점)

  - kernel size가 변경된다면 재컴파일 해야 된다. (단점)


* Multiple Fixed Partition Allocation

  - 메인 메모리가 고정 Size Partition으로 나누어진다.

  - 고정 사이즈이기 때문에 Protection이 간단하다.

  - 주소 변경이 간단하게 MMU를 사용하여 relocation 해주면 가능하다.

  - Free memory 관리가 필요 없다. (Easy bookkeeping)

  - Internal Fragmentation이 존재한다. 

  - Partition의 개수 때문에 다중 프로그래밍의 정도가 결정된다.

  - 만약 Process 사이즈가 Partition 사이즈보다 크면 Swapping이나 Overlay를 사용하여 수행할 수 있다.


* Multiple-Partition Allocation

  - 가변 분할 다중 프로그래밍으로 각 작업이 필요한 만큼의 메모리만을 차지하게 함으로써 Internal Fragmentation을 없앨 수 있었다.

  - OS는 할당된 Partition과 Free Partition(Hole) 정보를 계속 알고 있어야 한다.

  - Hole : 이용 가능한 memory block으로 여러 프로세스가 할당되고 해제되면서 다양한 사이즈의 block이 생성된다.

  - Internal Fragmentation은 없지만, External Fragmentation이 존재한다. 

  - Free Hole 중에서 하나의 Hole을 선택하는 방법으로 다음과 같이 3가지가 존재한다.

      : First-fit : 충분히 큰 첫 번째 Hole에 할당한다.

           - 주소로 정렬된 Linked list 구조의 Free hole을 관리한다.

           - Job보다 size가 큰 partition을 발견하면 할당한다.

           - 주소로 정렬된 Free space이기 때문에 반납된 것을 합치는 데에 쉽다.

           - 찾는 시간이 오래 걸린다.

      : Best-fit : 충분히 큰 Hole 중에서 가장 작은 hole에 할당한다.

           - 오름차순으로 size 정렬된 Linked list 구조의 Free hole을 관리한다.

           - 할당하고 남은 hole은 Free hole이 size 정렬이므로 다시 정렬돼야 한다.

           - size가 큰 hole은 되도록 유지된다.

           - 매우 작은 hole이 많이 생길 확률이 높다. (External Fragmentation)

      : Worst-fit : 가장 큰 hole에 할당한다.

           - 내림차순으로 size 정렬된 Linked List 구조의 Free hold를 관리한다.

           - 큰 size의 Free hold가 많이 없을 것이다.

  - First-fit과 Best-fit은 대등한 성능을 지니며, Worst-fit이 제일 안 좋다.

  - 할당하는 측면에서는 Size로 정렬하는 것이 좋으며, 합치는 측면에서는 주소로 정렬하는 것이 좋다.


* Fragmentation

  - External Fragmentation 

      : Total memory는 할당할 수 있을 정도로 존재하지만 떨어져 있어서 할당할 수 없는 문제가 있다. 

      : 필요한 size대로 메모리를 할당할 때 발생한다.

      : 해결하기 위해서 떨어져 있는 것을 모을 수 있도록 Compaction(압축)을 사용하면 가능하다. 

      : 압축하기 위해서는 주소가 Relocatable Address 여야하고 Execution Time Binding이어야 하며 재배치가 동적이어야 한다. 

      : 메인 메모리에서는 압축이 어렵다.

      : 압축에는 버디 시스템 알고리즘을 사용할 수 있다.

      : 버디 시스템은 큰 버퍼들을 반복적으로 이등분하여 작은 버퍼를 만들어서, 가능할 때마다 인접한 Free buffer들을 합치는 과정을 반복하는 기법이다.

  - Internal Fragmentation

      : 할당에 요구된 Size를 할당해도 사용되지 않는 메모리가 있을 때의 문제가 있을 때를 의미한다

      : 고정된 size를 할당할 때 발생한다.


후기 및 정리

운영체제 메모리 관리에 대해 간단한 정리였습니다. 다음 글에서 메모리 관리를 마무리 하겠습니다.



조금의 도움이 되셨다면 로그인 없이도 가능한 댓글과

왼쪽 아래 ♥공감 버튼을 꾹 눌러주세요! 



728x90
반응형