1. 동적 로딩(Dynamic loading)
프로그램을 메모리에 동적으로 올린다는 것은 프로그램 전체를 메모리에 미리 다 올리는 것이 아니라, 필요할 때마다 해당하는 루틴을 메모리에 올리는 것을 말합니다.
프로그램이 실행될 때 프로그램 전체가 균일하게 사용되는 것이 아니라, 자주 사용되는 부분은 한정적이고, 오류 처리 루틴과 같이 가끔씩 사용되는 많은 양의 코드가 있습니다. 그래서 프로그램이 실행될 때마다 이것을 전부 메모리에 올리는 것은 비효율적이기 때문에, 미리 올려놓는 것이 아닌 필요할 때마다 메모리에 올리는 방식을 동적 로딩이라고 합니다.
여기서 주의해야할 개념이 한 가지 있습니다. 이후에 다룰 Paging 기법인데, Paging은 물리적인 메모리를 고정 크기의 페이지로 나누어 프로그램 실행 시 필요한 페이지를 메모리에 올리고 필요없는 페이지는 메모리에서 내리는 방식입니다. Paging 기법에서의 메모리 관리는 운영체제가 직접 관리하는 것이고, 동적 로딩은 운영체제가 지원하는 것이 아닌 프로그래머가 프로그램에 필요한 부분을 메모리에 동적으로 로드하는 것입니다.
현대의 운영체제에서는 이 두 가지 방법을 혼합해서 사용하기도 합니다. 예를 들어, 운영체제가 동적로딩을 쉽게 하도록 프로그래머에게 라이브러리 형태로 제공을 해줍니다. 그래서 현재는 프로그래머와 운영체제의 역할이 혼합되어 있긴 하지만, 동적 로딩이라는 개념은 프로그래가 명시적으로 지시하는 것을 말합니다.
2. 스와핑(Swapping)
스와핑은 프로세스를 일시적으로 메모리에서 backing store로 쫓아내는 것을 말합니다. Backing store는 메모리가 쫓겨난 후에 저장되는 곳이고, 많은 사용자의 프로세스 이미지를 담을만큼 충분히 빠르고 큰 저장 공간이 필요하기에 보통 하드디스크입니다.
메모리에서 쫓겨나는 것은 Swap out, 쫓겨났던 것이 다시 메모리로 올라오는 것이 Swap in이라고 합니다.
일반적으로 중기 스케줄러에 의해 Swap out 시킬 프로세스가 결정됩니다. 메모리에 너무 많은 프로그램이 올라가 있다면 중기 스케줄러가 일부 프로그램(CPU 우선 순위가 낮은 프로그램)을 통째로 디스크로 쫓아내는 데, 이 역할이 스와핑의 개념과 연결되어있는 것입니다.
스와핑 시스템이 지원되기 위해서는 이전 포스팅에서 살펴보았던 주소 바인딩과 연결해서 생각해야합니다. 만약 Compile time binding이나 Load time binding이 사용되고 있다면 Swap out 이후 다시 Swap in시에 다른 메모리 영역이 비어있더라도 반드시 원래의 위치로 올라와야합니다. 그렇기 때문에 스와핑 효과를 발휘하기가 어렵습니다. 스와핑이 좀 더 효율적으로 동작하기 위해서는 물리적 주소가 바뀌는 것과 상관없이 빈 메모리 영역 아무곳에나 올릴 수 있는 Run time binding이 지원되어야 합니다.
3. Dynamic Linking
Dynamic linking이란 linking을 실행 시간(execution time)까지 미루는 기법을 말합니다.
여기서 Linking이란 프로그램을 작성하고 컴파일 후, 링크 단계를 통해 여러 개의 컴파일된 파일들을 묶어 하나의 실행 파일을 만드는 과정입니다. 이때 프로그래머가 작성한 소스 파일 뿐만 아니라 필요한 라이브러리도 함께 링크됩니다. 라이브러리가 실행 파일에 포함되었는지의 여부에 따라 Static linking과 Dynamic linking으로 나뉩니다.
Static linking 에서는 라이브러리 코드가 실행 파일의 일부로 결합됩니다. 그래서 프로그램이 실행될 때마다 라이브러리 코드의 복사본이 메모리에 로드되어 실행파일의 크기가 커지고 메모리 낭비가 발생할 수 있습니다.
반면, Dynamic linking은 라이브러리 코드가 실행 파일에 직접 포함되지 않고 별도의 파일 형태로 존재합니다. 실행파일에는 라이브러리의 위치를 가르키는 포인터만 포함되고 프로그램 실행시 라이브러리 호출 부분에 도달하면 그 라이브러리를 찾아 메모리에 로드합니다. 이미 메모리에 올라와있으면 공유해서 사용합니다.
예를 들어 프로그램에서 printf라는 라이브러리 함수를 사용한다고 가정해보겠습니다. 이 라이브러리가 static linking이 이루어지게 되면 내가 만든 실행 파일 안에 prinf 라이브러리 함수가 포함되어있는 것입니다. 만약 프로그램 100개에 prinf 라이브러리 함수가 있고, 그 100개의 prinf문을 실행시키면 메모리에 100개의 똑같은 copy가 올라가게 됩니다. 그렇기 때문에 실행파일의 크기가 커기고 메모리 낭비가 발생합니다.
Dynamic linking을 사용하면 실행파일에 prinf 가 아닌 prinf가 실행되는 라이브러리의 위치만 프로그램에 있습니다. 프로그램을 실행하다가 prinf호출하는 위치에 도달하게 되면, prinf에 해당하는 라이브러리 파일을 찾아 메모리에 올려서 실행하고, 이미 메모리에 올라와 있다면 해당 메모리를 공유해서 사용하여 메모리 사용이 효율적입니다.
이렇게 Dynamic linking을 해주는 라이브러리를 Shared Library라고도 하며, 리눅스에서는 Shared Object, 윈도우에서는 DLL(Dynamic Linking Library)라고 합니다.
참고자료
[KOCW 이화여대 반효경 교수님 - Memory Management 1]
https://core.ewha.ac.kr/publicview/C0101020140425151219100144?vmode=f
[ Operating System Concepts - Abraham Silberschatz ]
https://www.yes24.com/Product/Goods/89496122
'CS > 운영체제' 카테고리의 다른 글
[운영체제] 8. 메모리 관리 : 불연속 할당, Paging 기법 (Memory Management 2) (0) | 2024.01.19 |
---|---|
[운영체제] 8. 메모리 관리 : 연속 할당 (Memory Management 1) (0) | 2024.01.19 |
[운영체제] 8. 메모리 관리 : 논리적 vs 물리적 메모리, 주소 바인딩, MMU (Memory Management 1) (0) | 2024.01.17 |
[운영체제] 7. Deadlocks : 데드락 (Deadlocks 1, 2) (0) | 2024.01.16 |
[운영체제] 6. 프로세스 동기화 : Monitor (Process Synchronization 4) (0) | 2024.01.16 |