안녕하세요, iOS 개발하는 루피입니다!
오늘은 OS란 무엇인가?, OS를 왜 공부해야하지? 라는 주제로 공부한 내용을 정리해 보도록 하겠습니다.
바로 시작합니다.
OS 란 무엇인가?
간단하게 말하자면, OS는 컴퓨터 시스템을 운영하는 소프트웨어입니다.
우리가 흔히 사용하는 Windows, Linux, macOS, iOS 같은 것들이 바로 OS의 예죠.
OS는 컴퓨터라는 복잡한 기계를 우리가 편하게 사용할 수 있게 해주는 "중간 관리자" 같은 존재라고 생각하면 됩니다.
OS의 주요 특징 3가지
- 항상 작동한다: 컴퓨터가 켜져 있는 동안 OS는 계속 실행되며 시스템을 관리합니다.
- 서비스 제공자: 앱이 하드웨어를 사용할 수 있도록 도와줍니다.
- 관리자 역할: 프로세스, 자원(메모리, CPU 등), UI를 관리합니다.
그럼 OS는 왜 필요할까요?
만약 OS가 없다면, 사용자가 직접 하드웨어를 조작해야 합니다.
예를 들어, 키보드로 "A"를 입력했을 때 화면에 "A"가 나타나게 하려면 복잡한 하드웨어 명령어를 일일이 작성해야 하죠. 이건 너무 비효율적이고 어렵습니다.
OS는 이런 문제를 해결해 줍니다. 사용자가 앱을 통해 명령을 내리면, OS가 이를 하드웨어에 전달하고 결과를 돌려주는 "중재자" 역할을 하는 거예요.
그림을 통해 설명해보겠습니다.
사용자는 앱을 통해 파일저장 같은 명령을 내리게 되는데요, 그러면 OS가 그 명령을 받아 하드웨어에 전달하게 됩니다.
하드웨어는 그 작업을 수행하고 결과를 OS에 돌려주고, 사용자는 앱을 통해 결과를 확인할 수 있는 거죠!!!
이 과정 덕분에 우리는 복잡한 하드웨어를 신경 쓰지 않고 컴퓨터를 사용할 수 있는 겁니다.
잠깐, 컴퓨터 시스템이 도대체 뭐야?
여기서 궁금증이 생길 수 있죠. "OS가 우리를 편하게 해주는 건 알겠는데, 그럼 컴퓨터 시스템이 뭐야?"
컴퓨터 시스템은 하드웨어와 소프트웨어가 서로 상호 작용해서 특정 작업을 수행하는 통합된 구조입니다.
- 하드웨어: CPU, 메모리, 키보드, 디스크 등 물리적인 장치.
- 소프트웨어: OS와 앱처럼 하드웨어를 움직이게 하는 프로그램.
쉽게 말해, 컴퓨터 시스템은 하드웨어와 소프트웨어가 팀을 이뤄서 동작하는 "하나의 생태계"이고, OS는 그 생태계를 관리하며 사용자가 쉽게 접근할 수 있게 해주는 "조력자"입니다.
전형적인 컴퓨터 시스템의 모습
컴퓨터 시스템은 보통 하나 이상의 CPU와 여러 디바이스 컨트롤러(키보드, 디스크 컨트롤러)가 버스라는 공통 통로로 연결된 구조를 가집니다.
- 버스: 데이터를 오가는 "도로"라고 생각하면 됩니다.
- 인터럽트: 하드웨어가 "나 지금 작업 끝났어요!" 또는 "도와주세요!" 같은 신호를 CPU에 보내는 트리거예요. 예를 들어, 키보드에서 "A"를 누르면 인터럽트가 발생하고, 이 신호가 버스를 통해 CPU로 전달됩니다.
이때 각각 장치들이 연결된 하나의 긴 선이 버스라고 생각하시면 될 거 같습니다. 쉽게 말하면 데이터가 오고 가는 통로라고 보면 됩니다.
폰 노이만 아키텍처
대부분의 컴퓨터 시스템은 폰 노이만 아키텍처를 따릅니다. 이 구조의 동작 방식은 다음과 같아요:
- 메모리에서 명령어를 가져옵니다.
- CPU의 레지스터에 그 명령어를 저장합니다.
- CPU가 명령어를 해석하고 실행합니다.
- 결과를 다시 메모리에 저장합니다.
이 과정을 "명령어 실행 사이클"이라고 부르며, 컴퓨터가 일을 처리하는 기본적인 방식이에요.
메모리 계층 구조
컴퓨터 시스템의 메모리는 속도와 용량에 따라 계층적으로 나뉩니다:
- 레지스터: CPU 안에 있는 초고속 저장 공간.
- 메인 메모리(RAM): 우리가 흔히 아는 작업 메모리.
- SSD: 빠른 속도의 저장 장치.
- 자기 테이프: 대용량 백업용 저장소.
왜 이렇게 나눌까요? 속도는 빠를수록 비싸고 용량은 작아지니까, 효율적으로 자원을 활용하려고 계층을 만든 거예요.
I/O 구조와 DMA
OS의 중요한 역할 중 하나는 입출력(I/O) 관리입니다.
- CPU가 RAM에서 데이터를 가져와 디바이스에 전달하는 방식이 기본인데, 이 과정에서 DMA(Direct Memory Access)라는 기술이 등장합니다.
- DMA: CPU 개입 없이 디바이스가 메모리에 직접 접근하게 해서 효율성을 높이는 방법이에요. 예를 들어, 대용량 파일 전송 시 CPU가 다른 일을 할 수 있게 해줍니다.
멀티프로그래밍과 멀티태스킹의 등장
멀티프로그래밍(Multiprogramming)
과거엔 프로세스를 하나씩만 메모리에 올렸어요. 그러다 DMA가 등장하면서 상황이 좀 바뀌었죠. "DMA 덕분에 CPU가 데이터를 옮기는 일을 안 해도 되니까, CPU가 좀 놀고 있네?"라는 생각이 들었을 거예요.
그러니 이런 제안이 나온 거예요!
"메모리에 여러 작업을 동시에 올리면 CPU가 더 바쁘게 일하지 않을까?"
이게 바로 멀티프로그래밍의 시작이에요. CPU가 한 작업이 끝나기를 기다리지 않고, 다른 작업을 처리할 수 있게 되어 효율성이 올라갔습니다.
멀티태스킹(Multitasking)
멀티프로그래밍에서 한 발 더 나아가, "CPU가 여러 작업을 동시에 처리하면 어떨까?"라는 아이디어가 나왔어요.
사실 CPU는 한 번에 하나의 작업만 처리하지만, 작업 간 스위칭이 워낙 빨라서 사용자에게는 "동시에 된다"라고 느껴지죠. 이게 멀티태스킹입니다.
여기서 CPU 스케줄링이 중요해졌어요. 어떤 작업을 먼저 처리할지 효율적으로 선택해야 하니까요.
OS의 두 가지 모드
OS는 두 가지 모드로 동작합니다:
- 유저 모드(User Mode): 일반 앱이 실행되는 모드. 하드웨어를 직접 제어할 수 없어요 (Mode Bit = 1).
- 커널 모드(Kernel Mode): OS가 하드웨어를 제어하는 모드 (Mode Bit = 0).
왜 이렇게 나눴을까요?
만약 유저가 곧바로 하드웨어를 조작할 수 있다면 어떻게 될까요?
예를 들어, 우리가 사용하는 앱을 통해 해커가 시스템에 접근해서 메모리를 망가뜨리거나 중요한 파일을 삭제할 수도 있겠죠.
이런 위험을 막기 위해 OS는 두 가지 모드를 나눠서 운영하는 거예요.
시스템 콜(System Call)이란?
그럼 유저 모드에서 실행되는 앱이 하드웨어를 사용해야 할 때는 어떻게 할까요?
예를 들어, 파일을 저장하거나 네트워크로 데이터를 보내고 싶을 때요.
여기서 시스템 콜이 등장합니다. 시스템 콜은 앱이 OS에게 "이 일을 대신해주세요!"라고 요청하는 방법이에요.
- 앱이 유저 모드에서 "파일을 저장해 줘"라고 요청하면, OS는 커널 모드로 전환해서 디스크에 명령을 내리고, 작업이 끝나면 다시 유저 모드로 돌아와 결과를 알려줍니다.

라이브러리(Library)의 역할
그런데 앱 개발자가 매번 시스템 콜을 직접 쓰는 건 너무 번거롭겠죠? 일단 시스템 콜은 Window, Linux 등 환경마다 다르다고 합니다... 그래서 라이브러리라는 중간 다리가 등장합니다.
- 라이브러리는 자주 쓰이는 시스템 콜을 미리 모아놓은 도구 상자 같은 거예요. 개발자는 복잡한 하드웨어 명령을 몰라도 라이브러리 함수를 호출해서 쉽게 작업을 처리할 수 있죠.
- 예를 들어, iOS에서 FileManager라는 라이브러리를 쓰면 파일을 읽거나 쓰는 시스템 콜을 직접 다루지 않아도 OS가 알아서 처리해 줍니다.

가상화(Virtualization)
멀티태스킹을 하다 보니 또 다른 아이디어가 나왔어요: "하나의 하드웨어로 여러 OS를 돌리면 어떨까?"
이게 가상화입니다. Virtual Machine을 만들어 하나의 컴퓨터에서 macOS와 Windows를 동시에 사용할 수 있게 된 거죠.
A는 하나의 OS가 동작하는 그림이며, B는 Virtual machines를 이용해 여러 OS를 VM 위에서 돌아가게 만든 모습입니다.
이러한 방식으로 우리는 컴퓨터 한 대로 macOS, Window 두 개를 사용할 수 있습니다.
발전의 흐름 정리
처음엔 프로세스를 하나씩 돌리는 데 문제가 없었어요. 하지만 멀티프로그래밍과 멀티태스킹이 등장하면서 새로운 도전이 생겼습니다.
- CPU 스케줄링: 여러 프로세스를 어떻게 효율적으로 배분할까?
- 동기화 문제: 프로세스들이 동시에 실행되면 충돌이 생길 수 있어요. 이걸 해결하지 않으면 데드락에 빠질 수도 있죠.
- 메모리 관리: 메모리를 어떻게 효율적으로 나눌까?
- 가상화 활용: 가상화를 더 잘 관리하려면 어떻게 해야 할까?
이런 질문들에 대한 대답을 하기 위해 OS에 대한 지식을 쌓는 것입니다!!
오늘도 화이팅입니다!