[시스템프로그래밍] System Program - Compilation System, Runtime System, Operation System

컴파일, 런타임, 운영체제 구성 프로그램


이 포스팅은 시스템 프로그램(System Program)에 대해 정리한 내용이다. 시스템 프로그램은 운영체제 자체는 아니지만, 프로그램 개발 및 실행 환경을 제공하고 컴퓨터 시스템 운영을 돕는 중요한 소프트웨어들의 집합이다. 여기서는 시스템 프로그램을 컴파일레이션 시스템, 런타임 시스템, 운영체제 세 가지 주요 카테고리로 나누어 각 구성 프로그램을 상세히 정리하고자 한다. 이 분석은 컴파일 과정, 프로그램 실행 환경, 운영체제의 역할을 이해하는 데 중점을 둔다.


배경 지식 : 폰 노이만 구조(Von Neumann Architecture)

현대 컴퓨터 시스템을 이해하는 첫걸음은 그 기본 구조인 폰 노이만 구조(Von Neumann Architecture)를 파악하는데 있다. 과거 초창기 컴퓨터들이 특정 연산을 위해 전선을 수동으로 연결하고 재배치해야 했던 방식과 근본적으로 다르다. 폰 노이만 구조의 가장 큰 혁신은 프로그램 내장 방식(Stored-Program Concept)에 있다. 이는 실행할 프로그램 명령어들을 데이터와 동일하게 취급하여, 중앙처리장치(CPU)가 접근할 수 있는 주 기억장치(메모리)에 함께 저장하는 개념이다.

Before Von Neumann


이 구조 덕분에 컴퓨터는 메모리에 저장된 명령어를 순차적으로 읽어와 실행함으로써, 하드웨어 변경 없이도 다양한 프로그램을 유연하게 처리할 수 있게 되었다. 즉, 전선을 옮겨 꽂던 물리적 작업이 메모리에 프로그램을 '쓰는' 논리적 작업으로 대체된 것이다. 이러한 프로그램 내장 방식은 오늘날 복잡한 소프트웨어의 개발과 실행을 가능하게 하는 기반으로, 시스템 운영의 복잡성을 관리하고 사용자 및 응용 프로그램에게 일관된 환경을 제공하기 위한 시스템 프로그램의 등장을 필연적으로 야기했다. 이어지는 내용을 통해 이러한 시스템 프로그램들을 주요 역할에 따라 분류하여 상세히 살펴보겠다.

Von Neumann Architecture



1. 컴파일레이션 시스템 (Compilation System)

컴파일레이션 시스템작성된 소스 코드(Source Code)를 컴퓨터가 실행할 수 있는 기계어(Machine Code)로 변환하는 전 과정을 지원하는 시스템 프로그램들의 집합이다. 소스 코드 변환부터 실행 파일 생성까지의 단계를 포함한다.

Compilation process


  • 편집기 (Editor): 개발자가 소스 코드를 작성하고 수정하는 환경을 제공하는 프로그램이다. 메모장, VS Code, Vim 등이 대표적인 예시이다.
  • 컴파일러 (Compiler): 고급 프로그래밍 언어(C, Java 등)로 작성된 소스 코드를 저급 언어(주로 어셈블리 언어 또는 목적 코드)로 번역하는 핵심 프로그램이다. 이 과정에서 문법 검사코드 최적화 작업이 이루어진다. C/C++과 같은 고수준 언어는 컴파일 시스템을 통해 기계 독립적인 코드에서 기계가 이해할 수 있는 바이너리 코드(Binary Code)로 변환된다.
  • 어셈블러 (Assembler): 컴파일러가 생성한 어셈블리 언어(Assembly Language) 코드를 CPU가 직접 이해할 수 있는 기계어(바이너리 코드)로 변환하여 목적 파일(Object File)을 생성한다.
  • 링커 (Linker): 컴파일러와 어셈블러가 생성한 여러 개의 목적 파일들과 필요한 라이브러리 파일(Library File)들을 결합하여 하나의 실행 가능한 파일(Executable File)을 생성한다. 또한, 파일 간의 함수 호출과 같은 외부 참조(External Reference) 해결 및 최종 메모리 주소 할당이라는 중요한 역할을 수행한다.
  • 로더 (Loader): 생성된 실행 파일을 보조 기억 장치(디스크)에서 주기억 장치(메모리)로 적재(Loading)하고, CPU가 실행할 수 있도록 준비시키는 역할을 한다. 로더는 운영체제의 일부로 간주되기도 한다. 로딩 과정은 디스크에 있는 실행 파일(예: hello.out)을 메모리로 가져오는 것을 포함한다.
  • 디버거 (Debugger): 프로그램 실행 중에 발생하는 오류(버그, Bug)를 찾고 수정하는 데 사용되는 필수적인 도구이다. 코드 단계별 실행, 변수 값 확인, 중단점(Breakpoint) 설정 등의 다양한 기능을 제공하여 개발자가 효과적으로 오류를 해결하도록 돕는다.

2. 런타임 시스템 (Runtime System)

런타임 시스템프로그램이 실제로 실행되는 동안 필요한 환경과 서비스를 제공하는 시스템 프로그램들의 집합이다. 프로그램 실행 환경시스템 자원 접근을 관리한다.

Runtime system


  • 라이브러리 (Library): 자주 사용되는 기능들을 미리 컴파일된 코드 형태로 모아 놓은 것이다. 예를 들어, 입출력 함수(printf()), 수학 함수 등이 있다. 라이브러리는 링커에 의해 실행 파일에 포함되거나(정적 라이브러리, Static Library), 프로그램 실행 시 메모리에 로드되어 사용된다(동적 라이브러리, Dynamic Library). printf() 함수는 표준 라이브러리(stdio.h)의 일부이며, 사용자 공간에서 write() 시스템 콜(System Call)을 대행하는 역할을 한다.
Standard Library

  • 명령어 (Commands): 사용자가 특정 작업을 수행하기 위해 셸(Shell) 등을 통해 입력하는 지시어 또는 해당 지시어에 연결된 프로그램이다. ls, copy, gcc 등이 대표적인 예시이다.
  • 셸 (Shell): 사용자와 운영체제 커널(Kernel) 사이의 인터페이스 역할을 하는 명령어 해석기이다. 사용자의 명령을 입력받아 해석하고, 해당 프로그램을 실행하거나 시스템 콜을 호출한다. Bash, PowerShell 등이 널리 사용되는 셸이다.
Commands & Shell

  • 유틸리티 (Utilities): 시스템 관리, 파일 관리 등 특정 목적을 수행하는 보조 프로그램들이다. 디스크 포맷 도구, 파일 비교 도구 등이 그 예이다.
  • 윈도우 시스템 (Windows System): 그래픽 사용자 인터페이스(GUI) 환경에서 화면 출력, 윈도우 창 관리, 마우스/키보드 입력 처리 등을 담당하는 시스템을 의미한다. 여기서 'Windows'는 특정 운영체제와 구분되는 일반적인 GUI 시스템을 지칭할 수 있다.

3. 운영체제 (Operating System)

운영체제(OS)시스템 프로그램 아래 계층에 위치하며, 하드웨어를 직접 관리하고 응용 프로그램 및 시스템 프로그램에게 일관된 인터페이스와 자원(Resource)을 제공하는 핵심 소프트웨어이다. 자원 관리, 프로세스 관리, 메모리 관리 등이 주요 기능이다.

Operating System


  • 스케줄러 (Scheduler): CPU 자원 할당을 관리한다. 여러 프로세스(Process) 또는 스레드(Thread) 중 어떤 프로세스에게 CPU를 할당할지, 그리고 얼마나 오랫동안 사용하게 할지를 결정한다. 시스템의 처리율(Throughput), 응답 시간(Response Time), 공정성(Fairness) 등을 고려하여 CPU 사용을 최적화한다. (CPU 스케줄링)
  • IPC (Inter-Process Communication): 동시에 실행되는 독립적인 프로세스들이 서로 데이터를 교환하거나 작업을 동기화(Synchronization)할 수 있도록 하는 메커니즘을 제공한다. 공유 메모리(Shared Memory), 메시지 큐(Message Queue), 파이프(Pipe) 등이 대표적인 예시이다. (프로세스 간 통신)
  • 파일 시스템 (File System): 저장 장치 내 데이터의 체계적 관리를 담당한다. 보조 기억 장치(HDD, SSD 등)에 파일을 저장, 구성, 접근, 관리하는 방식을 정의하며, 파일 생성/삭제/읽기/쓰기, 디렉토리 구조 관리, 접근 권한 제어 등의 기능을 수행한다. 파일 생성 시 운영체제는 디스크에 inode를 할당하고 데이터 블록을 관리한다.
  • 장치 드라이버 (Device Driver): 하드웨어운영체제 간의 인터페이스 역할을 한다. 운영체제가 특정 하드웨어 장치의 복잡한 내부 동작 방식을 알지 못해도 해당 장치를 제어하고 통신할 수 있도록 표준화된 인터페이스를 제공하는 소프트웨어이다. (하드웨어 제어)
  • 가상 메모리 (Virtual Memory): 메모리 관리추상화를 제공한다. 실제 물리 메모리(RAM)의 크기 제약을 넘어선 더 큰 주소 공간(Address Space)을 각 프로세스에게 제공하는 것처럼 보이게 하는 기술이다. 보조 기억 장치를 RAM의 확장 공간처럼 사용하며, 프로세스 간 메모리 보호 기능도 제공한다. 핵심은 주소 변환(Address Translation)이다.
  • 프로토콜 스택 (Protocol Stack): 네트워크 통신 규약 구현을 담당한다. 컴퓨터 네트워크를 통해 데이터를 주고받기 위한 통신 규약(프로토콜, Protocol)들의 계층적 집합(예: TCP/IP 스택)을 구현한다. 데이터의 캡슐화/역캡슐화, 주소 지정(Addressing), 라우팅(Routing), 오류 제어, 흐름 제어 등 네트워크 통신에 필요한 제반 기능을 계층별로 나누어 처리한다.


결론

지금까지 시스템 프로그램컴파일레이션 시스템, 런타임 시스템, 운영체제 세 가지 주요 영역으로 나누어 각 구성 요소의 역할과 중요성을 정리해 보았다. 이러한 다양한 시스템 프로그램들은 우리가 컴퓨터를 효율적으로 사용하고, 소프트웨어 개발 및 실행을 가능하게 하는 기반을 이루는 핵심 요소들이다. 이 정리가 시스템 프로그래밍 학습에 도움이 되기를 바란다.


추천글:

[시스템프로그래밍] Data Representation - number, data storing, data types, byte ordering

hyeon_B

안녕하세요! AI 기술을 이용해 더 나은 세상을 만들어 나가고 싶은 과기원생 Hyeon이라고 합니다. 저는 앞으로 인공지능 시대에는 지식을 '활용'하는 능력이 중요해질 것이라고 생각합니다. 대부분의 일들은 인공지능이 뛰어난 모습을 보이지만, 인공지능은 데이터로 부터 연관관계를 학습하기 때문에 지식들을 새로 통합해서 활용하는 능력이 부족합니다. 인공지능이 뉴턴 전에 만들어졌다면 사과가 떨어지는 이유에 대답하지 못했을 것이고, 아인슈타인 전에 만들어졌다면 중력이 어떻게 생기는지 설명하지 못했을 것입니다. 따라서 앞으로 우리는 '본질'을 탐구하고 그 본질로부터 다른 곳에 적용하며 인공지능을 현명하게 활용해야 할 것입니다. 함께 인공지능 시대를 준비합시다!

댓글 쓰기

다음 이전

POST ADS1

POST ADS 2