나만의 백과사전 - OS 개요

Jiwon An·2021년 8월 11일
0

CS/운영체제

목록 보기
4/10
post-thumbnail

1. 운영체제란?

  • 사용자 인터페이스와 자원 관리를 위한 프로그램의 집합
  • 컴퓨터 하드웨어를 효율적으로 관리해서 사용자 또는 응용프로그램에게 서비스를 제공하는 시스템 소프트웨어이다.
  • 운영체제는 일반적으로 사용자 인터페이스(쉘)와 장치, 파일, 메모리, 처리기 관리의 다섯가지 구성요소를 가지고 있다.

2. OS가 필요한 이유?

RAM은 휘발성 메모리이기 때문에 컴퓨터를 종료하면 저장된 내용들이 사라진다. 그렇기 때문에 컴퓨터는 프로그램(명령어의 집합)을 보조 기억 장치인 하드 디스크에 저장한다.
컴퓨터가 실행되면 하드 디스크에 저장된 프로그램들을 RAM으로 올려서 프로세서로 넘겨주어야 하는데, 이 작업은 어떻게 이루어질까?

  • OS가 하드 디스크에서 메인 메모리로 올리는 역할을 한다.

요즘 RAM은 최소 8GB에서 시작한다. 즉, RAM에는 하나의 프로그램만 들어오는 것이 아니라 여러 프로그램이 올라오게 된다.
우리가 컴퓨터를 사용할 때 알 수 있듯이, 여러 프로그램을 동시에 실행하는 것이 가능하다. 프로세서는 하나인데 어떻게 여러 프로그램을 동시에 실행할 수 있을까?

  • OS가 여러 프로그램을 동시에 실행할 수 있도록 관리해준다.

정리

  • OS는 하드웨어 리소스를 관리한다. => 자원(리소스, CPU, 메모리, HDD 등)을 효율적으로 관리
  • OS는 컴퓨터의 성능을 향상시킨다. => 프로세스(프로그램 실행의 주체) 및 스레드 관리
  • OS는 사용자의 편의를 제공한다. => 사용자 인터페이스(화면, CLI or GUI) 관리, 시스템 관리(보안 관련)

즉, OS는 컴퓨터 하드웨어를 관리하는 프로그램이다.

3. 운영체제의 기능

운영체제의 기능은 크게 자원 관리 기능과 기타 기능으로 나눕니다.
가장 먼저 자원 관리 기능은 하드웨어 자원을 각 사용자 애플리케이션에 적절히 분배해주는 것이다.
하드웨어 자원은 CPU, 메인메모리, 하드디스크, 키보드, 마우스, 프린터 등이 존재한다.
하드웨어 자원 관리 기능에서는 프로세스 관리, 메모리 관리, 보조기억장치 관리, 장치 관리(입출력 관리), 파일 관리로 분류된다.
자원은 사용자 애플리케이션이 요구하거나 운영체제 내의 규칙에 의해 적절히 분배하여 컴퓨터의 성능을 최대한 효율적으로 사용해야 한다.

운영체제 기타 기능에서는 시스템 보호, 네트워킹, 명령 해석기와 시스템 관리로 분류된다.

3.1 자원 관리 기능

1) 프로세스 관리(Process management)

프로세스 관리는 운영체제 기능 중 가장 중요한 기능 중 하나이다. 프로세스와 프로그램은 기본적으로 구분된다. 프로세스는 실제 메인 메모리에서 실행 중인 프로그램을 말한다. 프로그램은 하드디스크와 같은 보조기억장치에서 아무런 동작을 하지 않는 상태이다.
이를 어떠한 요청에 의해 메인 메모리에 할당하여 CPU를 사용하면서 실행하게 되는데 이를 프로세스라고 부른다.

프로세스 관리의 주요 기능은 다음과 같다.

  • 프로세스의 생성과 소멸(creation, deletion)
  • 프로세스 활동 일시 중지, 활동 재개(suspend, resume)
  • 프로세스 간 통신(IPC, InterProcess Communication)
  • 프로세스 간 동기화(synchronization)
  • 교착상태 처리(deadlock handling)

2) 주기억장치 관리(Main memory management)

주기억장치 즉, 메인 메모리는 프로그램이 실행되기 위한 공간이다. CPU는 오직 메인 메모리에 있는 프로그램(프로세스)하고만 소통할 수 있다. 주기억장치 관리에서는 메인 메모리를 효율적으로 사용하도록 관리한다.

  • 메모리에 어떤 프로세스를 저장할 지 결정(메모리의 효과적 사용)
  • 프로세스에게 메모리 공간 할당(allocation)
  • 메모리의 어느 부분이 사용되고, 어느 프로세스에게 할당되었는가 추적 및 감시
  • 프로세스 종료 시 메모리 회수(deallocation)
  • 가상 메모리 : 물리적 실제 메모리보다 큰 용량을 사용할 수 있게 된다.

3) 파일 관리(File management)

디스크는 물리적으로 track과 sector로 구성되어 있으며, 여기서 파일이라는 논리적 관점으로 데이터를 바라보고 관리하는 것이다

파일을 운영체제가 실행되는 컴퓨터에서 자주 볼 수 있는데, 이는 복잡한 과정으로 하드디스크에 저장되어 있는 것을 사용자가 편리하게 사용할 수 있도록 파일이라는 논리적 형태로 운영체제에서 관리하여 보여준다.

  • 파일의 생성과 삭제(file creation, deletion)
  • 디렉토리(Directory)의 생성과 삭제
  • 기본 동작 지원 : open, close, read, write, create, delete
  • track/sector : file 간의 매핑(mapping)
  • 백업(Backup)

4) 보조기억장치 관리(Secondary storage management)

보조기억장치는 대표적으로 하드디스크, 플래시 메모리(주로 스마트폰에 사용)가 있다. 하드디스크를 예로 들면, 하드디스크에서 아무것도 저장되어 있지 않는 공간을 block이라 하는데, 보조기억장치 관리는 이를 관리하는 것이다.

  • 빈 공간 관리(Free space management) : 처음에는 블록들이 하나도 사용안되고 있다가 사용된다면 그 해당 공간들을 관리한다.
  • 저장공간 할당(Storage allocation) : 3개의 블록이 필요하다면 비어있는 공간중에 어느 블락을 사용할 것인지 처리한다.
  • 디스크 스케줄링(Disk scheduling) : 블록들이 흩어져있는데 헤드를 많이 움직이면 시간이 많이 걸릴테니 최소한의 움직임으로 원하는 track/sector를 읽어올 것인가를 결정한다.

5) 입출력 장치 관리(I/O device management)

입출력 장치에는 키보드, 마우스, 프린터, 스피커, 마이크 등이 있다. 입출력 장치 관리는 이와 같은 여러 입출력 장치를 사용하기 위해 존재한다.

  • 장치 드라이버(Device drivers)
  • 입출력 장치의 성능향상 : buffering, caching, spooling

6) 시스템 콜(System call)

시스템 콜은 유저 프로세스에서 운영체제 서비스를 필요로 할 때 이를 받기 위해 사용하는 호출이다.

위는 process 1에서 프로세스 관리에 시스템 콜을 요청한 모습이다. 프로세스가 실행하는 중간에 운영체제 서비스가 필요하면 시스템 콜을 통해 운영체제 안의 해당 코드로 점프할 수 있다.

주요 시스템 콜

  • Process : end(정상 종료), abort(강제 종료), load, execute, create, terminate, get/set attributes, wait event, signal event
  • Memory : allocate, free
  • File : create, delete, open, close, read, write, get/set attributes
  • Device : request, release, read, write, get/set attributes, attach/detach devices
  • Information : get/set time, get/set system data
  • Communication : socket, send, receive

3.2 기타 기능

추가적으로 시스템 보호, 네트워킹, 명령어 해석기, 시스템 관리 등의 기능도 한다.

1) 시스템 보호

운영체제에 있는 프로세스는 다른 사용자의 프로그램으로부터 보호되어야 한다.
따라서 여러 자원은 운영체제가 적절한 권한을 부여한 프로세스만 수행될 수 있도록 해야한다.
예를 들어, 기억장치 주소를 지정하는 하드웨어는 프로세스가 자신의 주소 영역에서만 실행되도록 보장하고, 타이머는 다른 프로세스가 양도한 제어를 받지 않은 프로세스가 프로세서의 제어권을 얻지 못하도록 보장해야 한다.

2) 네트워킹

분산 시스템은 메모리나 클록을 공유하지 않는 프로세서의 집합이다.
프로세서는 자신의 지역 메모리와 고속으로 전송하는 버스, 전화선과 같은 여러가지 통신 매체를 통해 상호 통신하는 다른 프로세서를 가지고 있다. 시스템에 있는 프로세서는 다양한 방법으로 구성될 수 있는 통신 네트워크를 통해 연결된다.

3) 명령해석기와 시스템 관리

사용자가 입력한 여러가지 명령은 제어 문장에 의해 운영체제에 전달되는데, 이 전달을 명령 해석기가 담당한다.
여기서 주의해야할 점은 명령 해석기는 사용자와 운영체제 간의 인터페이스 역할을 할 뿐이지 운영체제는 아니다.
예를 들어서, 마우스를 사용하는 윈도우나 매킨토시의 명령 해석기는 인터페이스다.

4. 운영체제의 종류

운영체제는 다양한 기준으로 구분지을 수 있다.

  1. 동시 사용자 수
  2. 동시에 실행할 수 있는 프로그램 수
  3. 작업 처리 방식(사용자가 느끼는 사용 환경)

4.1 동시 사용자 수

1) Single-user system : OS를 한 명만 사용하는 경우

  • 혼자 쓰기 때문에 관리가 더 쉽다.
    ex) Windows10, Android, iOS

2) Multi-user system : OS를 여러명이 동시에 접속해서 사용하는 경우

  • 함께 쓴다 = 서버 즉, 호스트 시스템을 사용한다는 의미
  • 서버에서 돌아가는 시스템들을 여럿이서 동시에 사용함
  • 자원 관리가 더 어렵다
    (누구에게 어떤 자원을 할당해줄지, 누가 먼저 자원을 쓰게 할지 관리할 일이 증가하기 때문에)
  • 따라서 OS가 Single-user system보다 더 복잡함
  • 흔히 서버라고 부르는 컴퓨터는 다중 사용자용 OS임
    ex) Unix, Linux, Windows Server

4.2 동시 실행 프로그램 개수에 따른 구분

1) Single-tasking system : 한 번에 하나의 작업(프로그램)만 수행 가능

  • 하나를 다 끝내야만 다음 프로그램을 수행할 수 있음(요즘엔 잘 사용하지 않음)

2) Multi-tasking system(multi-programming system)

  • 현재 널리 쓰이는 운영체제 (ex) Windows, Linux, Unix)

  • 동시에 2개 이상의 프로그램 처리 수행 가능

    • 대화형 시스템(interactive system)이라고도 부름
    • 다중 작업용 OS의 경우 프로그램을 같이 수행시키지만 사용자 입장에서는 각 프로그램에 대한 키보드 입력의 결과를 바로 화면에 보여주기 때문에 이러한 시스템을 대화형 시스템이라 한다. 즉, 사용자의 입력에 곧바로 응답한다.
    • 여러 사용자가 동시에 접속해서 쓰는 서버나 서버 컴퓨터도 대화형 시스템에 해당한다. 사용자의 입력에 곧바로 응답한다.
    • 사용자가 혼자 사용하는 것처럼 느낄 수 있는 환경이 된다.
  • 다중 작업이라 하더라도 CPU에서는 매순간 하나의 프로그램만 수행한다.
    CPU에서 번갈아 수행되지만 CPU 처리 속도가 워낙 빨라서 여러 프로그램들이 동시에 수행되는 것처럼 보이는 것이다.

  • 시분할 시스템

    • 여러 프로세스가 CPU의 작업 시간과 와 메모리를 공유하는 시스템
    • CPU 처리 속도는 수 밀리초(ms)로 매우 짧기 때문에 CPU가 하나여도 동시 실행되는 것처럼 보임
  • 다중 프로그래밍 시스템

    • CPU와 달리 메모리의 경우에는 여러 프로그램들이 조금씩 메모리 공간을 보유하며 동시에 메모리에 올라갈 수 있다.
    • 메모리 공간을 분할해 여러 프로그램들을 동시에 메모리에 올려놓고 처리하는 시스템을 멀티 프로그래밍 시스템이라고 한다.
  • 멀티 프로세서 시스템

    • 일반적으로는 한 컴퓨터에 하나의 CPU가 탑재된다.
    • 멀티 프로세서 시스템이란 하나의 컴퓨터에 여러 개의 CPU가 설치된 경우를 뜻한다.
    • 서로 다른 CPU에서 여러 프로그램이 동시 실행 가능
    • OS 입장에선 여러 CPU를 관리하기 위해 더욱 복잡한 매커니즘을 필요로 함
  • 동시에 여러 작업을 해야하는 만큼 좀 더 복잡함 (동기화, 동시수행을 추가로 관리해야해서)

4.3 작업 처리 방식에 따른 구분

어떻게 작업을 처리해 나가는지로도 운영체제를 구분할 수 있다. 사용자가 작업을 요청하면 처리 과정을 거쳐 결과물을 받게되는데, 결국 요청 이후 얼마나 기다려야 결과물이 나오는지 사용자가 느끼는, 체감할 수 있는 사용 환경에 따른 구분이라고 볼 수도 있다.

앞서 도입 부분에서 잠시 언급한 것과 같이 운영체제는 하드웨어를 보다 잘 관리하는 역할을 수행하고, 잘 관리하기 위해 이전 운영체제의 문제들을 개선하며 발전해왔다.

따라서 이 발전 과정에 따라서 운영체제의 종류를 다음과 같이 구분한다.

1) 순차처리 시스템
2) 배치 시스템
3) 시분할 시스템
4) 퍼스널 컴퓨팅
5) 병렬 처리 시스템
6) 분산 처리 시스템
7) 실시간 시스템

1) 순차처리 시스템 (~ 1940)

과거에는 따로 운영체제라는 개념은 없고, 그냥 기계어로 프로그램 작성부터 하드웨어 관리 등 결과를 출력하기 위해 필요한 모든 디테일한 작업을 일일이 사용자가 작성했다.
(ex. 천공카드 : 데이터를 표현하기 위해 규칙에 따라 구멍을 뚫어 사용하는 종이카드, 구멍을 뚫는지의 여부로 비트를 표현)

당연히 오래걸리고, 특히 앞 사용자와 뒷 사용자가 서로 매우 다른 작업을 수행해야 한다면 그 작업을 수행하기 위한 준비작업(세팅)에 걸리는 시간까지 오래 걸렸다. (= 시간이 오래걸린다.)

2) 배치(일괄처리) 시스템 (1950 ~ 60)

시간이 오래걸린다는 순차처리 시스템을 개선하기 위해 등장한 시스템이다. 배치 즉, 특정 단위 만큼 위 작업이 모일때까지 기다렸다가 모이면 그때 일괄적으로 작업을 수행해주는(누가? 중앙 - 전자계산소, 전산소) 일괄처리 시스템이다.

한꺼번에 실행하니 당연히 세팅 작업에 들어가는 시간을 줄일 수 있었다. 기존 방법보다 시스템 지향적(시스템이 처리하기에 더 좋은 방식인)이었고, 처리효율(throughput) 향상, 여러 사용자가 시스템 자원을 공유할 수 있다는 장점이 있다.

하지만 배치가 모일때까지 대기하는 시간으로 인해 생산성이 저하되는 문제가 생겼다. 다시말해 응답시간(작업을 제출해 결과물을 출력하기까지의 시간)이 오래걸렸다. (=대기시간 문제)

즉, 작업 요청을 모아서 한꺼번에(일괄로) 처리하는 방식이기 때문에 작업 요청을 모으는 동안 CPU가 할 일이 없기 때문에 자원이 낭비된다.

3) 시분할 시스템 (1960 ~ 70)

작업들이 대기하는 시간이 오래걸린다. 그럼 작업을 번갈아가면서 조금씩 수행하게 만들면 대기시간을 줄일 수 있다. 말그대로 시간을 쪼개(시분할) 각 작업에 할당하는 방식이 시분할 시스템이다.

일괄로 처리할때는 A작업, B작업, C작업 순으로 진행했는데 시분할 시스템에서는 A작업 일부, B작업 일부, C작업 일부, 다시 A작업 일부 … 이런 식으로 시간을 쪼개어 쓸 수 있다.
(사용자들이 각자 자신의 터미널(단말기)를 통해 시스템에 접속하고 input을 전달하면, 전산소에서 이를 처리한 뒤 개별 사용자에게 결과를 보냄)

일괄처리 방식보다 좀 더 사용자 지향적이며 단말기를 통한 대화형 시스템이라 생산성도 전보다 높아졌다. 당연히 대기시간도 단축할 수 있었다. 이렇게 여러 작업을 한꺼번에 할 수 있게 되었지만(자원의 효율적 활용) 이렇게 작동하게 하기 위해 운영체제는 기존 방법보다 복잡해진다. 예를 들어 파일 시스템이나 가상메모리 등을 관리해주는 작업이 필요했다. 또 단말기 접속 방식을 사용했기 때문에 통신 비용, 보안 문제가 있었고 동시 사용자의 수에 따라 시스템의 부하가 생겨 느려지는 문제가 생겼다.

여러 작업을 일정 시간 단위로 분할해서 처리하는 방식으로, 모든 운영체제에서 가장 많이 사용하는 작업 방식이다. 작업의 우선순위와 처리 순서는 이후 CPU 스케줄링따라 다르다.

4) 퍼스널 컴퓨팅

사용자들이 OS를 공유하는 게 아니라, 혼자 독점해서 사용하는 방식이다. 퍼스널 컴퓨팅 방식을 사용하기 전에는 CPU 활용률을 최대화 하는 게 목적이었다.

하지만 퍼스널 컴퓨팅 방식의 도입으로 CPU 활용률은 그리 중요하지 않아졌다. 가동할 수 있는 CPU를 최대한 쓰는 것보다, 지금 내가 작업을 편하게 잘 쓸 수 있는지, 사용자 지원 기능이 훨씬 더 중요해지게 되었다.

따라서 혼자 운영체제를 독점하기 때문에 운영체제는 좀 더 단순해졌고, 사용자 편의를 개선하는 기능을 제공하는 쪽으로 발전하게 되었다. 혼자 사용하기에 빠르지만, 이전보다 컴퓨터 자체의 성능은 좀 더 낮다고도 볼 수 있다. (물론 CPU를 여러개 넣어서 성능을 개선할 수도 있다.)

5) 병렬처리 시스템

바로 위에서 CPU를 여러개 넣어서 컴퓨터의 성능을 개선한다고 했는데, 이처럼 하나의 시스템에 여러개의 프로세스를 사용하는 시스템을 병렬처리 시스템이라한다. 병렬처리 시스템은 tightly-coupled system으로도 불리는데, 이는 메모리같은 다른 자원들과 tight 하게 묶여있기 때문이다. CPU는 여러개지만 메모리같은 자원은 아직 공유하는 상태이기 때문이다.

이 시스템을 사용하는 목적은 당연히 성능 향상과 신뢰성 향상(한 CPU가 고장나도 다른 CPU가 대신 그 작업을 수행할 수 있어서 성능은 떨어져도 시스템을 계속 돌아가게 할 수 있기 때문)인데, 프로세서가 여러개이다보니 이들 간 작업을 어떻게 배분할지의 역할도 추가적으로 지정해야 하므로 좀 더 복잡해진다.

뿐만 아니라, 현실적으로 CPU를 무제한으로 컴퓨터에 넣을 수도 없다. 이 모든 CPU를 감당할 공간적, 시스템적인 한계가 있기 때문이다. (성능 개선을 위해 무한정 CPU를 늘리는 것은 어렵다)

6) 분산처리 시스템

CPU를 늘리지 못한다면, 컴퓨터를 늘려볼 수 있다. 즉, 컴퓨터를 연결시키는 네트워크 기반의 병렬처리 시스템이 등장했다. 이 네트워크 기반의 병렬처리 시스템은 네트워크를 통해 컴퓨터들을 묶는 것으로, 통신을 이용하는 방법이기 때문에 개별 컴퓨터(=노드)들의 자원은 독립적으로 존재한다. (즉, 각 노드는 자신만의 OS가 있다.) 따라서 Loosely-coupled system으로 부르기도 한다.

물리적인 통신망을 이용하기 때문에 연결하기 쉽지만 관리는 어렵다. 따라서 이를 관리하는 분산운영체제를 통해 하나의 프로그램, 자원처럼 사용할 수 있다. (ex. 클러스터 시스템, 클라이언트 서버 시스템, P2P)

쉽게 컴퓨터를 늘릴 수 있고, 높은 성능과 신뢰성, 확장성이 장점이라면 구축 및 관리가 어렵다는게 단점이다. (컴퓨터를 모아놓고 죄다 선으로 연결하기 때문에 만약 문제가 발생한다거나 실수로 잘못 연결하는 등 관리가 쉽지 않다.)

7) 실시간 시스템

실시간 시스템은 위의 시스템들과는 별개로, 무엇인가를 개선해 등장했다기보다 기존 방식과는 다른 작업처리 관점의 시스템이다. 작업처리에 제한 시간을 두는 시스템인데, 어떤 작업을 요청했을 때 사용자에게 무조건 답을 줘야만 하는 시스템이다.

  • 하드 real-time 시스템 : 시간 안에 결과를 보장하지 못하면 큰 문제가 발생하는 시스템
    ex. 원자력발전 관련 시스템, 무기 제어
  • 소프트 real-time 시스템 : 멀티미디어 스트리밍 시스템과 같이 데이터가 시간맞춰 전달되어야 올바른 기능을 수행할 수 있는 시스템(=시간 내에 결과를 보장하지 못해도 심각한 문제를 초래하지는 않는 시스템)
    ex. 동영상 인코딩 에러, 동영상 재생이 끊기거나 정확히 전달되지 않을 경우

주로 항공 관제, 반도체 공정 같이 각 작업의 시간 제한을 엄수해야 하는 시스템에서 사용하는 처리 방식이다. 정해진 시간 내에 결과를 보장해야 한다.

5. OS의 구조


OS는 커널(Kernel : 핵)과 셸(Shell : 껍질)로 이루어져있다.

  • OS는 하드웨어 위에서 실행된다.
  • 응용프로그램(Application)은 OS 위에서 실행된다.
    → 즉, 하드웨어와 어플리케이션 사이에 운영체제가 위치하고 있다.

1) Shell (Command Interpreter)

  • Windows를 사용하는 컴퓨터를 부팅하면 바탕화면이 나온다.
    => 그래픽 인터페이스를 통해 사용자가 명령함
  • Linux를 사용하는 컴퓨터를 부팅하면 명령어 창이 나온다.
    => 텍스트를 통해 사용자가 명령함

이처럼 Shell은 다양한 방법으로 입력된 사용자의 명령을 해석하여 그에 대한 아웃풋을 보여주는 역할을 한다.
흔히 우리가 Windows를 다룰 줄 안다는 의미는 Shell을 잘 다룬다는 의미로 해석할 수 있다.

2) Kernel

실제로 사용자가 명령을 입력하면 다양한 하드웨어 리소스들을 효율적으로 사용하여 사용자가 원하는 프로그램을 실행해야 하는데 이런 과정은 전부 Kernel에서 진행된다.

대표적인 4가지 기능 : CPU 스케줄링, 메모리 관리, 입출력 관리, 파일관리

  • CPU 스케줄링 : 어떤 프로세스에게 CPU 제어권을 줄 지
  • 메모리 관리 : 한정된 메모리를 어떻게 관리할 지
  • 파일 관리 : 디스크에 파일을 어떻게 보관할 지
  • 입출력 관리 : 여러 다른 입출력 장치와 컴퓨터 간의 상호작용을 관리

여기서 API와 시스템 콜이란, 사용자가 응용프로그램 또는 쉘을 이용해 어떠한 명령을 한다고 가정하면, 이러한 명령은 시스템 콜을 통해 운영체제의 커널영역으로 들어가게된다. 이를 시스템 콜(System call) 이라고 한다.
다시 말해, 사용자 프로그램 단에서 운영체제의 기능을 이용하기 위해 호출하는 함수이다.

하지만 시스템 콜이란 이러한 과정을 담고있는 함수이기 때문에 사용이 번거롭다. 따라서 시스템 콜을 제공하는 어떠한 라이브러리 혹인 함수의 형태로 API를 응용프로그램에게 제공한다. 이렇게 되면 API를 통해 비교적 쉽게 OS의 기능을 이용할 수 있게 된다. 가령 우리가 자주쓰는 C언어의 printf문도 운영체제에 접근해, 모니터로 출력하기 위한 일종의 시스템 콜 API라고 할 수 있다.

하지만 이러한 API를 제공함에 있어 윈도우가 가지고 있는 API와 리눅스의 POSIX API등의 규격이 다르기에, 우리는 윈도우에서 돌아가는 프로그램을 리눅스에서는 사용할 수 없게 된다.
API란 더 넓은 뜻으로 사용되기도 하지만 여기서는 이렇게만 알아두고 넘어가도록 하자.

우리가 응용프로그램을 설치할 때를 생각해보면 설치 파일이 OS에 따라 구분되어 있는 것을 알 수 있다.
이는 응용프로그램은 OS 위에서 실행되기 때문에 Windows에서 설치한 프로그램은 Linux나 macOS에서는 실행이 불가능하다.

즉, OS는 Resource Manager로서 리소스를 응용프로그램에 할당하는 역할을 한다.

6. 부팅

메인 메모리는 RAM과 ROM으로 나뉘어져있다.
ROM은 Read-Only-Memory의 약자로 RAM에 비해 용량이 굉장히 작다.
프로세서는 컴퓨터가 켜지자마자 ROM에서 코드를 가져와 실행한다.

ROM에는 2가지 코드가 들어있다.

  • POST 프로그램
    Power On Self Test의 약자로 컴퓨터가 켜질 때 컴퓨터 스스로 동작할 수 있는 상황인지 테스트하는 코드이다.
  • Boot Loader
    하드디스크에서 OS가 저장되어있는 위치를 찾은 후 OS를 RAM으로 올려주는 프로그램을 Boot Loader라고 한다. Boot는 올린다는 뜻이고, Load는 적재한다는 의미로 OS를 올려서 RAM에 적재해주는 프로그램을 의미한다.

OS가 RAM에 잘 적재되었다면, 이제 컴퓨터는 사용자가 실행하는 프로그램들을 실행할 준비가 된 것이다. 이 때 적재된 OS는 컴퓨터가 종료될 때까지 RAM에 적재되어있다.
이를 OS가 메인 메모리에 Resident(거주)한다고 한다.

정리

  • 전원이 켜지기 전
    • Boot Loader가 실행가능 상태로 존재, 주로 시스템에 내장된 ROM, 하드디스크, 네트워크 상의 다른 서버 등에 저장되어 있다.
  • 전원이 켜진 후
    • 바이오스(BIOS)로부터 제어권을 넘겨받는다.
    • RAM을 사용할 수 있게 초기화하고 루트(root) 파일시스템을 준비한다.
    • 필요한 하드웨어를 초기화한다.
    • 특정 운영체제 커널을 RAM에 올린다.
    • 제어권(실행권한)을 운영체제 커널에 넘겨준다.

7. 컴퓨터 구조


컴퓨터 구조를 나타내는 그림이다. CPU는 메모리와만 작업하고, 메모리는 OS 및 user program의 데이터를 저장하고 있다. user process 간에는 인터럽트를 통해 CPU의 제어권을 넘겨받는다.

각각의 용어에 대해 간략하게 설명한다면,

1) mode bit

  • CPU의 접근 권한을 표시하는 register bit이다. 0은 커널 모드, 1은 사용자 모드가 실행중임을 나타낸다. 이 mode bit가 1일 때 CPU의 접근을 제한하기 위해 사용한다.
  • 이러한 듀얼모드를 사용하는 이유는?
    사용자 프로그램이 실행되면서 자신의 프로그램이 있는 영역을 벗어나 다른 사용자 영역을 침범하거나 운영체제의 영역을 침범하는 것을 방지하기 위함이다.
  • 시스템의 다양한 설정이나 데이터에 대한 접근, 수정 권한을 갖지 않으면 사용자 프로그램, 응용 프로그램 등이 실행된다.
  • 유저모드에서 프로그램을 실행하다가 디스크나 메모리 접근과 같은 커널 모드에서만 가능한 작업이 필요할 때는 System Call을 하게되고 운영체제 프로그램이 커널 모드에서 요청작업을 완료한 후 다시 원래 실행 중이던 프로그램으로 돌아가게 된다.

2) timer

특정 프로세스가 CPU를 너무 오랫동안 점유하는 것을 막기 위한 타이머이다. 타이머를 이용해 작업을 시간 단위로 측정하고, 정해진 bound가 지나면 OS에게 제어권이 넘어가도록 인터럽트를 발생시킨다. 위에서 언급한 시분할 시스템을 구현하기 위해 사용된다.

3) I/O Device Controller

외부의 I/O 장치를 관리하기 위한 해당 기기 자체의 일종의 CPU이다. register, local buffer를 보유하고 있다.

4) DMA Controller

I/O 장치 특성상, 입출력이 비정기적으로 자주 발생할 수 있다. CPU가 인터럽트를 자주 당하게 되면 원래 하던 작업을 제대로 완수하지 못하기 때문에, 이것을 방지하기 위한 보조 장치다. CPU의 중재 없이 Device Controller가 Buffer storage의 내용을 메모리에 직접 전송하는 것을 돕는다.

5) User program(사용자 프로그램)

I/O 장치와 직접 상호작용할 수 없다. CPU와 비교했을 때, 권한 수준이나 메모리 접근 능력이 다르기 때문이다.
따라서 CPU를 통해서 I/O 장치에 접근해야 하는데, 이것을 위해 시스템 콜(System call)이라는 커널 인터페이스가 이용된다. 사용자 프로그램은 시스템 콜을 호출해서 I/O 작업을 할 수 있다.

6) Interrupt

왜 있어야 할까?

  • 입출력 연산이 CPU 명령 수행속도보다 현저히 느리기 때문이다. 입출력 처리를 기다리는 동안 CPU가 쉬니까 입출력이 완료되면 CPU에게 알리는 기능이다.

  • 즉, CPU는 한번에 한 프로세스밖에 처리할 수 없기 때문에 어떤 일을 처리하는 도중에 우선 순위가 급한 일을 처리할 필요가 있을 때 대처할 수 있는 방안이 필요하기 때문에

  • I/O 하드웨어 같은 장치나 예외상황이 발생했을 때, 발생한 시점의 레지스터 및 PC를 저장한 뒤 CPU의 제어권을 ISR(인터럽트를 처리하는 커널 함수)에 넘기는 기능을 의미한다.
    즉, CPU가 특정 기능을 수행하는 도중에 급하게 다른 일을 처리하고자 할 때 사용할 수 있는 기능이다.

인터럽트 종류

1) 외부 인터럽트(하드웨어 인터럽트)

  • 입출력 장치, 타이머, 전원, 디스크 컨트롤러 등의 CPU 외부의 주변장치로부터 요구되는 것으로, 운영체제의 처리를 요하는 상황을 알리기 위해 전기적인 신호를 사용해 구현됩니다.
    • 전원이상(Power fail) 인터럽트 : 프로그램을 실행하는 도중 정전이나 컴퓨터 자체 내에서 기계적인 문제가 발생한 경우
    • 기계 착오(Machine check) 인터럽트 : CPU의 기능적인 오류 (프로그램 실행 중 보호된 메모리에 접근하거나 불법적인 명령 수행과 같은 프로그램의 문제가 발생한 경우)
    • 외부 인터럽트 : 오퍼레이터나 타이머에 의해 의도적으로 프로그램이 중단된 경우
    • 입출력 인터럽트 : 입출력의 종료나 입출력의 오류로 인해 CPU의 기능이 요청되는 경우

2) 내부 인터럽트

  • 프로그램 실행 중 잘못된 명령이나 데이터를 사용해 프로그램 상에 처리 불가능한 오류나 이벤트를 알리기 위한 경우 발생한다.
  • 이를 Trap 또는 Exception이라 한다.
    • Overflow/Underflow
    • 0으로 나누기
    • 기타 프로그램 Exception

3) 소프트웨어 인터럽트

  • 사용자가 프로그램을 실행시키거나 SuperVisor(=OS)를 호출하는 동작을 수행하는 경우
  • System Call, SVC(SuperVisor Call)

인터럽트 과정


processA 실행 중 디스크에서 어떤 데이터를 읽어오라는 명령을 받았다고 가정했을 때,

  1. process A 는 system call을 통해 인터럽트를 발생시킨다.
  2. CPU는 현재 진행 중인 기계어 코드를 완료한다.
  3. 현재 PSW, PC, Register 의 정보를 PCB에 저장한다.
  4. 인터럽트 처리 루틴(IPR) 실행하여 인터럽트를 요청한 장치를 식별한다. 인터럽트 벡터를 읽고 ISR주소값을 얻어 ISR로 점프한다.
  5. 인터럽트 서비스 루틴(ISR) 실행
  6. 인터럽트 서비스 루틴이 종료된 후 PCB에 저장했던 내용을 되돌려 놓는다.
    (서비스 루틴 수행 중, 우선순위가 더 높은 인터럽트가 발생하면 재귀적으로 1~5과정 수행)
  7. ISR 끝에 IRET 명령어에 의해 인터럽트가 해제된다.
  8. IRET 명령어가 실행되면, 저장했던 PC값을 복원하여 이전 실행 위치로 되돌아간다.

인터럽트 우선순위 판별 방법

1) 소프트웨어에 의한 우선순위 부여 방식 : Polling

주기마다 인터럽트 요청 플래그를 차례로 비교하여 우선 순위가 가장 높은 장치를 찾아 이에 해당하는 ISR을 수행하는 방식

  • 프로그램으로 처리하므로 하드웨어적인 방법에 비해 우선순위 판단 속도가 느려서 인터럽트 반응 속도가 느리다.
  • 속도가 빠른 장치에 높은 등급을 부여한다.
  • 프로그램의 변경이나 수정이 쉬우므로 유연성이 있다.
  • 하드웨어적인 장비가 없으므로 경제적이다.
  • 정보량이 많은 시스템에 적합하다.
  • Polling의 주기가 짧으면 서버 성능에 부담이 생기며, 주기가 길어지면 실시간성이 떨어진다.

2) 하드웨어에 의한 우선순위 부여 방식

CPU와 인터럽트 요청 장치 사이에 장치 번호를 식별할 수 있는 버스를 직렬/병렬로 연결하여 요청 장치의 번호를 CPU에게 알려주는 방식

  • 하드웨어로 처리되므로 인터럽트 반응 속도가 빠르다.
  • 회로가 복잡하고 융통성이 없다. → 변경이나 수정이 어렵다.
  • 추가 하드웨어가 필요하므로 비경제적이다.
  • 방식
    • Daisy Chain
      • 인터럽트가 발생하는 모든 장치를 하나의 직렬 회선으로 연결한다.
      • 우선순위가 높은 장치를 상위에 두고 우선순위를 차례대로 배치한다.
    • Parallel Priority(병렬 우선순위)
      • 인터럽트가 발생하는 모든 장치를 각각의 직렬 회선으로 연결한다.
      • 각 장치별 우선순위를 판별하기 위한 Mask register에 bit를 설정한다.
      • 우선순위가 높은 서비스 루틴 실행 중엔 우선순위가 낮은 bit들을 비활성화 시킬 수 있다.
      • 반대로 우선순위가 높은 인터럽트는 낮은 인터럽트 수행 중에도 우선 처리된다.

참고

  • Context Switching
    기존 작업을 인터럽트 작업을 수행한 후 다시 이어서 처리할 수 있도록 저장하는 절차
  • 중첩된 인터럽트
    • 순차처리 : 인터럽트의 중요도가 같을 때
    • 중첩처리 : 시급한 인터럽트가 먼저 들어온다. 중첩처리 되어지는 만큼 제어스택을 위로 쌓아둔다.
  • 인터럽트 벡터
    인터럽트 발생시 처리해야 할 인터럽트 핸들러의 주소를 인터럽트 별로 보관하고 있는 테이블
  • 인터럽트 서비스 루틴(=인터럽트 핸들러)
    • 인터럽트가 발생했을 때 해주어야 할 작업을 정의한 기계어 코드
    • 요청하는 장치와 발생 상황에 따라 종류 다양
    • 운영체제 커널 내에 존재
      • CPU 스케줄링, 메모리 관리루틴 등
  • 컨트롤러(controller)
    • 주변장치들이 탑재하고 있는 작은 CPU이다.
    • 해당 장치에 대한 업무를 처리한다.
    • 메인 CPU에 인터럽트를 발생시켜 보고한다.

7) I/O 장치

이처럼 입출력이 발생할 때마다 인터럽트를 발생시킨다. 하지만 키보드 입력 및 마우스 이동 등의 입출력 조작은 굉장히 빈번히 일어나고, 그 발생 시기를 CPU가 알 수 없기 때문에 I/O 요청 후 제어권의 변경 유무에 따라 입출력 방식이 나뉜다.

  • 동기식 입출력(Synchronous I/O)
    I/O 요청 후 입출력 작업이 완료되어야 제어가 User Program으로 넘어간다.
    이 때, I/O 작업의 속도가 비교적 느리고 언제 끝날 지 모르기 때문에 그 때 까지 CPU가 낭비된다는 단점이 존재한다.
  • 비동기식 입출력(Asynchronous I/O)
    I/O가 시작된 후 제어권이 즉시 User에게 넘어가는 입출력 방식이다.

시스템 콜과 인터럽트는 CPU의 제어권이 특정 프로세스에서 다른 프로세스로 이동한다는 공통점이 있지만, CPU의 제어권을 변경시키는 주체가 SW인지 HW인지에 따라 나뉜다.

I/O 방식

입출력 장치에는 컨트롤러가 있고 CPU와 입출력할 데이터를 저장하는 버퍼가 있다. 디스크의 데이터는 워드 단위로 버퍼에 채워진 후 CPU에게 인터럽트로 알리고 CPU는 버퍼의 내용을 메모리로 옮긴 후 다음 워드의 입력을 실행한다.

  • Programmed I/O
    CPU가 입력을 지시한 후 워드가 컨트롤러의 버퍼에 입력됐는지를 계속 확인하는 방법, 인터럽트가 없는 대신에 CPU가 지속적으로 완료의 여부를 확인한다.
  • Interrupt-driven I/O
    CPU가 입력을 지시한 후 워드의 입력이 이루어지는 사이에 CPU를 다른 작업에 활용하고 입력의 완료 시 인터럽트를 통해 CPU에게 알린다.
  • Direct Memory Access, DMA
    CPU는 입출력할 데이터의 시작주소와 크기 등을 Channel에게 알려주고 다른 작업을 수행하며, 채널의 주도하에 I/O가 이루어지며 한 번의 입출력 단위인 Block 단위로 CPU에게 인터럽트를 보내 알린다. 입출력 데이터가 클수록 잦은 인터럽트가 발생하는 Interrupt-driven I/O의 단점을 극복하기 위해 등장한 방식
  • Isolated I/O
    입출력 장치들이 I/O Bus를 통해 CPU와 연결되어 있는 경우로 I/O Bus를 통해 해당 장치의 지정, 데이터, 입출력을 구분해 주는 제어 값이 전달된다. 입출력 명령어가 명령어 집합에 추가되므로 제어 로직이 복잡해진다.
  • Memory-mapped I/O
    입출력 장치들이 메모리와 함께 메모리 버스에 연결되어 있는 경우로 입출력 장치들은 각각 메모리의 한 번지를 할당받아 그 번지로의 MOVE, LOAD 작업을 한다. 메모리 주소에 입출력 장치를 가리키는 번지수가 있어 주소 공간만큼 메모리를 활용하지 못한다.

8) 프로세서 내부의 레지스터 구성

  • PSW 프로그램 상태 워드 : 프로세서의 상태를 보관하는 레지스터, 시스템 내부에서 순간순간의 시스템 상태를 기록한다.
  • PC(프로그램 카운터): 다음 번에 실행할 명령어 주소를 기억하는 레지스터
  • IR(명령어 레지스터): 현재 실행중인 명령을 기억하는 레지스터
  • MAR(메모리 주소 레지스터) : 데이터의 주소를 기억하는 레지스터
  • MBR(메모리 버퍼 레지스터) : 메모리로부터 읽어온 데이터를 임시로 기억하는 레지스터로 데이터를 처리하기 위해 반드시 거쳐감
  • I/O AR(입출력 주소 레지스터) : 입출력 장치에 따른 입출력 모듈의 주소를 기억하는 레지스터
  • I/O BR(입출력 버퍼 레지스터) : 입출력 모듈과 프로세서 간의 데이터 교환을 위해 사용하는 레지스터

8. 주소를 통한 메모리 관리 방법

  • 메모리는 CPU가 직접 접근할 수 있는 컴퓨터 내부의 기억 장치이다.
  • 프로그램이 CPU에서 수행되려면 해당 부분이 메모리에 적재되어야 한다.
  • 한정된 메모리 공간에 여러 프로그램을 수용하려면 메모리에 대한 효율적인 관리 매커니즘이 필요하다.
  • 메모리를 관리하기 위해 OS는 메모리의 어느 부분이 어떤 프로그램에 의해 사용되고 있는지를 유지하는 데 이러한 정보를 Address(주소) 를 통해 관리된다.
  • OS는 프로그램에게 메모리가 필요할 때 할당해주고, 더 이상 필요하지 않을 때 회수한다.

물리적 메모리를 관리하는 방식

1) 고정 분할 방식

  • 물리적 메모리를 몇 개의 영구적인 분할로 나눈다
  • 나뉜 각각의 분할에 하나의 프로그램이 적재된다.
  • 융통성X, 효율성X, 최대 프로그램 수는 분할 개수로 한전됨
  • 분할 크기보다 큰 프로그램은 적재 불가능
  • 내부 단편화 발생 (분할 크기보다 작은 프로그램 적재시 남는 영역 발생)

2) 가변 분할 방식

  • 매 시점 프로그램의 크기에 맞게 메모리를 분할해서 사용하는 방식
  • 물리적 메모리보다 큰 프로그램은 실행 불가
  • 분할 크기와 개수가 동적으로 변화하기 때문에, 기술적 관리 요법 필요
  • 외부 단편화 발생(프로그램에 할당되진 않았지만 크기가 작아 프로그램을 올리지 못하는 메모리 영역 발생)

3) 가상 메모리 방식

  • 최근 거의 모든 컴퓨터 시스템에서 사용하는 메모리 관리 기법이다.

  • 물리적 메모리보다 큰 프로그램을 실행할 수 있다. (가상 메모리만큼)

    • 모든 프로그램은 물리적 메모리와는 독립적으로 주소가 0부터 시작하는 자신만의 가상 메모리를 갖게 된다.
    • 가상메모리의 주소를 물리적 메모리 주소로 매핑해 주소를 변환 후 물리적 메모리에 올린다.
    • 프로그램 전체가 항상 동시에 사용되는 것은 아니기 때문에, 현재 사용되고 있는 부분만 메모리에 올리고 나머지는 하드디스크와 같은 보조장치에 저장한다.
  • 가상 메모리 기법에서는 물리적 메모리의 크기와 상관없이 사용할 수 있는 메모리의 크기를 충분히 크다고 가정하고 프로그래밍하는 것이 가능하다.

  • 가능하게 하는 원리는 다음과 같다.

    프로그램 전체가 항상 동시에 사용되는 것은 아니다.
    그러므로 현재 사용되고 있는 부분만 메모리에 적재 후, 나머지(현재 사용되고 있지 않은 부분)는 하드디스크와 같은 보조 기억 장치에 저장해 두었다가 필요할 때 메모리에 적재하는 방식을 취한다.

    이 때 사용되는 보조 기억 장치의 영역을 우리는 스왑 영역(Swap Area)이라 부른다.

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



참고

https://velog.io/@hyeon930/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-1.-OS-%EA%B0%9C%EC%9A%94
https://velog.io/@10000001a/OS-ch1-1
https://rheem-hm.tistory.com/14
https://mikiplace.tistory.com/7
https://2jinishappy.tistory.com/147
https://woovictory.github.io/2018/12/21/OS-info/
https://huistorage.tistory.com/111
https://velog.io/@adam2/%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8
https://m.blog.naver.com/syunjae21/222065512231
https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9C%EC%84%B8%EC%84%9C_%EB%A0%88%EC%A7%80%EC%8A%A4%ED%84%B0

profile
🚀 백엔드 2년차 개발자입니다 🚀 성장의 즐거움으로 아자자자!🤣

0개의 댓글