흔히 OS (Operating System) 이라고 부르는 운영체제는 하드웨어 바로 위에서 실행되는 소프트웨어로써, 사용자 및 컴퓨터가 관리하는 모든 소프트웨어와 하드웨어를 관리하고 연결한다. 이는 우리가 흔히 아는 Windows
, Mac OS
뿐만이 아니라, 모바일에 사용되는 Android
, iOS
등도 운영체제에 포함됩니다.
운영체제의 핵심은 하드웨어와 소프트웨어 간의 상호작용을 관리하고 제어하는 것이다. 또한 컴퓨터 자원을 소프트웨어에 할당하여 어떠한 소프트웨어가 자원을 과점유하거나, 부족하게 사용하지 않게 적절하게 할당하고 자원을 관리한다.
좁은 의미의 운영체제는 커널
을 의미한다. 커널
은 운영체제의 일부이지만, 그 역할과 중요성이 너무 크기 때문에, 좁은 의미의 운영체제 라고도 부른다.
이 외에도 운영체제에는 각종 시스템을 위한 유틸리티들을 광범위하게 포함하여 넓은 의미의 운영체제라고 부른다. 보통 운영체제라고 하면 커널
을 의미하는 경우가 많다 그만큼 커널이 운영체제의 요소 중 핵심이기 때문이다.
운영체제의 종류에 따라 사용자 인터페이스를 제공하기도 하며, 기본적으로 하드웨어 자원 관리 및 제어, 프로세스 및 스케줄링 관리 및 제어 등과 같은 전반적인 하드웨어와 소프트웨어 사이의 필요한 일련의 작업들을 처리합니다. 또한 어떤 프로그램에서도 메모리에 직접 접근할 수 없도록 보안 기능을 제공하고 이는 악성 코드가 다른 프로세스나 시스템 자원에 접근하는 것을 방지합니다.
그리고 시스템 자원에 대한 권한을 제어하여 허가된 자원에만 접근할 수 있도록 합니다. 이는 파일, 디렉토리, 장치 등에서 읽기, 쓰기, 실행 권한을 설정하여 불법적인 접근을 막습니다.
이 외에도 시스템 콜 인터페이스, 커널 모드와 유저 모드 구분과 같은 컴퓨터의 전반적인 관리에 대한 기능을 제공합니다.
시분할(Time sharing) 시스템은 여러 작업을 수행할 때 컴퓨터 처리 능력을 일정한 시간 단위로 분할하여 사용하는 시스템이다. CPU 스케줄링과 다중 프로그래밍을 이용해서 각 사용자 들에게 컴퓨터 자원을 시간적으로 분할하여 사용할 수 있게 해준다. 일괄 처리 시스템
에 비해 짧은 응답 시간을 가지고 Interactive
한 방법이다.
일괄처리시스템 이란?
작업 요청의 일정량을 모아서 한꺼번에 처리하는 시스템이다. 일괄 처리 시스템은 작업이 완전히 종료될 때 까지 기다려야 하기 때문에 응답 속도가 늦다. 현대 운영체제에서 찾아보기 힘든 시스템이고
다중 프로그래밍 시스템 (Multi Programming System)은 메모리에 사용자의 프로그램이 2개 이상 적재되어 있고, 이를 번갈아가며 실행하다, 어느 한 프로그램에서 입출력 발생하게 되면 해당 입출력이 처리되는 동안 다른 프로그램을 처리하는 방식이다. 입출력 이벤트를 처리하게 되면 CPU는 그 시간 동안 대기를 하게 되지만, 다중 프로그래밍 시스템을 통해 입출력 명령을 처리하면서 다른 프로그램을 수행할 수 있다.
대화형 시스템 (Interactive System)은 위에서 설명한 일괄처리 시스템은 응답 시간이 느리기 때문에 바로바로 응답을 확인할 수 없다. 하지만 대화형 시스템은 사용자와 컴퓨터가 대화하는 것처럼 응답을 거의 즉시 확인할 수 있도록 소통을 원활하게 하고 효율성을 높입니다.
다중 처리기 시스템(Multi Processor System) 은 여러 개의 CPU로 구성된 시스템이다.
단일 처리기 시스템 (Single Processor System)에 비해 처리할 수 있는 CPU의 갯수가 많기 때문에 상대적으로 성능이 좋다.
또한 단일 처리기 시스템은 하나의 CPU가 고장 나게 되면, 전체적인 시스템이 중지되지만, 다중 처리기 시스템은 여러 개의 CPU가 존재하기 때문에 하나의 CPU가 중지되더라도 처리 속도만 느려질 뿐 시스템이 중지되지는 않는다.
운영체제의 핵심 요소로써, 하드웨어와 소프트웨어 간의 중재 역할을 수행하며 시스템 자원을 관리합니다. 우리가 흔히 운영체제라고 부르는 것은 대체로 이 커널을 의미합니다.
이 외에도 보안 및 접근제어, 네트워크, 인터럽트 처리 등 하드웨어와 응용 소프트웨어 사이에서 전반적인 관리와 제어를 담당합니다. 커널의 안정성과 효용성은 시스템의 전반적인 운영체제의 성능에 큰 영향을 끼칩니다.
운영체제의 실행모드에는 총 2가지가 있다.
커널 모드는 운영체제의 커널이 실행되는 모드입이다. 커널 모드에서는 전체 하드웨어 자원과 시스템 메모리 전체에 직접적인 접근이 가능합니다. 커널 모드에서 실행되는 코드는 시스템 전체에 대한 완전한 제어 권한을 가지기 때문에 프로세스 스케줄링, 메모리 관리, 시스템 콜, 입출력 작업 등 시스템 자원에 대한 기본적인 작업을 수행할 때 사용하는 모드입니다.
유저 모드는 응용 프로그램이 실행될 때 사용되는 모드입니다. 제한된 접근 권한을 가지기 때문에 커널 모드 처럼 자유롭게 하드웨어에 접근하거나, 시스템 메모리에 접근할 수 없습니다. 이는 애플리케이션의 시스템 공간만큼 접근할 수 있습니다.
또한 에러가 발생했을 때, 시스템 전체에 영향을 최소화합니다. 애플리케이션에서 발생하는 오류는 애플리케이션에만 영향을 미치기 때문에 시스템 전체의 안정성을 보장합니다. 만약 하드웨어에 대한 접근이 필요하면 시스템 콜을 통해 커널 모드로 전환하여 필요한 작업을 처리하고 그 결과를 유저 모드로 반환받습니다.
응용 프로그램들은 직접 하드웨어에 접근할 수 없고, 운영체제를 통해 하드웨어에 접근할 수 있는데, 이렇게 하드웨어를 다룰 수 있도록 하는 것이 인터페이스이다. 이는 응용 프로그램이 직접 하드웨어 자원에 직접 접근하거나 커널의 중요한 자원에 접근하는 것을 방지하기 위해 모든 하드웨어의 자원에 대한 접근은 운영체제를 통해서만 가능합니다.
public main void(String[] args) {
File file = new File("/example.txt");
try (FileWriter writer = new FileWriter(file)) {
writer.write("Hello, World!");
} ...
}
이런식으로 파일에 접근하여 내용을 수정하거나, 새로운 파일을 생성하고자 할 때, Java에서 추상화 한 시스템 콜을 호출하여 커널에서 해당 명령을 처리합니다.
폴링 (Polling)은 CPU가 주기적으로 특정 장치의 상태를 확인하여 해당 장치가 데이터나 처리를 요구하는지에 대한 여부를 점검하는 방식입니다. 구현이 간단하기 때문에 복잡하지 않다는 것이 장점이지만, CPU의 자원을 계속해서 사용해서 상태를 확인하고, 폴링하는 주기에 따라 지연이 발생할 수 있다는 것을 단점으로 꼽을 수 있습니다.
인터럽트 (Interrupt)는 하드웨어나 소프트웨어가 즉각적으로 CPU의 주의를 끌어야 할 필요가 있을 때 사용됩니다. 즉 CPU가 현재 작업을 멈추고 더 중요한 작업을 처리할 수 있도록 하는 신호입니다.
인터럽트가 발생하면 CPU는 현재 실행 중인 작업을 멈추고 인터럽트의 요청을 처리합니다. CPU는 인터럽트가 발생하면 해당 인터럽트에 맞는 인터럽트 핸들러를 호출합니다. 그리고 해당 인터럽트가 끝나면 CPU는 중단되있던 작업을 재개합니다.
예를 들어 사용자가 키보드를 입력했을 때, CPU는 현재 작업을 일시 중지하고 키보드 입력을 처리하는 인터럽트 핸들러를 실행합니다. 이 핸들러는 사용자가 입력한 문자를 읽고, 화면에 표시하거나 내부적으로 처리하게 됩니다.
DMA는 Direct Memory Access의 약자로 CPU의 개입 없이 메모리와 입출력 장치 간의 데이터 전송을 직접 처리하는 기술입니다. DMA는 데이터 전송의 효율을 높이고 CPU의 부담을 줄여주는 중요한 역할을 합니다.
이는 CPU가 많은 일을 하기 때문에 생겨났는데, 예를 들어
DMA를 통해 작업이 끝났다면 DMA는 CPU에게 인터럽트를 발생시켜 작업을 끝났음을 알리게 됩니다.
DMA가 필요한 이유
하드 디스크에서 파일을 읽어 메모리에 적재하려고 하면 메모리에는 CPU만이 접근할 수 있기 때문에 CPU에 인터럽트가 발생하게 되고, 하드 디스크의 데이터를 메모리에 적재하는 일도 반드시 CPU를 통해야만 한다.
처리량이 적당한 CPU라면 괜찮겠지만, 그렇지 않다면 해당 작업도 부담을 주기 때문에 CPU가 온전히 본인의 기능의 집중할 수 있도록 DMA가 생기게 되었다.
동기식 I/O는 작업이 완료할 때 까지 다른 작업을 처리하지 않고, 기다리는 방식을 말합니다. 흐름이 직관적이고 구현이 쉽지만 I/O 작업이 완료할 때 까지 대기하므로 CPU를 비효율적으로 사용하게 됩니다. 그렇기 때문에 I/O 작업이 지연되면 시스템 전체의 성능에 영향을 줄 수 있습니다.
비동기식 I/O는 동기식 I/O와 반대로 작업이 완료되기를 기다리지 않고 CPU가 다른 작업을 계속하는 방식입니다. I/O 작업이 완료되면 콜백이나, 완료 알림을 통해 결과를 처리합니다. 동기식 I/O에 비해 CPU가 놀지 않아 좀 더 효율적으로 사용할 수 있으며 전체 시스템 성능에 미치는 영향을 줄일 수 있습니다.