본문 바로가기

운영체제/반효경 교수님 - 운영체제 강의

운영체제 1강 - 운영체제 개요

현재 포스팅은 반효경 교수님의 운영체제 강의 + 추가적인 내용을 바탕으로 정리된 글입니다 :)

1. 운영체제 정의

운영체제(Operating System)이란 컴퓨터 하드웨어 바로 윗단에 설치되는 소프트웨어입니다.

이를 좁은 의미로 보면 커널 그 자체를 의미하고, 넓은 의미로 보면 커널과 각종 시스템 유틸리티를 포함한 개념을 뜻합니다.

 

소프트웨어가 컴퓨터 시스템에서 실행되기 위해서는 메모리에 그 프로그램이 올라가 있어야 하며, 운영체제 또한 하나의 소프트웨어로서 전원이 켜짐과 동시에 메모리에 올라가게 됩니다.

 

하지만 운영체제처럼 규모가 큰 프로그램이 모두 메모리에 올라간다면???

이는 한정된 메모리 공간의 낭비가 심각할 것입니다. 따라서 운영체제 중 항상 필요한 부분(커널)만을 전원이 켜짐과 동시에 메모리에 올려놓고, 그렇지 않은 부분(각종 시스템 유틸리티)은 필요할 때 메모리로 올려놓고 사용하게 됩니다.

 

위에서 언급한 항상 필요한 부분은 커널(Kernel)을 뜻합니다.

이러한 커널은 운영체제 코드 중에서도 핵심적인 부분을 나타내며, 하드웨어 제어 + 프로세스 관리 + 메모리 관리 + 파일 시스템 관리 + 네트워크 통신 등 다양한 운영체제 기능을 수행합니다. 또한 메모리의 항상 상주하는 부분이라는 특징 또한 인지해둡시다!


2. 운영체제의 기능

운영체제의 두 가지 주요한 기능은 다음과 같습니다.

  1. 사용자가 컴퓨터 시스템을 편리하게 사용할 수 있는 환경 제공
  2. 컴퓨터 시스템 내의 자원(Resoruce)을 효율적으로 관리

우선 운영체제는 사용자가 컴퓨터와 상호작용할 수 있도록 일종의 인터페이스 역할을 수행합니다.

예를 들어 시작메뉴, 바탕화면, 창 등을 통해 사용자가 프로그램을 실행하거나 파일 관리를 할 수 있게 해주는 것이죠(GUI)

 

그 외에도 멀티태스킹을 지원하여 사용자가 여러 작업(웹 서핑을 하면서 + 음악을 들으면서 + 유튜브도 보기)을 동시에 수행되는 것처럼 느끼게 해주는 것도 있겠죠

 

즉 하드웨어를 직접 다루는 복잡한 부분은 운영체제가 대행해 주고, 각 사용자나 프로그램은 그에 대한 자세한 내용을 알지 못하더라도 프로그램을 실행할 수 있도록 해주는 것입니다.

 

위에서 설명드린 기능보다 더 중요한 핵심 기능은 컴퓨터 시스템 내의 자원을 효율적으로 관리하여 가장 좋은 성능을 내도록 하는 것입니다. 

이때 자원이란 CPU, 메모리, 하드디스크 등 하드웨어 자원 뿐 아니라 소프트웨어 자원까지 통칭해서 일컫는 말입니다.

 

하지만 전체적인 성능을 향상하려다 보면 일부 프로그램 또는 사용자가 불이익을 당할 수도 있기에 이들 간에 자원이 형평성 있게 분배되도록 하는 균형자에 역할도 함께 수행해야 합니다.

 

위 두가지 기능 외에도, 운영체제는 사용자와 운영체제 자신을 보호하는 역할 또한 담당합니다.


3. 운영체제의 분류

운영체제는 동시 작업 가능 여부, 사용자 수, 처리 방식에 따라 분류할 수 있습니다.

이러한 분류에 따른 차이에 대해 알아보기 전 Time Sharing System, MultiTasking, MultiProgramming, MultiProcessing에 대해 간단히 알아보겠습니다

우선 시분할 시스템(Time Sharing System)이란 다중 사용자 지원을 위해 컴퓨터 응답 시간을 최소화하는 시스템입니다.

이때 응답 시간을 최소화하기 위해 응용 프로그램이 CPU를 점유하는 시간을 잘게 쪼개어 실행될 수 있게 해 줍니다.

 

만약 배치 처리 시스템이었다면 어떨까요?? 각각의 프로그램이 등록된 후, 순차적으로 실행되게 됩니다. 하지만 만약 100시간을 점유해야 하는 프로세스가 먼저 등록된 후, 1시간 과 2시간이 걸리는 프로세스가 등록된다면 어떨까요??

100시간 프로세스가 먼저 실행되기에, 100시간이 지나기 전까지 1시간과 2시간 걸리는 프로세스는 실행되지 못하겠죠??

이러한 문제를 해결하기 위해 등장한 개념이라고 생각하시면 됩니다

 

그렇다면 멀티 태스킹(Multi Tasking)이란 무엇일까요??

원래 단일 CPU환경에서는 여러 응용프로그램을 동시에 실행할 수 없죠?? 하지만 여러 응용프로그램이 동시에 실행되는 것처럼 보이게 하는 시스템이 Multi Tasking입니다.(ex: 음악을 들으면서, 문서 작성)

 

위의 설명한 내용이 시분할과 상당히 유사하죠??? 멀티태스킹은 시분할 시스템과 목표는 다르지만, 결과적으로 구현방식은 거의 동일한 시스템이라고 이해하시면 됩니다 :)

 

멀티프로그래밍(Multi Programming)이란 메모리에 여러 프로그램을 동시에 올리는 기능입니다. 이를 통해 CPU가 한 프로그램에서 다른 프로그램으로 빠르게 전환함으로써, CPU의 이용률을 극대화하고, 시스템의 생산성과 효율을 증가시킵니다.

 

위 말에 대한 이해를 돕기 위해 추가적인 설명을 해보겠습니다.

예를 들어 프로그램 App2가 디스크(느린 속도)와 같은 입출력(I/O) 장치에 접근하여 데이터를 읽고 쓰는 동안, CPU는 유휴 상태에 빠지게 됩니다. 즉 이 시간 동안 CPU는 어떠한 작업도 수행하지 않는데, 이는 컴퓨팅 자원을 비효율적으로 사용하는 것을 의미합니다. 왜냐하면 입출력 작업은 CPU 처리속도에 비해 상대적으로 매우 느리기 때문입니다.

 

이런 상황에서 멀티프로그래밍이 큰 역할을 합니다. 만약 메모리에 App2가 아니라 App3, App4등 다른 프로그램이 올려져 있다면, 프로그램 App2가 입출력작업을 수행하는 동안 CPU는 그대로 대기하지 않고, 프로그램 App3,App4 중 하나를 실행할 수 있습니다.

이렇게 하면 CPU는 항상 작업을 처리하는 상태를 유지할 수 있어, 시스템의 전체적인 효율성과 성능을 향상할 수 있습니다!

 

현재까지 위에서 다룬 3가지 개념(Multi Tasking, Time Sharing System, Multi Programming)은 단일 CPU를 바탕으로 한 개념이지만, Multi Processing의 경우는 여러 CPU를 바탕으로 한 개념입니다.

 

엄격히 보면 멀티 태스킹은 단일 cpu에서 여러 프로세스가 마치 동시에 실행되는 것처럼 보이는 스케쥴링 방식이고, 멀티 프로세싱은 여러 CPU에 하나의 프로세스를 여러 단위로 쪼개 병렬로 실행하게끔 해서 실행 속도를 극대화시키는 시스템입니다.

 

위 4가지 개념을 요약하면 다음과 같습니다.

  • 시분할 시스템 : 다중 사용자 지원, 컴퓨터 응답 시간을 최소화하는 시스템
  • 멀티 태스킹 : 단일 CPU에서 여러 응용 프로그램을 동시에 실행하는 것처럼 보이게 하는 시스템
  • 멀티프로그래밍 : 최대한 CPU를 일정 시간 동안 많이 활용하는 시스템
  • 멀티 프로세싱 : 여러 CPU에서 하나의 응용 프로그램을 병렬로 실행해서, 실행속도를 높이는 기법

위 4가지 개념을 참고해보았을 때, 프로그램 성능을 높이기 위해서는 어떻게 해야 할지 감이 오시나요??

성능을 높이기 위해서는 CPU 사용률을 높이는 동시에, 데이터를 최대한 메모리에 넣고, 메모리 상에서 해당 데이터를 액세스 하면서 프로그램을 동작하게 끔 해야 한다는 결론에 도달할 수 있을 것입니다!

동시 작업 가능 여부

  • 단일 작업 운영체제(Single Tasking)
    • 한 번에 하나의 작업만을 처리
    • 한 명령의 수행이 끝나기 전 다른 명령 수행 불가
    • ex) MS-DOS
  • 다중 작업용 운영체제(Multi Tasking)
    • 동시에 두 개 이상의 작업을 처리할 수 있음
    • 한 명령의 수행이 끝나기 전에 다른 명령을 수행할 수 있음
    • ex) UNIX, MS windows

사용자 수

  • 단일 사용자용 운영체제
    • 한 번에 한 명의 사용자만이 사용하도록 허용
    • ex) MS-DOS, MS Windows
  • 다중 사용자용 운영체제
    • 여러 사용자가 동시에 접속해 사용할 수 있음
    • ex) UNIX, NT Server

처리 방식

  • 일괄 처리 방식 운영 체제(batch processing)
    • 작업을 모아서 한꺼번에 처리
    • 모든 작업이 종료된 후 결과를 받을 수 있다
    • ex) Punch Card 처리 시스템
  • 시분할 방식 운영체제(Time Sharing)
    • 여러 작업을 처리할 때 컴퓨터 처리 능력을 일정 시간 단위로 분할해 사용
    • 일괄 처리 방식에 비해 응답 시간이 짧다
    • 사용자의 요청에 대한 결과를 빠르게 얻을 수 있기에 대화형 시스템이라고도 부름
    • ex) UNIX
  • 실시간 방식 운영체제(Real Time)
    • 정채진 시간 안에 어떠한 일이 반드시 처리됨을 보장
    • 시간 제약의 중요성에 따라 2가지로 분류함
      • 경성 실시간 시스템(hard realtime system) : 주어진 시간을 지키지 않으면 매우 위험한 일이 발생하는 시스템(ex: 원자로 제어 시스템)
      • 연성 실시간 시스템(soft realtime system) : 주어진 시간을 지키지 않으면 내용 전달의 정확성이 떨어질 수 있으나, 경성 실시간 시스템처럼 치명적이진 않은 시스템(ex: 멀티미디어 스트리밍 시스템)

4. 운영체제의 자원 관리 기능

앞서 설명드렸다시피 운영체제의 가장 핵심적인 기능은 자원을 효율적으로 관리하는 것입니다.

여기서 자원이란 하드웨어 자원소프트웨어 자원으로 나뉩니다.

 

하드웨어 자원이란 CPU메모리를 비롯해 주변 장치 또는 입출력 장치라 불리는 장치들로 구성됩니다.

 

CPU는 통상적으로 컴퓨터 한 대에 하나가 장착되기에, 여러 프로세스들이 CPU를 효율적으로 나누어 사용할 수 있도록 관리되어야 합니다.

그러므로 매 시점 어떤 프로세스에 CPU를 할당하여 작업을 처리할 것인지 결정하는 일이 필요하며 이를 CPU 스케쥴링이라고 합니다.

이러한 스케쥴링 기법으로는 선입선출(First Come First Served: FCFS), 라운드 로빈(Round-Robin), 우선순위(Priority) 기법 이 있습니다.

 

선입 선출 기법은 말 그대로 CPU를 사용하기 위해 도착한 프로세스들 중 먼저 온 것을 먼저 처리하는 방식입니다.

하지만 이러한 방식에서는, CPU를 필요하는 프로세스가 여럿 있을 경우 CPU를 먼저 얻은 프로세스가 원하는 작업을 완료할 때까지 다른 프로세스들이 CPU를 사용하지 못합니다.

또한 장시간 CPU를 사용해야 하는 프로세스가 먼저 도착한다면 작업이 상당히 비효율적이겠죠?? 이러한 단점을 보완하고자 고안된 기법이 라운드 로빈 기법입니다.

 

라운드 로빈 기법에서는 CPU를 한번 할당받아 사용할 수 있는 시간을 일정하게 고정된 시간으로 제한합니다.(보통 10~100ms)

그래서 긴 작업을 요하는 프로세스가 먼저 CPU를 할당받더라도 정해진 시간이 지나면 CPU를 내어주고, CPU의 제일 뒤에 가서 줄을 서야 합니다. 따라서 긴 작업을 수행하는 프로세스 때문에 짧은 작업을 가진 프로세스들이 무작정 오래 기다려야 하는 상황을 막을 수 있습니다.

 

 

우선순위 스케쥴링에서는 CPU 사용을 위해 대기 중인 프로세스들에 우선순위를 부여하고, 우선순위가 높은 프로세스에 CPU를 먼저 할당합니다. 시스템 내의 프로세스 중에는 상대적으로 더 중요한 프로세스가 있을 수 있으므로, 그런 프로세스의 우선순위를 높게 하여 CPU를 먼저 획득할 수 있도록 한다는 점이 핵심입니다.

만약 기다린 시간이 늘어날수록 우선순위를 점쳐 높여주는 방안도 활용할 수 있겠죠??

 

또한 입출력 장치도 운영체제의 관리가 필요합니다. CPU와 메모리는 전원이 꺼지면 처리 중이던 정보가 모두 지워지기에 전원이 나가도 기억해야 하는 부분을 입출력 장치 중 한 종류인 보조기억 장치(ex: 하드디스크)에 파일 형태로 저장합니다.

이때 이러한 파일들이 저장되는 방식 및 접근 권한 등에 대해서도 운영체제가 관리주어야겠죠?

 

주변 장치 및 입출력 장치는 CPU나 메모리와 달리 인터럽트(Interrupt)라는 메커니즘을 통해 관리가 이루어집니다.

위의 장치들이 CPU 서비스가 필요할 때 신호를 발생시켜 서비스를 요청하는데, 이때 발생시키는 신호를 인터럽트라고 합니다. 다른 말로는 주 프로그램 수행 중에 주 프로그램을 일시적으로 중단시키는 조건이나 사건의 발생을 뜻합니다.

 

이때 주변 장치에서 인터럽트를 발생시켜 CPU에 보고를 하는 역할을 하는 장치를 컨트롤러라고 합니다.

 

인터럽트를 이해하기 위한 간단한 예시를 살펴보겠습니다.

 

1. 사용자가 키보드 글자 입력 시 키보드 컨트롤러가 인터럽트를 발생시켜 입력이 들어옴을 알림

2. 이때 CPU는 현재 수행 중이던 작업의 상태를 저장하고, 인터럽트 요청을 처리하기 위해 운영체제 내에 정의된 키보드 인터럽트 처리루틴을 찾아감

3. 키보드 인터럽트 처리루틴은 키보드로부터 입력받은 내용을 메모리의 특정 부분에 저장해 해당 프로그램에 키보드 입력이 들어왔음을 알림

4. 위와 같은 과정을 마친 후, 인터럽트가 발생하기 직전의 상태를 복구시켜 중단되었던 작업을 재개

 

1. 하드디스크에서 데이터 읽는 작업(시간이 오래걸림)을 CPU가 요청했다고 가정

2. 이때 CPU는 작업이 완료되었는지 계속 확인 하는 대신, 다른 작업을 계속 수행

3. 그리고 하드디스크는 데이터 읽기 작업이 완료되면 인터럽트를 발생시켜 CPU에 알림

 

이러한 인터럽트는 요청하는 장치와 발생 상황에 따라 다양한 종류가 있기에, 운영체제는 인터럽트의 종류마다 서로 다른 인터럽트 처리루틴을 가집니다.

이는 운영체제 커널 내에 존재하는 코드로 CPU 스케쥴링 및 메모리 관리루틴 등 다양한 기능을 위한 커널 코드 중 일부인 것입니다.

 

 

운영체제의 또 다른 중요 관리 대상에는 메모리가 있습니다.

메모리는 CPU가 직접 접근할 수 있는 컴퓨터 내부의 기억장치입니다. 프로그램이 CPU에서 실행되려면 해당 부분이 메모리에 올라가 있어야 하는데, 이때 한정된 메모리 공간에 여러 프로그램을 수용하려면 효율적인 관리 메커니즘이 필요합니다!

 

따라서 메모리 관리를 위해 운영체제는 메모리의 어느 부분이 어떤 프로그램에 의해 사용되는지 파악하여 이를 유지하는데, 이러한 정보는 주소(Address)를 통해 관리됩니다.

 

운영체제는 어느 정도의 메모리를 할당할지를 잘 판단하여 메모리  공간을 효율적으로 사용될 수 있도록 해야 할 뿐 아니라, 다수의 프로그램이 동시에 메모리에 올라간 경우 서로 다른 프로세스의 영역을 침범하지 않도록 보안을 유지하는 역할도 해야 합니다

 

물리적 메모리를 관리하는 방식에는 고정 분할(fixed partition), 가변 분할(variable partition), 가상 메모리(virtual memory) 방식이 있습니다.

 

이는 이후에 더 자세히 다루어 볼 것이기에, 간단히 살펴보겠습니다.

 

고정 분할 방식은 프로세스 크기와 상관없이 물리적 메모리를 몇 개의 분할로 미리 나누어 관리합니다. 따라서 외부 및 내부 조각이 생기며, 메모리가 비효율적으로 낭비되는 공간이 많습니다.

 

가변 분할 방식은 매 시점 프로그램의 크기에 맞게 메모리를 분할해서 사용하는 방식을 말합니다. 하지만 물리적 메모리의 크기보다 더 큰 프로그램의 실행은 여전히 불가능합니다.

또한 분할크기와 개수가 동적으로 변하므로 기술적 관리 기법이 필요하며, 내부 조각은 발생하지 않지만 외부 조각이 발생할 수 있습니다.

 

모든 프로그램은 물리적 메모리와 독립적으로 0번지부터 시작하는 자신만의 가상 메모리 주소를 가지게 됩니다.

OS는 이 가상메모리의 주소를 물리적 메모리 주소로 매핑하는 기술을 이용해 주소를 변환시킨 후 프로그램을 물리적 메모리에 올리게 됩니다.

 

가상 메모리 기법은 현대의 범용 컴퓨터 환경에 가장 널리 사용되는 메모리 기법으로, 물리적 메모리보다 더 큰 프로그램이 실행되는 것을 지원합니다. 즉 물리적 메모리의 크기가 1기가 바이트라 하더라도 2기가바이트의 프로그램을 실행할 수 있습니다.

왜냐하면 프로그램 전체 크기가 2 Gbyte라도 전체가 항상 동시에 사용되는 것이 아닙니다.

그러므로, 현재 사용되고 있는 부분만 메모리에 올리고, 나머지는 하드 디스크와 같은 보조기억장치에 저장해 두었다가 필요할 때 적재하는 방식을 취합니다. 이때 사용되는 보조기억 장치 영역을 스왑(swap) 영역이라고 합니다.

 

프로그램을 구성하는 가상메모리 주소 공간은, 페이지라는 동일한 크기의 작은 단위로 나뉘어(페이징 기법) 물리적 메모리와 스왑 영역에 일부분 씩 저장됩니다.


개발자 준비생이 대학 강의를 듣고 정리한 내용입니다

혹시 틀린 내용이 있다면 댓글 부탁드리겠습니다!! 곧바로 수정하겠습니다