비전공자를 위한 CS 지식: 6. 운영체제 기초

xellos·2023년 2월 18일
0

CS

목록 보기
6/7

목표

개발자로 근무하면서 기획자나, QA, 운영하시는 분들께 종종 질문들을 받습니다.

  • 레디스랑, Kafka 랑 뭐가 다른거에요?
  • 왜 로그파일은 실시간으로 쌓이지 않고 약간의 딜레이가 있나요?
  • 이번에 문제가 발생한 서버는 왜 메모리만 더 추가하면 되나요?
  • 왜 파일로 저장하지 않고 캐시(메모리)를 쓰는건가요, 그렇게 느린가요? 왜 느린거에요?

위와 같은 다양한 질문들을 받고 설명할 때, 경력과 근무하시는 환경에 따라 CS에 대한 이해가 각각 다르시기 때문에 어떻게 설명을 드려야 하는지 가끔 막막할 때가 있었습니다.

그럴 때마다 CS에 대해 비전공자 분들도 이해하실 수 있는 문서가 있어서 이를 바탕으로 설명할 수 있었으면 좋겠다고 생각했습니다.

이 글은 이처럼, 개발자와 같이 협업하면서 일하시는 분들이 이해하시면 좋을 내용과 원활한 설명을 위한 레퍼런스로써 역할을 수행할 수 있도록 하기 위해 작성되었습니다.

대상

  • 비전공자
  • 비전공 개발자
  • 개발자와 협업하시는 다양한 직군의 많은 분들

출처

이 포스트는 강민철 님의 [혼자 공부하는 컴퓨터 구조+운영체제] 를 읽고 요약・정리한 글입니다.

내용

1. 운영체제

1) 운영체제란

프로그램이 실행에 마땅히 필요한 요소들을 가리켜 시스템 자원 혹은 줄여서 자원이라고 합니다. CPU, 메모리, 보조기억장치, 입출력 장치 등과 같은 컴퓨터 부품들은 모두 자원이라고 볼 수 있습니다. 즉 모든 프로그램은 실행되기 위해 반드시 자원이 필요합니다.

여기서 실행할 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램이 바로 운영체제입니다. 그래서 운영체제 또한 여느 프로그램과 같이 메모리에 적재되어야 합니다.

다만 운영체제는 매우 특별한 프로그램이기 때문에 항상 컴퓨터가 부팅될 때 메모리 내 커널영역이라는 공간에 따로 적재되어 실행됩니다. 커널 영역을 제외한 나머지 영역, 사용자가 이용하는 응용 프로그램이 적재되는 영역을 사용자 영역이라고 합니다.

운영체제는 응용 프로그램에 자원을 효율적으로 배분하고, 실행할 프로그램들이 지켜야할 규칙을 만들어 시스템 전체를 관리합니다. 예를 들어 운영체제의 어느 한 부분에서는 CPU를 어느 한 부분에서는 메모리를, 어느 한 부분에서는 하드디스크를 관리합니다.

2. 운영체네의 큰 그림

1) 운영체제의 심장, 커널

운영체제가 응용프로그램에 제공하는 서비스 종류는 다양하지만, 그중에서도 가장 핵심적인 서비스들이 있습니다. 곧 자세히 설명하겠지만, 자원에 접근하고 조작하는 기능, 프로그램이 올바르고 안전하게 실행되게 하는 기능이 운영체제의 핵심 서비스에 속합니다.

이러한 운영체제의 핵심 서비스를 담당하는 부분을 커널(Kernel) 이라고 합니다.

운영체제가 제공하는 서비스 중 커널에 포함되지 않는 서비스도 있는데, 대표적으로 사용자 인터페이스가 있습니다. 사용자 인터페이스는 윈도우 바탕화면과 같이 사용자가 컴퓨터와 상호작용 할 수 있는 통로입니다.

운영체제가 제공하는 사용자 인터페이스의 종류에는 그래픽 유저 인터페이스(GUI)커맨드라인 인터페이스(CLI)가 있습니다.

2) 이중 모드와 시스템 호출

운영체제는 응용 프로그램들이 자원에 접근하려고 할 때 오직 자신을 통해서만 접근하도록 하여 자원을 보호합니다. 비유하자면 운영체제는 응용 프로그램의 자원 접근을 대행하는 일종의 문지기 역할을 합니다.

이러한 운영체제의 문지기 역할은 이중모드로써 구현됩니다. 이중모드(dual mode)란 CPU가 명령어를 실행하는 모드를 크게 사용자 모드와 커널 모드로 구분하는 방식입니다. CPU는 명령어를 사용자 모드로써 실행할 수 있고, 커널 모드로써 실행할 수 있습니다.

사용자 모드는 일반적인 응용 프로그램 모드입니다. 사용자 모드로 실행중인 CPU는 입출력 명령어와 같이 하드웨어 자원에 접근하는 명령어를 실행할 수 없습니다. 그래서 사용자 모드로 실행되는 일반적인 응용 프로그램은 자원에 접근할 수 없습니다.

커널 모드는 운영체제 서비스를 제공받을 수 있는 실행모드 입니다. 즉, 커널 영역의 코드를 실행할 수 있는 모드입니다. CPU가 커널 모드로 명령어를 실행하면 자원에 접근하는 명령어를 비롯한 모든 명령어를 실행할 수 있습니다. 운영체제는 커널모드로 실행되기 때문에 자원에 접근할 수 있습니다.

요컨대 사용자 모드로 실행되는 프로그램이 자원에 접근하는 운영체제 서비스를 제공받으려면 운영체제에 요청을 보내 커널모드로 전환되어야 합니다. 이때 운영체제 서비스를 제공 받기 위한 요청을 시스템 호출(시스템 콜) 이라고 합니다. 사용자 모드로 실행되는 프로그램은 시스템 호출을 통해 커널 모드로 전환하여 운영체제 서비스를 제공받을 수 있습니다.

시스템 호출은 일종의 인터럽트입니다. 정확히는 소프트웨어적인 인터럽트입니다. 인터럽트는 입출력 장치에 의해 발생하기도 하지만 인터럽트를 발생시키는 특정 명령어에 의해 발생되기도 하는데, 이를 소프트웨어 인터럽트라고 합니다.

따라서 일반적으로 응용 프로그램은 실행 과정에서 운영체제 서비스를 빈번하게 이용합니다. 그 과정에서 빈번하게 시스템 호출을 발생시키고 사용자 모드와 커널 모드를 오가며 실행됩니다.

3) 운영체제의 핵심 서비스

프로세스 관리

실행중인 프로그램을 프로세스라고 합니다. 일반적으로 하나의 CPU는 한 번에 하나의 프로세스만 실행할 수 있기 때문에 CPU는 이 프로세스들을 조금씩 번갈아가며 실행합니다. 다시 말해, CPU는 한 프로세스를 실행하다가 다른 프로세스로 실행을 전환하고, 그 프로세스를 실행하다가 또 다른 프로세스로 실행을 전환하는 것을 반복합니다.

자원 접근 및 할당

모든 프로세스는 실행을 위해 자원을 필요로 합니다. 그리고 운영체제는 프로세스들이 사용할 자원에 접근하고 조작함으로써 프로세스에 필요한 자원을 할당합니다. 이때의 자원을 대표적으로 학습한 4가지 핵심 부품(CPU, 메모리, 보조 기억 장치, 입출력 장치) 입니다.

  1. CPU
    일반적으로 메모리에 여러 프로세스가 적재되고, 하나의 CPU는 한 번에 하나의 프로세스만 실행할 수 있습니다. 그래서 하나의 프로세스가 CPU를 이용하고 있다면 다른 프로세스는 기다려야 합니다.

이에 운영체제는 프로세스들이 공정하게 CPU를 할당하기 위해 어떤 프로세스로부터 CPU를 이용하게 할 것인지, 얼마나 오래 CPU를 기다리게 할 것인지를 결정할 수 있어야 합니다. 이를 CPU 스케줄링이라 합니다.

  1. 메모리
    메모리에 적재된 프로세스들은 크기도, 적재되는 주소도 가지각색입니다. 같은 프로세스라 할지라도 실행할 때마다 적재되는 주소가 달라질 수 있습니다. 그래서 운영체제는 새로운 프로세스가 적재될 때마다 어느 주소에 적재할 지를 결정해야 합니다.

  2. 입출력 장치(보조 기억장치 포함)
    인터럽트 서비스 루틴은 운영체제가 제공하는 기능으로 커널 영역에 있습니다. 입출력 장치가 발생시키는 하드웨어 인터럽트도 마찬가지입니다. 입출력 장치가 CPU에 하드웨어 인터럽트 요청 신호를 보내면 CPU는 하던 일을 잠시 백업한 뒤 커널 영역에 있는 인터럽트 서비스 루틴을 실행합니다.

이처럼 운영체제는 인터럽트를 처리하는 프로그램, 즉 인터럽트 서비스 루틴을 제공함으로써 입출력 작업을 수행합니다.

파일 시스템 관리

컴퓨터를 사용할 때는 여러 파일을 열고, 생성하고, 삭제합니다. 그리고 이러한 파일들을 한데 묶어 디렉토리로 관리합니다. 당연해보이는 이런 파일 시스템도 운영체제가 지원하는 핵심 서비스입니다.

0개의 댓글