로더(소프트웨어)
컴퓨터 운영체제에서 로더(Loader)란, 프로그램과 라이브러리를 RAM 등의 주 기억 장치에 적재하는 기능을 하는 코드 또는 프로그램이다.
로더는 크게 Relocation Loader와 Dynamic Linking Loader로 구분된다. 전자의 Relocation Loader는 Relocation Table을 이용해 디스크에 기록된 단일 프로그램을 읽은 후 적절하게 RAM에서 심볼과 오프셋으로 나타나는 코드와 데이터의 위치를 결정하고 배치하는 로더다. 후자의 Dynamic Linking Loader는 공유 라이브러리(Shared Library) 코드 파일을 읽은 후 다른 프로그램에 이를 연결하여 코드와 데이터를 적절히 합쳐 RAM에 배치한다.
프로그램 개발 및 실행 시에 수행하는 링커와 헷갈리면 안 된다. 보통 Dynamic Linking Loader가 Dynamic Linking을 수행하기 때문에 혼동이 올 수 있다. 소프트웨어 개발자의 관점으로 링커를, 소프트웨어 사용자의 관점으로 로더를 생각하면 어느 정도 구분이 가능하다.
범용 시스템이 아닌 임베디드 시스템에서 프로그램을 RAM에 적재하는 기능은 OS의 제어를 직접 받지 않고 DOS 시절처럼 저수준 함수로만 적재하는 경우가 있다. 이런 저수준 적재 기능을 하는 코드를 따로 스타트업 코드라고 부르는데, 가끔 RTOS에 내장된 저수준 스타트업 코드가 부트로더 로딩 등의 일반적인 OS 부팅 과정을 따르지 않고 고수준 프로그래밍 언어로 짠 프로그램을 바로 RAM에 올리는 경우가 있다.
- 모든 인터럽트 일시중지: 프로그램을 RAM으로 복사하는 과정이 막힐 수 있으므로 인터럽트를 끈다.
- ROM에서 RAM으로 데이터를 복사
- 초기화되지 않는 영역의 값(리눅스의 경우 오브젝트 파일의 .bss 영역)을 0으로 채움
- 스택 공간 할당 및 초기화
- 스택 포인터를 스택을 위해 할당한 메모리 공간에 설정
- 힙 공간 할당 및 초기화
- 인터럽트 활성화
- C++로 짠 OOP 개념이 있는 프로그램의 경우 전역 인스턴스 변수에 대한 생성자 호출 및 초기화가 이때 이루어진다.
- main 함수 호출
이 경우는 사실상 RAM에 올라간 단일 프로그램이 곧 운영체제라고 봐야 할 것이다.
한편 보조 기억 장치에서 주 기억 장치로 프로그램을 가져올 때 프로그램 코드/데이터를 배치할지 결정하는 전략은 3가지가 있다.
- Fetch 전략: 프로그램을 언제 가져올지 결정하는 전략이다. 요구 반입과 예상 반입이 있다.
- Placement 전략: 프로그램을 어디에 가져올지 결정하는 전략이다. 최초 적합(가장 먼저 만난 빈 영역)/최적 적합(가장 딱 맞는 영역)/최악 적합(가장 덜 맞는 영역, 프로그램의 총 메모리 할당량의 변동성이 크면 이것도 쓸 수 있다)
- Replacement 전략: 새 프로그램을 실행한다면 페이지 교체/메모리 스왑이 필요한 상황에서 어떻게 메모리로 새 프로그램을 끌고 올지 결정하는 전략이다.
- FIFO(선입선출 선택), OPT(가장 오랫동안 사용하지 않을 페이지를 교체하는 건데 현실적으로 불가능하다), LRU(가장 적게 쓴 페이지 선택), LFU(가장 자주 쓴 페이지 선택), NUR(참조 여부와 변형 여부를 보고 가장 덜 쓸 것 같은 페이지를 선택), FIFO를 보완한 SCR 등이 있다.