🎉 berenickt 블로그에 온 걸 환영합니다. 🎉
CS
운영체제
01-운영체제

혼자 공부하는 컴퓨터구조 + 운영체제를 보고 정리한 글입니다. cf. https://www.youtube.com/watch?v=kFWP6sFKyp0&list=PLYH7OjNUOWLUz15j4Q9M6INxK5J3-59GC

1. 운영체제를 알아야 하는 이유

데스크톱 컴퓨터나 노트북, 스마트폰에는 모두 운영체제가 설치되어 있습니다.

  • 데스크톱 운영체제로는 윈도우와 macOS, 리눅스가 있고,
  • 스마트폰 운영체제로는 안드로이드와 iOS가 있습니다.

컴퓨터 부품들은 전기만 공급하면, 마치 마법처럼 알아서 작동하는 것이 아닙니다.

  • 운영체제라는 특별한 프로그램의 지휘 하에 작동하지요.
  • 운영체제는 01~08장까지 배운 컴퓨터 부품들을 관리하고,
  • 여러분이 개발한 프로그램이 올바르게 실행되도록 돕습니다.

1.1 운영체제란

  • 모든 프로그램은 하드웨어를 필요로 합니다.
  • 다시 말해, 모든 프로그램은 실행되기 위해 반드시 자원이 필요합니다.
  • 프로그램 실행에 마땅히 필요한 요소들을 가리켜 시스템 자원, 혹은 줄여서 자원이라고 합니다.
    • CPU, 메모리, 보조기억장치, 입출력장치 등과 같은 컴퓨터의 4가지 핵심 부품들 포함
  • e.g. 1+2를 계산하는 프로그램은 CPU를 필요
  • e.g. 이미지를 하드 디스크에 저장하는 프로그램은 하드 디스크를 필요

운영체제(operating system)

  • 실행할 프로그램에 필요한 자원을 할당하고,
  • 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램

MySelf-Architec-Oper_9_1

운영체제는 인터넷 브라우저, 게임과 같은 프로그램입니다.

  • 그래서 운영체제 또한 여느 프로그램과 마찬가지로 메모리에 적재되어야 합니다.

  • 다만 운영체제는 매우 특별한 프로그램이기 때문에,

    • 항상 컴퓨터가 부팅될 때,
    • 메모리 내 커널 영역(kernel space)이라는 공간에 따로 적재되어 실행됩니다.
  • 커널 영역을 제외한 나머지 영역, 사용자가 이용하는 응용 프로그램이 적재되는 영역을

    • 사용자 영역(user space)이라고 합니다.
  • 즉, 운영체제커널 영역에 적재되어,

    • 사용자 영역에 적재된 프로그램들에 자원을 할당하고 이들이 올바르게 실행되도록 돕습니다.

MySelf-Architec-Oper_9_2

e.g. 일반적으로 메모리에는 여러 개의 응용 프로그램이 사용자 영역에 적재되어 실행됩니다.

  • 사용자가 워드 프로세서, 인터넷 브라우저, 메모장을 실행 중이면,
  • 최소 3개의 응용 프로그램이 사용자 영역에 적재되어 있는 셈입니다.

💡 응용 프로그램(application software)

  • 사용자가 특정 목적을 위해 사용하는 일반적인 프로그램을 의미
  • e.g. 워드 프로세서, 인터넷 브라우저, 메모장, 게임 등과 같은 프로그램

MySelf-Architec-Oper_9_3

그런데 누가 이 프로그램들을 메모리에 적재했을까요? 위 그림을 보면,

  • 워드 프로세서, 인터넷 브라우저, 메모장은 각각 2000번지, 1500번지, 1000번지에 적재되었는데,
  • 메모리 주소가 겹치지 않도록, 적당한 공간에 프로그램들을 적재해준 건 누구였을까요?
  • 바로 운영체제입니다.
    • 운영체제는 실행할 프로그램을 메모리에 적재하고,
    • 더 이상 실행되지 않는 프로그램을 메모리에서 삭제하며 지속적으로 메모리 자원을 관리합니다

MySelf-Architec-Oper_9_4

3개의 응용 프로그램이 실행되려면 반드시 CPU가 필요합니다.

  • 그렇다면 어떤 프로그램부터 CPU를 사용하게 할까요?
  • 그리고 얼마나 오랫동안 CPU를 이용하게 할까요?
  • 이 문제 또한 운영체제가 해결합니다.
    • 어느 한 프로그램이 CPU를 독점하면,
    • 다른 프로그램들은 올바르게 실행될 수 없기 때문에,
    • 운영체제는 최대한 공정하게 여러 프로그램에 CPU 자원을 할당합니다.

MySelf-Architec-Oper_9_5

이번에는 워드 프로세서와 메모장이 동시에 동일한 프린터를 이용하려는 상황을 생각해 봅시다.

  • 운영체제는 동시에 두 개의 프로그램이 프린터를 사용하지 못하도록 막고,
  • 하나의 프로그램이 프린터를 이용하는 동안, 다른 프로그램은 기다리게 만들어 프린터 자원을 관리합니다.

MySelf-Architec-Oper_9_6

  • 이처럼 운영체제응용 프로그램하드웨어 사이에서 응용 프로그램에 필요한 자원을 할당하고,
  • 응용 프로그램이 올바르게 실행되도록 관리하는 역할을 맡습니다.

MySelf-Architec-Oper_9_7

  • 운영체제는 흔히 정부에 비유되기도 합니다.
    • 한 나라의 정부는 땅, 인력, 돈 등 국내 자원을 효율적으로 배분하고,
    • 국민들이 지켜야 할 규칙을 만들어 나라 전체를 관리합니다.
  • 운영체제도 마찬가지입니다.
    • 운영체제는 응용 프로그램에 자원을 효율적으로 배분하고,
    • 실행할 프로그램들이 지켜야 할 규칙을 만들어 컴퓨터 시스템 전체를 관리합니다.
  • 또한 정부에 기획재정부, 과학기술정보통신부 같이 역할별로 여러 부서가 나누어져 있는 것처럼
  • 운영체제 또한 관리할 자원별로 기능이 나누어져 있습니다.
    • e.g. 운영체제의 어느 한 부분에서는 CPU를,
    • 어느 한 부분에서는 메모리를,
    • 어느 한 부분에서는 하드 디스크를 관리합니다.

1.2 운영체제를 알아야 하는 이유

  • 운영체제없이 프로그램을 개발하는 것? 생각만 해도 골치 아픈일입니다.

  • 아무리 간단한 프로그램이라도 운영체제가 없다면,

    • 하드웨어를 조작하는 코드를 개발자가 모두 직접 작성해야 하기 때문입니다.
    • e.g. 1+2한 결과를 모니터에 출력하는 간단한 프로그램
      • 프로그램을 메모리에 적재하는 코드
      • CPU로 하여금 1과 2를 더하게 하는 코드
      • 모니터에 계산 결과를 출력하는 코드…
  • 하지만 다행히도 이 세상에는 운영체제가 있습니다.

    • 운영체제가 하드웨어를 조작하고 관리하는 기능들을 제공하기 때문에
    • 개발자는 하드웨어를 조작하는 코드를 직접 작성할 필요없이
    • 운영체제의 도움을 받아 간편하게 개발할 수 있습니다.
  • 그렇다면 개발자들이 왜 운영체제를 알아야 할까요?

    • 운영체제는 사용자를 위한 프로그램이 아닙니다.
    • 운옃제제는 프로그램을을 위한 프로그램입니다.
    • 그렇기에 프로그램을 만드는 개발자는 운영체제를 알아야 합니다.
    • 어떤 하드웨어에 문제가 생겼다라고 가정하면, 운영체제가 가장 먼저 알아쳅니다.
  • 그리고 운영체제는 딱딱한 하드웨어가 아닌 프로그램이기 때문에 여러분과 대화할 수 있습니다.

    • e.g. CPU, 메모리, 어떤 컴퓨터 부품이든 딱딱한 하드웨어이기 때문에

      • 문제가 생겼으면, 동작을 안하면 끝이지만,
    • e.g. 운영체제는 부드러운 프로그램이기 때문에,

      • 여러 오류 메시지를 통해서, 사용자와 대화를 할 수 있습니다.
      • 사용자가 만든 코드를 실행하니, 이러이러한 문제가 있다고 알려줍니다.
  • 그래서 운영체제를 이해하면, 오류 메시지에 대한 이해가 깊어지고,

    • 문제 해결력도 당연히 높아집니다.
    • 그리고 운영체제를 알아야만, 해결가능한 오류 메시지도 존재합니다.
  • 물론 위 사실뿐만 아니라,

    • 다수의 기업에서 운영체제에 대한 이해를 필수적인 기초 역량으로 요구하고,
    • 채용 과정에서 기술 면접 등을 통해 검증하는 것도 이러한 이유 때문입니다.

2. 운영체제의 큰 그림

운영체제는 사용자를 위한 프로그램이 아닌 사용자가 실행하는 프로그램을 위한 프로그램입니다.

  • 즉, 사용자가 실행하는 응용 프로그램이 올바르게 실행되도록 돕고 필요한 자원을 할당해 주는 프로그램
  • 이번 절에는 다음과 같은 개념을 배웁니다.
    • 커널이란?
    • 운영체제의 서비스 종류?
    • 시스템 콜과 이중 모드란?

2.1 운영체제의 심장, 커널

MySelf-Architec-Oper_9_8

  • 운영체제는 현존하는 프로그램 중 규모가 가장 큰 프로그램 중 하나
  • ‘how many source code lines in linus’라고 검색해보면, 천만 줄이 넘는다고 나옵니다.
  • 또 세상에는 다양한 운영체제가 있습니다.
    • e.g. Winods, macOS, Android, IOS, Linux
    • 그렇기에 운영체제가 제공하는 기능 역시 다양합니다.
    • e.g. 같은 스마트폰이라도 Android, IOS인지에 따라 제공하는 기능이 천차만별
  • But, 이런 다양한 운영체제에서도 가장 핵심적인 서비스는 존재합니다.
    • e.g. 스마트폰이 Android든, IOS든 전화, 문자, 인터넷연결(Wi-fi) 등
    • e.g. 운영체제 역시 자원에 접근·조작하는 기능, 프로그램이 올바르고 안전하게 실행되게 하는 기능 등
  • 이러한 운영체제의 핵심 서비스를 담당하는 부분커널(kernel)이라고 합니다.
    • 그래서 이 책을 비롯한 대부분의 운영체제 전공서는 운영체제의 핵심부, 즉 커널을 설명합니다.
    • 필자가 운영체제를 지칭할 때는 특별히 언급하지 않는 한 커널을 지칭한다고 봐도 무방합니다.

2.1.2 GUI와 CLI

운영체제가 제공하는 사용자 인터페이스의 종류에는 GUI와 CLI가 있습니다.

MySelf-Architec-Oper_9_9

운영체제가 제공하는 서비스 중 커널에 포함되지 않는 서비스도 있는데,

  • 대표적으로 사용자 인터페이스(UI; User Interface)가 있습니다.
    • e.g. 윈도우의 바탕화면과 같이 사용자가 컴퓨터와 상호작용할 수 있는 통로입니다.
    • cf. 실제로 같은 커널을 사용하더라도, 사용자 인터페이스는 다를 수 있습니다.
  • 그래픽 유저 인터페이스(GUI; Graphical User Interface)
    • 윈도우 바탕화면이나 스마트폰의 화면처럼 그래픽을 기반으로 컴퓨터와 상호작용할 수 있는 인터페이스

MySelf-Architec-Oper_9_10

  • 커맨드 라인 인터페이스(CLI; Command Line Interface)
    • 명령어를 기반으로 컴퓨터와 상호작용할 수 있는 인터페이스
    • 명령어를 기반으로 컴퓨터와 상호작용하는 인터페이스이기 때문에,
    • 아이콘이나 다채로운 그래픽 화면이 없습니다.

2.2 이중 모드와 시스템 호출

MySelf-Architec-Oper_9_11

사용자가 실행하는 프로그램은 자원에 직접 접근할 수 있을까요?

  • e.g. 메모장, 웹 브라우저등이 CPU, 메모리, 하드 디스크 등에 마음대로 접근하고 조작한다면?
  • 안됩니다. 응용 프로그램이 자원에 직접 접근은 위험합니다.
    • 왜냐하면, 자원이 무질서하게 관리되고,
    • 응용 프로그램이 조금만 실수해도 컴퓨터 전체에 큰 악영향을 미칩니다.
    • e.g. 한 응용 프로그램이 CPU를 쓰고 있는데, 다른 응용 프로그램이 쓸려고 하는 등의 문제

MySelf-Architec-Oper_9_12

그래서 운영체제는 응용 프로그램들이 자원에 접근하려고 할 때,

  • 오직 자신을 통해서만 접근하도록 하여 자원을 보호합니다.
  • 비유하자면, 운영체제는 응용 프로그램의 자원 접근을 대행하는 일종의 문지기 역할을 하는 셈
  • 다시말해, 응용 프로그램이 자원에 접근하려면,
    • 영체제에 도움을 요청(=운영체제의 코드를 실행)해야

MySelf-Architec-Oper_9_13

e.g. 응용 프로그램이 실행 과정에서 하드디스크에 접근하여 데이터를 저장하려면,

  • 운영체제에 도움을 요청해야 하고,
  • 운영체제는 커널 영역 내의 하드 디스크에 데이터를 저장하는 코드를 실행하여
  • 응용 프로그램의 작업을 대신 수행해줍니다.

2.2.1 이중 모드(dual mode)

  • 이러한 운영체제의 문지기 역할은 이중 모드로써 구현됩니다.
  • 이중 모드 : CPU가 명령어를 실행하는 모드를 크게 사용자 모드커널 모드로 구분하는 방식
  • 사용자 모드(user mode)
    • 운영체제 서비스를 제공받을 수 없는 실행 모드
    • 커널 영역의 코드 를 실행할 수 없는 모드
    • 입출력 명령어와 같이 하드웨어 자원에 접근 불가
  • 커널 모드(kernel mode)
    • 운영체제 서비스를 제공받을 수 있는 실행 모드
    • 자원에 접근을 비롯한 모든 명령어를 실행 가능
  • cf. CPU가 사용자 모드로 실행 중인지, 커널 모드로 실행 중인지는
    • 플래그 레지스터 속 슈퍼바이저 플래그를 보면 알 수 있습니다. (04장 참고)
    • 1이면 커널 모드, 0이면 사용자 모드로 실행 중임을 의미

MySelf-Architec-Oper_4_33


2.2.2 시스템 호출(system call)

MySelf-Architec-Oper_9_14

  • 커널 모드로 전환하여 실행하기 위해 호출
  • 일종의 소프트웨어 인터럽트!
    • 인터럽트는 입출 력장치에 의해 발생하기도 하지만,
    • 인터럽트를 발생시키는 특정 명령어에 의해 발생하기도 하는데,
    • 이를 소프트웨어 인터럽트라고 합니다.
  • CPU가 시스템 호출을 처리하는 순서는 04장에서 설명한 인터럽트 처리 순서와 유사합니다.
    • 시스템 호출을 발생시키는 명령어가 실행되
    • CPU는 지금까지의 작업을 백업하고,
    • 커널 영역 내에 시스템 호출을 수행하는 코드(인터럽트 서비스 루틴)를 실행한 뒤,
    • 다시 기존에 실행하던 응용 프로그램으로 복귀하여 실행을 계속해 나갑니다.
  • e.g. 시스템 호출의 작동 예 : 한 응용 프로그램이 하드디스크에 데이터를 저장하려 한다고 가정
    1. 하드 디스크에 데이터를 저장하는 시스템 호출을 발생시켜 커널 모드로 전환하고,
    2. 운영체제 내의 ‘하드디스크에 데이터를 저장하는 코드’를 실행함으로써 하드디스크에 접근
    3. 하드 디스크에 접근이 끝났다면, 다시 사용자 모드로 복귀하여 실행을 계속해 나갑니다

MySelf-Architec-Oper_9_15

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

💡 Linux의 시스템 호출 명령어 정리


2.3 운영체제의 핵심 서비스

2.3.1 프로세스 관리

MySelf-Architec-Oper_9_16

  • 프로세스(process) === 실행 중인 프로그램
  • 수 많은 프로세스들이 동시에 실행
  • 윈도우의 [작업 관리자]를 열어 [프로세스] 항목을 보면,
    • 굉장히 많은 프로세스가 실행 중인 것을 알 수 있습니다.
    • 컴퓨터를 사용하는 동안 메모리 안에서는 새로운 프로세스들이 마구 생성되고,
    • 사용되지 않는 프로세스는 메모리에서 삭제됩니다.

MySelf-Architec-Oper_9_17

  • 사실 **‘동시에 실행된다’**는 말은 아주아주 빠르게
    • 사용자가 눈치채지 못할 정도로 빠르게 번갈아가면서 실행되는 겁니다.
  • 즉, CPU한 프로세스를 실행하다가 다른 프로세스로 실행을 전환하고,
    • 그 프로세스를 실행하다가 또 다른 프로세스로 실행을 전환하는 것을 반복합니다.

MySelf-Architec-Oper_9_18

  • 그래서 운영체제는 다양한 프로세스를 동시다발적으로 생성·실행·삭제되는 다양한 프로세스를
    • 일목요연하게 관리할 수 있어야 합니다.
  • e.g. 새롭게 어떤 프로그램을 실행하게 되면,
    • 작업 관리자의 프로세스 목록에 프로세스가 새롭게 생성되겠죠?
    • 또 프로세삭 실행될 떄도 문제없이 잘 되게끔 관리해줘야되고,
    • 실행이 끝난 프로세스는 올바르게 종료해줘야 합니다.
  • 더군다나 프로세스마다 상황도 다양할 수 있습니다.
    • 어떤 프로세스는 특정 입출력 장치를 사용해야 할 수도 있고,
    • 어떤 프로세스는 되게 빨리 CPU를 써야될 수도 있고,
    • 어떤 프로세스는 지금 당장 실행이 어려울 수도 있습니다.
  • 이렇게 다양한 프로세스들 그리고 각기 다른 상황에 프로세스들
    • 일목요연하게 관리해주는 역할을 운영체제가 합니다.
    • 앞으로 운영체제가 다양한 프로세스를 어떻게 관리하고 실행하는지 배웁니다.
    • e.g. 프로세스와 스레드, 프로세스 동기화, 교착상태 해결

2.3.2 자원 접근 및 할당

모든 프로세스는 실행을 위해 자원을 필요로 합니다. 그리고 운영체제는 프로세스들이 사용할 자원에 접근하,고 조작함으로써 프로세스에 필요한 자원을 할당해 줍니다.

  • CPU 접근 및 할당
    • CPU 스케줄링 : 어떤 프로세스를 먼저, 얼마나 오래 실행할까?
    • e.g. 모든 프로세스는 실행되기 위해서 CPU가 필요합니다.
      • 메모리에는 여러 프로세스가 적재되고,
      • 하나의 CPU는 한 번에 하나의 프로세스만 실행할 수 있습니다.
      • 그래서 하나의 프로세스가 CPU를 이용하고 있다면 다른 프로세스는 기다려야 합니다.
    • 그래서 프로세스들에 공정하게 CPU를 할당하기 위해 어떤 프로세스부터 CPU를 이용할지,
      • 얼마나 오래 CPU를 이용하게 할지를 결정할 수 있어야 합니다.
  • 메모리 접근 및 할당
    • 페이징, 스와핑, 등…
    • e.g. 어떤 새로운 프로세스를 적재할 적에 비어있는 공간에다가 적재해야 하는데,
      • 비어있는 공간을 어떻게 찾을 것인지,
      • 다양한 프로세스들이 동시에 실행되고 있는데, 메모리에 전부 다 적재하는 것이 효율적인지,
      • 어떻게 메모리에 다 적재하지 않고도 문제없이 실행할 수 있는지 등…
    • e.g. 어떤 실행하려는 프로세스가 메모리 크기보다 큰 경우
      • 실행이 안될 거 같지만, 사실 실행이 됩니다.
      • 이것이 어떻게 가능한지 등…
  • 입출력장치 접근 및 할당
    • 인터럽트 서비스 루틴은 운영체제가 제공해주는 기능입니다.
    • 이는 커널 영역에 적재되어 있는 코드입니다.
    • 그래서 응용 프로그램이 입출력장치에 접근하고자 할 떄,
      • 운영체제는 인터럽트 서비스 루틴을 제공함으로써
      • 각각의 응용 프로그램한테 입출력 장치를 접근할 수 있도록 합니다.

2.3.3 파일 시스템 관리

  • 당연해 보이는 파일 시스템(file system)도 운영체제가 지원하는 핵심 서비스입니다.
  • 보조저장장치에 있는 정보 덩어리를 ‘파일’이라는 단위로 묶어서 저장해서 보관
    • 관련된 정보를 파일이라는 단위로 저장 장치에 보관
    • 파일들을 묶어 폴더(디렉토리) 단위로 저장 장치에 보관
  • 운영체제가 보조기억장치 속 데이터를 어떻게 파일과 디렉터리로 관리하는지에 대해 배웁니다.

2.4 가상 머신과 이중 모드의 발전

이중 모드는 커널 모드와 사용자 모드, 두 가지 모드를 지원하는 실행 모드이지만, 가상 머신을 통한 가상화를 지원하는 현대 CPU는 2가지 모드 이상을 지원합니다.

MySelf-Architec-Oper_9_19

  • 가상 머신(virtual machine)
    • 소프트웨어적으로 만들어낸 가상 컴퓨터
    • 가상 머신을 설치하면 새로운 운영체제와 응용 프로그램을 설치하고 실행할 수 있습니다.
    • 윈도우 운영체제에 가상 머신을 설치하면,
      • 가상머신 상에 리눅스 운영체제와 그를 기반으로 여러 응용 프로그램들을 설치하고 실행 가능

MySelf-Architec-Oper_9_20

이때 컴퓨터에 설치된 운영체제에서 가상 머신을 설치 및 실행한다면, 그 가상머신 또한 응용 프로그램입니다.

  • 그래서 사용자 모드로 작동하지요.
  • 마찬가지로 가상머신 상에 설치된 운영체제 또한 사용자 모드로 작동합니다.
  • 가상 머신에 설치된 응용 프로그램이 운영체제 서비스를 제공받기 위해서는 커널 모드로 전환되어야 하는데,
  • 가상 머신에 설치된 운영체제도 사용자 모드로 작동하면, 운영체제 서비스를 제공받기 어렵겠죠?

그래서 가상화를 지원하는 CPU커널 모드사용자 모드 이외에

  • 가상 머신을 위한 모드하이퍼 바이저 모드를 따로 둡니다.
  • 이로써 가상 머신 상에서 작동하는 응용 프로그램들
    • 하이퍼바이저 모드로써 가상 머신에 설치된 운영체제로부터 운영체제 서비스를 받을 수 있습니다.

2.5 시스템 호출의 종류

시스템 호출 종류만 잘 파악해도 해당 운영체제를 깊이 이해할 수 있습니다. 이곳에서는 유닉스, 리눅스 등의 운영체제(POSIX 운영체제) 에서 사용하는 대표적인 시스템 호출의 종류에 대해 알아보겠습니다. 아직은 운영체제를 본격적으로 학습하기 전이니 ‘이런 것이 있구나’ 하는 정도로만 살펴보세요.

종류시스템 호출설명
프로세스 관리fork()새 자식 프로세스 생성
execve()프로세스 실행(메모리 공간을 새로운 프로그램의 내용으로 덮어씌움)
exit()프로세스 종료
waitpid()자식 프로세스가 종료할 때까지 대기
파일 관리open()파일 열기
clase()파일 닫기
read()파일 읽기
write()파일 쓰기
stat()파일 정보 획득
디렉터리 관리chdir()작업 디렉터리 변경
mkdir()디렉터리 생성
rmdir()비어 있는 디렉터리 삭제
파일 시스템 관리mount()파일 시스템 마운트
umount()파일 시스템 마운트 해제

개발자가 작성하는 프로그래밍 언어들은 내부적으로 위와 같은 시스템 호출을 통해 실행됩니다.

  • 가령 C 언어에서 무언가를 화면에 출력하라는 코드인 printf도 내부적으로 시스템 호출을 통해 실행되고,
  • 사용자로부터 무언가를 입력받으라는 코드인 scanf도 내부적으로 시스템 호출을 통해 실행됩니다.

운영체제는 제공하는 서비스가 매우 다양하기에 시스템 호출의 종류도 다양합니다. 아래 링크 system_calls 항목에 리눅스 시스템 호출의 종류를 정리해 두었으니 참고하세요.