[리눅스 시스템 프로그래밍] 1. 들어가기에 앞서

리눅스(Linux)는 “Lnux Is Not UniX.”라는 의미의 운영체제입니다. 리눅스가 유닉스가 아니라고 이름을 부여한 이유는 유닉스와 매우 흡사한 운영체제이지만 상업적인 목적이 아닌 정보 공유 목적으로 만든 GNU의 대표적인 프로젝트입니다.

시스템 프로그래머를 꿈꾸는 이들에게 운영체제와 운영체제에서 제공하는 시스템 호출 및 자료구조를 이해하는 것은 필수적입니다. 리눅스는 이러한 이들에게 무료로 제공하며 전체 소스 코드를 볼 수 있어 시스템을 분석하고 학습하는데 최적인 운영체제입니다.

운영체제는 컴퓨터 시스템을 구성하는 H/W와 S/W를 운영하는 소프트웨어입니다. 대표적인 운영체제에는 유닉스, 윈도우즈, 리눅스 등의 Non RTOS(Real Time OS)와  VxWorks나 pSoS등의 RTOS와 WinCE, RT Linux 등의 Like as RTOR 등이 있습니다.

RTOS는 태스크마다 우선순위를 부여하여 중요한 태스크를 수행 요청하면 약속한 시간 이내에 실행하는 것을 보장합니다. 이에 반해 Non RTOS는 여러 개의 태스크를 수행 요청하면 순차적으로 대기 큐에 대기합니다. 그리고 CPU를 점유하고 있는 태스크는 특정 시간이 지나면 대기 큐의 맨 뒤에 보관해 대기하고 대기 큐 맨 앞의 태스크를 꺼내와서 CPU를 점유하는 것을 반복합니다.

리눅스나 윈도우즈 운영체제를 공부하다 보면 마치 우선 순위 기반의 스케쥴링을 수행하는 것처럼 소개하지만 전산학에서 말하는 우선 순위 기반의 스케쥴링 방식은 아닙니다. 리눅스나 윈도우즈 운영체제에서는 대기 큐를 여러 개를 두어 중요한 태스크는 앞쪽의 대기 큐에 대기하고 중요하지 않은 태스크는 뒤쪽의 대기 큐에 대기하는 정책을 두어 중요한 태스크가 중요하지 않은 태스크보다 많은 시간 CPU를 점유할 수 있습니다.

운영체제는 이처럼 누가 CPU를 사용할 것인지를 결정하는 스케쥴링을 담당하는 스케쥴러를 포함합니다. 그리고 운영체제는 프로그램을 실행하면 프로그램 이미지를 메모리에 로딩하고 수행에 필요한 각종 자료구조를 위해 필요한 메모리를 할당하고 관리합니다. 그리고 이 외에도 프로세스(실행 중인 프로그램)의 요청에 맞게 디바이스 드라이버를 통해 하드웨어를 제어하는 역할을 수행합니다. 이러한 운영체제의 주요 역할을 담당하는 부분을 커널(Kernel)이라 부릅니다.

이 외에도 운영체제에서는 디바이스 드라이버와 쉘, 유틸리티 프로그램이나 사용자 인터페이스를 제공합니다.