시스템 서비스
시스템 서비스 (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