시스템 서비스

시스템 서비스 (System Services)

운영체제는 프로그램 실행을 위한 환경을 제공합니다. 또한 프로그램 및 해당 프로그램의 사용자에게 특정 서비스를 제공합니다. 물론 운영체제마다 제공하는 구체적인 서비스는 다르지만, 공통적인 범주로 구분할 수 있습니다.

운영체제가 제공하는 서비스 중 일부는 사용자에게 유용한 기능들로 다음과 같은 것들이 있습니다:

  • 사용자 인터페이스(User interface): 거의 모든 운영체제는 사용자 인터페이스(UI)를 갖고 있습니다. 이 인터페이스는 여러 형태를 가질 수 있습니다. 하나는 **커맨드라인 인터페이스(CLI)**로, 텍스트 명령어를 사용하고 이를 입력하는 방식입니다. 또 다른 하나는 **배치 인터페이스(batch interface)**로, 명령어와 지시문을 파일에 입력해 놓고 그 파일을 실행하는 방식입니다. 가장 일반적으로는 **그래픽 사용자 인터페이스(GUI)**가 사용됩니다. 일부 시스템은 이 중 두 가지 또는 세 가지 방식 모두를 제공합니다.

  • 프로그램 실행(Program execution): 운영체제는 프로그램을 메모리에 적재하고 해당 프로그램을 실행할 수 있어야 합니다. 프로그램은 정상적으로든 오류로든 실행을 종료할 수 있어야 합니다.

  • 입출력 작업(I/O operations): 실행 중인 프로그램은 파일 또는 I/O 장치와 관련된 입출력 작업을 요구할 수 있습니다. 효율성과 보호를 위해 사용자가 I/O 장치를 직접 제어하는 것은 허용되지 않으며, 운영체제가 이를 대신 처리할 수단을 제공합니다.

  • 파일 시스템 조작(File-system manipulation): 프로그램은 파일과 디렉터리를 읽고 쓰거나, 생성 및 삭제하거나, 특정 파일을 검색하거나, 파일 정보를 나열하는 등의 작업을 필요로 합니다. 운영체제는 이러한 작업을 수행하는 프로그램을 제공합니다.

  • 통신(Communications): 프로세스들은 같은 컴퓨터 내에서 또는 네트워크를 통해 서로 정보를 교환할 수 있습니다. 통신은 공유 메모리(shared memory) 또는 메시지 전달(message passing)을 통해 구현될 수 있습니다. 이 때 정보 패킷은 운영체제에 의해 프로세스 간에 이동합니다.

  • 오류 감지(Error detection): 운영체제는 잠재적인 오류를 항상 인지하고 있어야 합니다. 오류는 CPU나 메모리 하드웨어(예: 메모리 오류나 전원 오류), I/O 장치(예: 디스크의 패리티 오류), 사용자 프로그램 내부에서 발생할 수 있습니다. 이러한 오류 각각에 대해 운영체제는 정확하고 일관된 계산이 이루어지도록 적절한 조치를 취해야 합니다.

또한 운영체제는 **시스템 자체의 효율적인 운영을 보장하기 위한 함수 집합(system functions)**도 제공합니다. 여기에 포함되는 서비스는 다음과 같습니다:

  • 자원 할당(Resource allocation): 여러 사용자나 작업이 동시에 실행되는 경우, 각 작업에 자원을 적절히 할당해야 합니다. 운영체제는 다양한 자원을 관리합니다. 일부 자원(예: CPU 사이클, 주기억장치, 파일 저장소 등)은 특별한 할당 코드가 필요하지만, I/O 장치처럼 공통적으로는 요청 및 해제 메커니즘을 사용합니다.

  • 회계(Accounting): 어떤 사용자가 얼마나 많은, 어떤 종류의 자원을 사용하는지 추적할 필요가 있습니다. 이러한 기록은 과금 목적이나, 사용 통계 수집에 활용될 수 있습니다.

  • 보호 및 보안(Protection and security): 컴퓨터 시스템이 다중 사용자 환경이거나 여러 프로세스를 동시에 실행한다면, 각 프로세스는 서로의 활동으로부터 보호되어야 합니다. 보호는 모든 실행 중인 프로그램과 사용자가 서로 간섭하지 못하도록 보장합니다. 외부로부터의 보안 역시 중요합니다. 보안은 일반적으로 사용자가 시스템 자원에 접근하기 위해 인증(예: 비밀번호)을 거치는 것부터 시작되며, 모뎀이나 네트워크 어댑터와 같은 외부 I/O 장치에 대한 접근 시도 기록 및 불법 접속 탐지까지 확장됩니다.


링커와 로더 (Linkers and Loaders)

프로그램이 실행되기 전에, 반드시 컴파일(compilation), 링크(linking), 로딩(loading) 과정을 거쳐야 합니다.

  • 컴파일은 고급 언어 프로그램을 기계어(오브젝트 코드)로 변환하는 작업입니다.

  • 프로그램이 여러 개의 오브젝트 모듈로 구성된 경우, 이들을 연결해야 하며 이 작업을 **링커(linker)**가 수행합니다.

  • 링커는 이들 모듈을 하나의 실행 가능한 파일로 결합합니다.

경우에 따라, 프로그램은 **라이브러리 모듈(library module)**을 포함하여 작성됩니다. 라이브러리는 사전에 컴파일된 루틴들의 집합이며, 프로그램에 링크될 수 있습니다. 이러한 라이브러리 루틴은 정적으로(static) 또는 동적으로(dynamic) 링크될 수 있습니다.

  • 정적 링크(static linking): 라이브러리 루틴이 실행 파일 내부로 직접 포함됨

  • 동적 링크(dynamic linking): 실행 시간에 라이브러리 코드가 메모리에 로드되며, 여러 프로그램이 공유 가능함

링킹이 완료되면, 프로그램은 실행되기 전에 메모리에 로드되어야 합니다. 이 작업은 **로더(loader)**가 수행합니다.

  • 로더는 실행 파일을 메모리에 로딩하고,

  • 코드, 데이터, 스택 영역을 구성하며,

  • 레지스터와 스택 포인터를 초기화하고,

  • 프로그램의 진입점(entry point)으로 제어를 넘깁니다.

현대 운영체제는 종종 **공유 라이브러리(shared libraries)**를 사용하여 동적 링크를 지원합니다.

  • 프로그램이 동적으로 링크되는 경우, 실행 중에 **동적 링커(dynamic linker)**에 의해 라이브러리 연결이 수행됩니다.

  • 이 방식은 실행 파일의 크기를 줄이고, 라이브러리를 수정하더라도 프로그램을 다시 컴파일할 필요 없이 바로 반영할 수 있게 해줍니다.


위 내용은 《운영체제 개념 10판》의 2.4절과 2.5절 전체 원문한국어로 직역한 전체 내용입니다. 다음 절인 2.6 Operating-System Design and Implementation으로 넘어가시겠습니까?

Last updated