[OS] Operating System - Dynamic Loading & Memory Allocation

2024. 2. 12. 16:48CS/OS

Dynamic Loading

 

프로그램이 실행될 때 프로그램과 관련이 된 데이터가 모두 물리적 메모리에 존재해야 하는가?라는 질문에 대한 답이 될 수 있는 것이 다이내믹 로딩이다. 다이내믹 로딩은 프로그램이 실행을 하고 해당 프로세스에서 관련 기능을 호출하여 데이터를 로드할 때 그때서야 데이터를 로딩하는 것이다. 그렇기에 불필요한 데이터를 먼저 로딩하지 않기에 메모리의 공간을 좀 더 효율적으로 사용할 수 있다.

 

  1. 프로그램 시작
    1. 프로그램이 시작이 되면 디스크에서 메모리로 프로그램이 로드가 된다.
    2. 이때 다이나믹 로딩을 사용하기에 필수적이지 않는 데이터들은 로드가 되지 않는 상태로 메모리에 존재하게 된다.
  2. 함수 호출
    1. 사용자 또는 프로그램에 의해 특정 기능이 필요할 때, 해당 기능을 포함하는 모듈이나 라이브러리의 호출이 발생한다
  3. 동적 로드 검사
    1. 시스템은 해당 함수나 모듈이 이미 메모리에 로드되었는지를 확인한다
  4. 로드 필요 시  실행
    1. 만약 필요한 모듈이 메모리에 로드되지 않았다면, 시스템은 해당 모듈을 디스크에서 찾아 메모리로 로드한다
  5. 주소 바인딩
    1. 로드된 모듈이나 함수의 주소를 프로그램의 실행 코드에 바인딩하여, 호출이 이루어질 수 있도록 한다
  6. 실행 및 해제
    1. 필요한 기능이 실행된 후, 해당 모듈은 메모리에 계속 남아 있거나, 더 이상 필요하지 않을 경우 해제된다

DLL - Dynamic Linking Libraries

 

시스템 라이브러리는 유저의 프로그램이 실행될 때 링크(연결)가 된다. 이때 Link의 과정에는 두 개의 종류가 존재한다. 

  • static linking - 정적 연결
    • 실행 파일이 생성될 때 모든 라이브러리 코드가 사용자의 프로그램에 포함이 되는 경우이다
    • 라이브러리의 함수들이 최종 실행 파일 내에 직접 복사되어, 실행 시 라이브러리를 외부에서 참조할 필요가 없다
    • 장점
      • 실행 파일은 라이브러리의 변경에 영향을 받지 않는다
      • 필요한 코드가 모두 포함되어 있기에 독립적으로 실행 가능하다
    • 단점
      • 실행 파일의 크기가 증가
      • 라이브러리 업데이트 시 관련된 모든 응용 프로그램을 다시 컴파일해야 한다
  • dynamic linking - 동적 연결
    • 실행 파일이 작성될 때 모든 라이브러리 코드가 포함되지 않는 경우이다
    • 프로그램이 실행이 될 때 필요한 라이브러리가 메모리에 로드되고, 프로그램이 해당 라이브러리를 참조하여 실행
    • 장점
      • 동일한 라이브러리를 여러 프로그램이 공유할 수 있게 해 메모리 사용의 효율성 증가
      • 라이브러리를 업데이트할 때 해당 라이브러리를 사용하는 모든 프로그램에 자동으로 적용된다
    • 단점
      • 라이브러리의 변경  및 제거, 호환성 문제 발생 시 실행을 진행하면서 문제가 발생할 수 있다.

 

Memory Allocation

 

Contiguous Memory Allocation - 연속 메모리 할당

 

 메모리를 가장 효율적으로 할당하기 위해, 시스템 메모리는 일반적으로 두 개로 나눠진다. 나눠지는 메모리는 각각 운영체제 부분과 사용자 프로세스 용으로 나눠진다. 여러 개의 사용자 프로세스가 동시에 메모리에 있을 수 있으며, 메모리에 있는 프로세스들을 어떻게 할당할지 결정해야 한다. 이때 각 프로세스는 메모리의 단일 섹션에 포함되며, 이 섹션은 다음 프로세스를 포함하는 섹션과 연속적으로 배치가 된다.


 

메모리의 할당 방법

 

가변 파티션 스킴(Variable-Partition Scheme)

  • 메모리에 가변 크기 파티션을 할당하여 각 파티션에 정확히 하나의 프로세스를 할당하는 방법이다. 이때 홀(hole)은 사용 가능한 메모리 블록을 의미한다.

 

메모리 할당

동적 저장소 할당 문제 - 사용 가능한 홀 목록에서 특정 크기의 요청을 만족시키는 방법에 대한 문제이다. 

  • FIrst Fit : 크기에 요구조건에 맞는 홀 중에 큰 첫 번째 홀에 할당한다
  • Best Fit : 크기에 요구조건에 맞는 홀 중에 가장 작은 홀을 할당
  • Worst Fit : 크기 요구조건을 상관하지 않고 가장 큰 홀에 할당한다.

 연속 메모리 할당의 경우 메모리를 효율적으로 사용하고 프로세스 간의 메모리 할당을 용이하게 하기 위해 각 프로세스를 메모리에 연속적 세션에 배치하는 것을 목표로 한다. 해당 방식은 단순하고 직관적으로 메모리를 관리하는 방식이지만 외부 단편화와 같은 문제가 발생할 수 있다. 그렇기에 이러한 문제를 해결하기 위해 다양한 메모리 할당 기법이 개발되었다.

 

단편화

 

메모리 관리에서 중요한 문제이다. 메모리가 효율적으로 사용되지 않아 프로세스가 요구하는 메모리 공간을 할당할 수 없는 상황을 의미한다.

 

외부 단편화(External Fragmentation)

  • 메모리가 여러 작은 홀들로 조각나 있어 총 메모리 공간은 충분하지만, 연속된 공간이 없어 프로세스 요구를 만족시키지 못하는 상황

내부 단편화(Internal Fragmentation)

  • 프로세스에 할당된 메모리 블록이 실제 프로세스 사용량보다 클 때 발생
  • 할당된 메모리 내부에 사용되지 않는 부분이 생기는 것이므로, 메모리 할당 단위에 의해 발생한다