ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 운영체제 05
    쾌락없는 책임 (공부)/운영체제 2021. 5. 19. 15:07
    반응형

    function(){ ... }


    서론

    보통 프로그래밍을 할 때 라이브러리나 출력 파일, 참조 파일 등 여러 파일들을 묶어(bind) 사용하게 됩니다. 이런 경우 어떤식으로 메모리에서 파일들을 묶을 수 있는지에 대해 알아봐야 합니다.

     

    Address Binding

    수행할 명령어나 데이터 등을 실제 메모리 주소로 연결하는 것으로 3가지 경우에서 발생하게 됩니다.

     

    1. 컴파일시 묶기 (Complie time binding)

     - 메모리에 올라갈 위치를 컴파일 단계에서 정하게 됩니다.

     - 파일을 로드할 시 위에서 정한대로 주소를 지정해주게 됩니다.

     - 그런데 해당 주소를 사용중이라면 다시 컴파일을 해야 해서 비효율적이라 할 수 있습니다.

     

    2. 로드시 묶기 (Load time binding)

     - 컴파일 시 상대적인 주소만 결정하게 됩니다.  (예시 : 메모리의 시작 주소에서 ~~만큼 떨어져 있다)

     - 로드시 메모리의 시작 주소가 결정되면서 빈 자리로 주소를 할당받게 됩니다.

     

    3. 실행시 묶기 (Execute time binding)

     - 위와 같이 컴파일시 상대적인 주소를 결정하게 됩니다.

     - 메모리 관리자인 MMU가 mapping을 해주게 됩니다.

     

    * MMU - Memory management unit

     - 논리 주소를 물리 주소로 바꿔주는 역할을 해줍니다. 위에서 만든 상대 주소를 실제 메모리의 주소로 바꿔주는 역할을 하고 있습니다.

     

     

    Dynamic Loading

    앞서 말한대로 여러 프로그램을 사용할 때 메모리에 어떻게 올려야할지 고민해야 합니다. 이 경우 사용시에만 메모리에 올리는 것입니다.

    디스크 메모리 - time1 메모리 - time2
    main(){ function() ... } main() {
    function() // 사용 선언
    }
    main() {
    function() // 사용 선언
    }
    function(){ ... }   funciton() {}
    // 메모리에 올라옴

     이런식으로 실행하면 메모리 공간을 많이 절약할 수 있습니다. 메러처리용 코드의 경우도 에러가 발생하지 않으면 사용하지 않아서 메모리를 많이 아낄 수 있습니다. 대신 한번 쓴 후 다시 로드시 동일한 메모리 주소가 비어있을 보장이 없으니 Dynamic Linking이 필요하게 됩니다.

     

    Dynamic Linking

     동적 연결의 경우 linking을 실행 시 한다는 것입니다. 이 경우 라이브러리를 많이 사용할 때 유용합니다.

     


    Swapping

     항상 생각해야 하는건 메모리의 물리적인 주소는 항상 부족합니다. 당장 노트북 컴퓨터에도 램 몇기가 이런식으로 제한되어 있기 때문에 메모리는 언제나 부족하게 됩니다. 이 경우 일시적으로 디스크에 넣은 뒤 사용시 다시 메모리로 올리는 교체, 즉 Swapping이 필요합니다. 그런데 단순히 swap만 한다고 모든것이 해결되는게 아니라 여러가지 고려해야 할것들이 있습니다. 그것들은 아래 글에서 천천히 나오게 됩니다.

     

    Contiguous Allocation

     메모리는 크게 2부분으로 분류됩니다. 하나는 OS를 위한 부분이고 다른 부분은 유저 프로세스를 위한 부분입니다. 주로 다루게 되는건 유저 프로세스와 관련한 메모리 할당입니다. (OS는 함부로 참조하거나 건드리면 무너지기 때문에 건들면 안됩니다.)

     OS / 유저 로 나뉘는건 Relocation Register가 분류해줍니다. 또 Limit Register가 논리 주소의 범위를 가지고 MMU가 주소를 동적으로 할당해 줍니다.

     

     여기까지가 서론이고 본격적인 Contiguous Allocation에 대한 이야기입니다. 메모리에서 연속으로 프로세스를 할당하는 것입니다.

    A A A
    B   D
    C C C

     그런데 이렇게 순서대로 메모리에 올리게 되면 구멍(Hole)이 생기게 됩니다. 각 프로세스마다 크기가 다르기 때문에 '남은 연속된 공간 < 새로 할당되어야 하는 공간' 인 경우 프로세스 할당이 어려줘지게 됩니다. (새로 들어오는 프로세스도 연속된 공간을 필요로 합니다)

     

     기본적으로 이런 주소는 OS가 관리를 하게 되는데 여기서 새로운 프로세스가 할당될 때 구멍을 고르는 방법이 3가지 있습니다.

    1. 처음으로 발견한 구멍 (First-Fit)
    2. 가장 작은 구멍 (Best-fit)
    3. 가장 큰 구멍 (Worst-fit)

     모두 다 프로세스가 들어갈만한 구멍이라고 쳤을 때 가장 좋은 경우는 구멍중 가장 작은 곳으로 들어가는 경우입니다. 그런데 이런 경우에도 문제가 생기게 되는데 아래 나올 External / Internal Fragmentation이 해당됩니다.

     

    <External / Internal Fragmentation>

     - External Fragmentation : 새로 할당되는 프로세스들을 안전하게 구멍에 넣었는데 그 결과 프로세스의 주소들이 연속적이지 않아 곳곳에 작은 구멍들이 생기게 되고 이 결과 '메모리 전체 주소 > 새 프로세스' 임에도 연속된 공간이 없어 프로세스 할당이 불가능한 문제입니다.

     - Internal Fragmentation : 프로세스마다 균등하게 메모리를 할당해 줬는데 모든 프로세스가 같은 크기를 가지는게 아니라서 결국 새 프로세스를 할당하지 못하는 결과를 불러오게 됩니다.

     

    때문에 한 프로세스를 연속으로 할당하면 메모리를 효율적으로 쓸 수 없다는 생각에 Paging 기법이 나오게 됩니다

    반응형

    '쾌락없는 책임 (공부) > 운영체제' 카테고리의 다른 글

    운영체제 07  (0) 2021.05.27
    운영체제 06  (0) 2021.05.27
    운영체제 04  (0) 2021.05.19
    운영체제 03  (0) 2021.04.10
    운영체제 02  (0) 2021.04.10

    댓글

Designed by Tistory.