기술을 아는 것과, 누구나 이해할 수 있도록 전달하는 건 다르다는 걸 깨달았습니다.
이 시리즈는 ‘기술을 쉽게 전달하는 방법’을 고민하며 쓰는 저의 학습 기록입니다.컴퓨터공학이라는 거대한 분야를 처음 접했을 때, 저는 각 개념이 왜 등장했고 어떻게 연결되는지가 가장 궁금했습니다. 그래서 이 시리즈는 단순한 정의나 기능 설명보다 맥락 중심의 흐름과 구조적 이해에 집중했습니다.
비전공자도 부담 없이 읽을 수 있도록 가능한 쉬운 언어와 비유를 사용했지만, 그만큼 설명 방식에 부족한 점이 있을 수 있습니다. 혹시 더 좋은 설명이나 보완 아이디어가 있다면, 댓글로 자유롭게 피드백 남겨주세요! 😊
– 하드웨어만으론 안 되는 이유, 그리고 운영체제(전략기획실)의 등장
앞 장에서 살펴본 것처럼, 컴퓨터는 CPU, 메모리, 저장장치, 입출력 장치 등 여러 부품이 유기적으로 연결되어 작동합니다. 하지만 이 구성 요소들이 그냥 있다고 해서 협업이 자동으로 이루어지진 않아요.
각자 따로따로 움직인다면 자원 충돌이 생기고, 시스템은 엉망이 되죠.
예를 들어, 여러 프로그램이 동시에 프린터를 쓰려고 하거나,
하나의 프로그램이 메모리를 독점하려 들면 어떻게 될까요?
마치 회의실을 두 팀이 동시에 쓰겠다며 충돌하는 것처럼, 컴퓨터 내부에서도 비슷한 일이 일어납니다.
이런 상황을 막고, 자원을 배분하며, 사람과 컴퓨터가 소통할 수 있도록 돕는 총괄 조율자가 필요해요. 바로 이 역할을 맡는 것이 운영체제(Operating System)입니다.
앞서 1장에서 CPU를 회사 CEO에 비유했죠?
그렇다면 운영체제는 컴퓨터 속에서 자원을 효율적으로 관리하고, 사용자와 컴퓨터 사이를 매끄럽게 이어주는 CEO 직속의 전략기획실 같은 존재예요.
CPU(=CEO)가 계산에만 집중할 수 있도록 흐름을 정리하고, 자원 충돌을 미리 조율하며, 사용자와 내부 시스템 사이의 명령과 반응이 자연스럽게 오가도록 만들어줍니다.
운영체제는 크게 두 가지 역할을 합니다.
첫째, 자원을 효율적으로 관리하는 것.
CPU, 메모리, 저장장치 등 컴퓨터 내부 자원은 한정돼 있고, 여러 프로그램이 동시에 이 자원들을 사용하려고 하죠. 운영체제는 이 자원들을 똑똑하게 나누고 충돌을 방지해, 컴퓨터가 여러 작업을 안정적으로 수행할 수 있게 도와줍니다.
둘째, 사용자와 컴퓨터가 매끄럽게 소통할 수 있도록 돕는 것.
우리는 아이콘을 클릭하거나 명령어를 입력하죠.
운영체제는 이런 사람의 행동을 컴퓨터가 이해할 수 있도록 바꿔주는 ‘통역사’ 역할을 합니다.
바탕화면, 창, 아이콘, 마우스 클릭처럼 우리가 보는 모든 화면 요소들은 운영체제가 제공하는 ‘사용자 인터페이스(UI)’
를 통해 동작하죠.
이 과정에서 운영체제는 장치를 연결하는 드라이버, 파일을 읽고 쓰는 파일 시스템, 키보드나 프린터 같은 장치를 다루는 입출력 제어 시스템 등을 내부적으로 활용합니다.
우리가 워드를 켠다고 했을 때,
그건 단순히 파일을 여는 게 아니라
프로그램이 실행 가능한 상태로 변환되어 메모리에 올라가는 것
입니다.
이걸 프로세스(Process)
라고 합니다. 즉, 프로세스는 실행 중인 프로그램을 의미하죠.
프로세스는 서로 독립된 메모리 공간을 가지고 있고,
운영체제로부터 실행에 필요한 CPU 시간과 자원을 배정받습니다.
그런데 하나의 프로세스 안에서도 여러 작업이 동시에 이뤄질 수 있어요.
예를 들어, 워드에서는 글자를 치는 동시에 오타를 검사하거나 자동 저장이 되잖아요?
이처럼 프로세스 내부에서 병렬로 실행되는 작은 작업 단위를 스레드(Thread)라고 합니다.
정리하면,
프로세스는 독립된 일하는 팀이고, 스레드는 그 팀 안에서 동시에 움직이는 팀원들이라고 볼 수 있습니다.
컴퓨터는 여러 작업을 동시에 수행하는 것처럼 보이지만, CPU가 한 순간에 처리할 수 있는 작업 수는 제한적입니다.
특히 단일 코어에서는 한 번에 하나의 작업만 처리할 수 있죠.
그래서 운영체제는 어떤 작업을 언제 처리할지 우선순위를 정해 조율해야 합니다.
이걸 CPU 스케줄링이라고 해요.
대표적인 스케줄링 방식에는 다음과 같은 것들이 있습니다.
작업을 전환할 때 운영체제는 문맥 교환(Context Switching)이라는 과정을 거쳐요.
지금까지 하던 작업의 상태를 저장하고, 다음 작업의 상태를 불러와 이어서 실행하는 거예요.
마치 여러 작업 창을 오가며 일할 때, 각 창의 작업 내용을 저장해두고
다른 창으로 이동해 거기서 하던 일을 이어서 하는 것처럼요.
다만 문맥 교환이 너무 자주 일어나면 오히려 시간과 자원 낭비가 생기기 때문에, 운영체제는 최대한 효율적으로 스케줄링하려고 합니다.
운영체제가 여러 작업을 처리할 때는
동시성(Concurrency)과 병렬성(Parallelism)이라는 개념이 중요해집니다.
이와 관련된 실행 구조로는 멀티프로세싱과 멀티스레딩이 있습니다.
운영체제는 이런 다양한 실행 흐름을 안정적이고 효율적으로 관리하는 역할을 합니다.
✅ 동시성 = 하나의 CPU가 빠르게 번갈아 작업
✅ 병렬성 = 여러 CPU가 실제로 동시에 각자 작업
여러 작업이 동시에 진행되면,
같은 자원을 동시에 사용하려고 하면서 충돌이 발생할 수 있습니다.
예를 들어 두 스레드가 동시에 같은 프린터를 쓰거나 같은 파일을 동시에 수정하려 한다면, 데이터 오류나 시스템 불안정이 생길 수 있는 거죠.
이런 문제를 막기 위해 운영체제는 동기화(Synchronization)를 사용합니다.
그중 대표적인 도구가 바로 세마포어(Semaphore)입니다.
세마포어는 자원에 접근할 수 있는 권한(열쇠)을 관리하는 방식입니다.
누군가 회의실을 사용하고 있다면, 다른 사람은 회의실이 빌 때까지 기다리는 것처럼 하나의 자원에 한 번에 하나의 작업만 접근하도록 제어합니다.
덕분에 컴퓨터는 자원 충돌 없이 안정적으로 여러 작업을 처리할 수 있게 되는 거죠.
RAM은 빠르지만 용량이 한정되어 있어서 많은 프로그램을 동시에 실행하기엔 부족할 수 있습니다.
그래서 등장한 개념이 가상 메모리(Virtual Memory)입니다.
운영체제는 SSD(또는 HDD)의 일부 공간을 RAM처럼 사용해서 없는 공간을 있는 것처럼 보여주고, 더 많은 작업을 가능하게 해줍니다.
이를 구현하기 위해 페이징(Paging)과 세그멘테이션(Segmentation) 같은 기법이 사용됩니다.
운영체제는 상황에 따라 두 가지 방식을 단독 또는 혼합해서 사용하기도 합니다.
또 RAM이 꽉 차면, 당장 필요하지 않은 데이터를 SSD나 HDD로 내보내는 작업이 필요한데, 이때 어떤 데이터를 내보낼지를 정하는 것이 페이지 교체 알고리즘입니다.
운영체제는 이런 방식으로 RAM 공간을 효율적으로 확보하면서 전체 성능을 유지합니다.
운영체제는 프로그램으로부터 요청을 받았을 때,
결과가 나올 때까지 기다릴지, 다른 일을 먼저 할지를 선택할 수 있습니다.
이를 동기(Synchronous)와 비동기(Asynchronous)라고 합니다.
예를 들어 배달 음식을 주문했다고 할 때
요즘 앱이나 웹사이트는 대부분 비동기 방식을 적극적으로 활용해 끊김 없는 사용자 경험을 제공하고 있답니다.
사람은 클릭하고, 타이핑하고, 드래그하면서 컴퓨터에게 무언가를 요청합니다.
"이거 실행해줘", "이 파일 저장해줘", "이미지 보여줘" 같은 거죠.
그런데 컴퓨터는 이걸 곧바로 알아들을 수 없습니다.
컴퓨터는 오직 0과 1로 된 신호만 이해하거든요.
이처럼 사람과 컴퓨터는 언어가 전혀 달라요.
그래서 이 둘이 소통하려면, 중간에서 해석하고 연결해주는 존재가 꼭 필요합니다.
그게 바로 운영체제(Operating System)예요.
운영체제는 사람이 내리는 명령을 컴퓨터가 이해할 수 있는 방식으로 바꿔주고,
컴퓨터가 처리한 결과를 다시 사람이 이해할 수 있는 형태로 보여줘요.
예를 들어, 마우스로 '워드 파일' 아이콘을 클릭하면 운영체제는 이렇게 일합니다.
① “이 사용자가 클릭한 건 어떤 좌표고, 무슨 의미일까?”
② “그 좌표에 있는 아이콘은 워드 파일이네?”
③ “그럼 하드디스크에서 그 파일을 찾아서…”
④ “메모리에 올리고, CPU가 실행하도록 연결해줘야겠다.”
사람은 클릭 한 번으로, 컴퓨터는 복잡한 과정을 통해,
그리고 운영체제가 가운데서 조율하면서 이 모든 흐름이 매끄럽게 이어지는 거예요.
운영체제는 사람이 더 쉽게 컴퓨터를 쓸 수 있도록 GUI와 CLI 같은 사용자 인터페이스 환경을 구성하거나 지원합니다.
운영체제는 이 인터페이스를 통해 ‘사람이 무엇을 원하는지’를 파악하고,
그걸 컴퓨터가 수행할 수 있도록 정확한 작업으로 바꿔주는 다리 역할을 하는 거예요.
우리가 클릭하거나 입력한 명령은 결국 하드웨어(하드디스크, 프린터 등)까지 가야 해요.
하지만 하드웨어는 제조사마다 동작 방식이 다르고, 언어도 제각각입니다.
운영체제가 이 모든 장치의 동작 방식을 미리 알 수는 없기 때문에,
운영체제와 장치 간의 연결을 도와주는 ‘번역기’가 필요합니다.
그게 바로 드라이버(driver)예요.
운영체제는 이 드라이버들을 통해 수많은 장치들과 원할히 소통할 수 있습니다.
프린터, USB, 마우스 같은 장치들은 운영체제에게 “지금 나 좀 봐줘요!” 하고 알려야 할 때가 있습니다.
이럴 때 사용하는 게 바로 인터럽트(Interrupt)라는 신호입니다.
운영체제는 이 신호를 받고 지금 하던 작업을 잠시 멈추거나 순서를 조정해 장치들과 끊김 없이 상호작용할 수 있게 조율합니다.
✅ 정리
- 사용자는 클릭이나 입력으로 “요청”을 전달
- 운영체제는 그걸 GUI/CLI → 드라이버 → 하드웨어로 해석해 전달
- 장치가 작업을 요청하면 인터럽트를 통해 흐름을 조정
컴퓨터 시스템을 하나의 회사로 비유하고 CPU가 그 회사의 CEO라면,
운영체제는 부서 간 충돌을 막고, 회의실(자원)을 효율적으로 나눠주며,
외부 요청과 내부 시스템 간의 흐름을 매끄럽게 이어주는
조직 전체의 컨트롤 타워이자 조율자예요.
운영체제가 잘 작동해야
👉 결국, 운영체제가 있어야 컴퓨터는 '사람이 원하는 방식'으로 부드럽고 질서 있게 작동하는 시스템이 됩니다.
다음은 이 시스템 안에서 사람이 컴퓨터에게 직접 ‘명령’을 내릴 수 있게 도와주는 또 다른 발명,
바로 프로그래밍 언어의 발전에 대해 이야기해보겠습니다.
컴퓨터와 사람은 점점 더 자연스럽게 대화할 수 있게 됩니다.