PromleeBlog
sitemap
aboutMe

posting thumbnail
운영체제는 어떻게 구성될까? - 하루 10분 운영체제 2일차
How is an Operating System Structured? - Ten-Minute Operating System Day 2

📅

🚀

들어가기 전에 🔗

우리가 컴퓨터를 사용할 때 운영체제는 뒤에서 조용히 많은 일을 하고 있습니다. 하지만 그 내부 구조는 어떤 모습일까요? 이번 글에서는 운영체제의 구조를 구성하는 핵심 요소들을 쉽게 풀어보며 설명해 보겠습니다.
운영체제는 마치 잘 짜인 회사처럼, 다양한 부서(모듈)가 협업하며 일합니다. 사용자와 소통하는 부서도 있고, 시스템 깊숙한 곳에서 자원을 조정하는 부서도 있죠. 그 각각의 구성 요소를 하나하나 살펴보겠습니다.

🚀

운영체제 서비스 🔗

운영체제는 여러 가지
서비스
를 제공합니다. 이 서비스들은 사용자가 프로그램을 편리하게 실행할 수 있도록 도와주는 기능입니다.
대표적인 운영체제 서비스는 다음과 같습니다
이 서비스들을 통해 운영체제는 사용자와 응용 프로그램이 원하는 기능을 자연스럽게 사용할 수 있게 해줍니다.

🚀

사용자와 운영체제 인터페이스 🔗

사용자는 운영체제와 어떻게 소통할까요? 두 가지 방법이 있습니다
CLI
는 개발자나 전문가들이 주로 사용하는 방식이며, 명령어를 직접 입력합니다. 반면에
GUI
는 우리가 일반적으로 사용하는 윈도우 환경처럼 아이콘과 창으로 구성된 인터페이스입니다.
CLI 예시 - Powershell
CLI 예시 - Powershell
GUI 예시 - 파일탐색기
GUI 예시 - 파일탐색기

🚀

시스템 콜이란? 🔗

사용자 프로그램이 운영체제의 기능을 사용하려면
시스템 콜 - System Call
을 사용해야 합니다. 시스템 콜은 운영체제의 기능을 호출하는 공식적인 통로입니다.
예를 들어, 파일을 열거나 메모리를 요청하는 등의 동작은 사용자 프로그램이 직접 하지 못하고, 시스템 콜을 통해 운영체제에게 부탁합니다.
Java, C, Python 같은 언어에서 파일을 열 때 사용하는 함수들 뒤에는 시스템 콜이 숨겨져 있습니다.
int fd = open("example.txt", O_RDONLY);
이 함수는 실제로 운영체제에 파일을 여는 시스템 콜을 요청하는 예시입니다.

🚀

시스템 서비스와 링커, 로더 🔗

운영체제는 시스템 콜을 제공하는 것 외에도, 시스템이 부팅되거나 프로그램이 실행될 때 다양한
시스템 서비스
를 제공합니다. 여기에는 링커와 로더가 포함됩니다.
이 두 요소는 프로그램 개발과 실행 과정에서 매우 중요한 역할을 하며, 대부분의 운영체제에서 기본으로 제공됩니다.
image
이 흐름도를 간략하게 정리하면 다음과 같습니다
  1. Source Code (소스 코드)
    개발자가 작성한 프로그램의 원본 코드 (ex. .c, .cpp, .java 등)
  2. Compiler (컴파일러)
    소스 코드를
    기계어로 번역한 목적 파일(Object File)
    로 변환함
    ➤ 결과: .o, .obj 파일 생성됨
  3. Linker (링커)
    목적 파일들을 하나로 연결해서 실행 가능한 실행 파일로 만듦
    주요 역할: 여러 개의 목적 파일을 하나로 묶음, 다른 파일에 정의된 함수나 변수 참조(외부 심볼) 해결
  4. Executable File (실행 파일)
    링커의 결과물로 나온 프로그램 실행 파일
    ➤ 예: a.exe, a.out
  5. Loader (로더)
    실행 파일을 메모리에 적재하고 실행을 시작함
    주요 역할: 실행 파일을 메모리에 올림, 시작 주소(엔트리 포인트)로 점프하여 프로그램 실행 시작
  6. Program Running (프로그램 실행)
    프로그램이 실제로 동작하는 단계입니다.

🚀

운영체제에 따라 프로그램이 다른 이유 🔗

같은 프로그램도 윈도우와 리눅스에서 실행 파일이 다르게 만들어지는 이유는 운영체제가 서로 다른 시스템 콜, 파일 시스템, 메모리 구조 등을 가지고 있기 때문입니다.
예를 들어 윈도우에서 만든 .exe 파일은 리눅스에서 그대로 실행되지 않습니다. 이는 운영체제가 다르면 내부 구조와 약속이 다르기 때문입니다.

🚀

운영체제의 설계와 구현 🔗

운영체제는 크게 두 가지 단계로 만들어집니다
운영체제의 설계는 모놀리식, 계층형, 마이크로커널 등 다양한 방식이 있으며, 각 방식마다 장단점이 존재합니다.
설계방식 (참고만)
설계방식 (참고만)

모놀리식 커널 (Monolithic Kernel) 🔗

정의: 운영체제의 핵심 기능(파일 시스템, 드라이버, 메모리 관리 등)을 커널 하나에 전부 넣은 구조

마이크로커널 (Microkernel) 🔗

정의: 커널은 꼭 필요한 기능(메모리 관리, IPC 등)만 담당하고, 나머지는 서버 형태로 사용자 공간에서 동작
항목모놀리식 커널마이크로커널
구조하나의 큰 커널작은 커널 + 사용자 공간 서버
속도빠름상대적으로 느림
안정성낮음 (전체가 죽을 수 있음)높음 (분리되어 있어 안전함)
예시 OSLinux, WindowsMinix, QNX, 일부 macOS 구조

🚀

운영체제의 빌딩과 부팅 🔗

운영체제가 만들어지고 나면, 이를 컴퓨터가 인식하고 실행할 수 있도록 빌드(build)하고 부팅(boot)해야 합니다.
부트로더(bootloader)는 부팅 과정의 시작을 담당하며, GRUB 같은 도구가 여기에 해당합니다.

🚀

운영체제 디버깅 🔗

운영체제를 만드는 과정에서도 오류가 발생할 수 있습니다. 이를 확인하고 수정하는 과정이
디버깅
입니다.
운영체제의 디버깅은 일반 프로그램보다 훨씬 어렵고 민감한 작업이지만, QEMU, GDB, VirtualBox 같은 도구를 통해 가상환경에서 비교적 안전하게 진행할 수 있습니다.

🚀

요약 🔗

이번 글에서는 운영체제가 어떻게 구성되어 있는지를 하나하나 살펴보았습니다. 사용자와의 소통 방식부터, 내부적으로 프로그램을 실행하는 방법, 운영체제의 구조와 설계 방식까지 다양한 요소들이 유기적으로 연결되어 있다는 것을 확인할 수 있었습니다.
다음 편에서는 컴퓨터에서 가장 기본적인 단위인 '프로세스'에 대해 자세히 알아보겠습니다.

참고 🔗