운영체제의 발전: 단일 프로세스에서 멀티코어까지

운영체제의 발전은 ‘CPU를 얼마나 효율적으로 활용하느냐’의 역사라고 볼 수 있습니다. 초기에는 한 번에 하나의 프로그램만 실행했지만, 점차 CPU 사용률과 사용자 경험을 높이기 위해 멀티프로그래밍, 멀티태스킹, 멀티프로세스, 멀티스레딩, 그리고 멀티코어 구조가 발전했습니다.
들어가기에 앞서 프로세스와 스레드에 대해 간단히 설명하겠습니다.
프로세스(Process)
실행 중인 프로그램으로 OS로부터 독립된 주소 공간과 자원을 할당 받음
각 프로세스는 메모리 공간을 완전히 분리해 사용 → 안정성 높음
스레드(Thread)
프로세스 내에서 실행되는 작업 흐름 단위
같은 프로세스 내 스레드끼리 메모리(코드,데이터,힙) 공유 → 데이터 전달 빠름
단일 프로세스
한 시점에 하나의 프로세스만 실행합니다.(하나의 프로그램 실행)
다른 작업은 이전 작업이 끝날 때까지 대기해야합니다.
프로세스에서 I/O 작업을 해야한다면, 그동안은 CPU는 아무것도 하지 않는 상태가 되고, I/O 작업이 완료된 후 다시 프로세스를 실행시키게 됩니다.
I/O 대기 동안 CPU가 아무것도 하지 않는 상태가 되어 CPU 활용률이 낮아지게 됩니다.
이를 개선하기 위해 멀티 프로그래밍을 사용할 수 있습니다.
멀티 프로그래밍
CPU가 놀지 않도록 여러개의 프로세스(프로그램)을 메모리에 올려두고, 하나의 프로세스가 I/O 대기 상태가 되면 다른 프로세스를 실행하는 방식입니다. (Context Switching)
CPU 사용률 최대화에 목적이 있고, 동시에 실행되는 것처럼 보이지만, 실제로는 한 번에 하나의 프로세스만 실행합니다.
하지만 한 프로세스가 CPU 연산을 길게 하면 다른 프로세스가 오래 대기할 수 있는 CPU 독점 가능성이 존재하는 단점이 있습니다.
멀티 태스킹
하나의 CPU(또는 여러 CPU)에서 아주 짧은 시간 단위 (Time Slice)로 작업을 번갈아 실행해, 마치 여러 작업이 동시에 실행되는 것처럼 보이게 만드는 운영 방식입니다.
사용자 응답성 최소화에 목적을 두어 사용자는 여러 프로그램이 동시에 실행되는 것처럼 느낄 수 있습니다.
하지만 Context Switching이 일어나 오버헤드가 발생한다는 단점이 있습니다.
멀티 프로세스
하나의 프로그램을 여러개의 독립적인 프로세스로 실행하는 방식으로, 웹 브라우저의 탭을 각가 별도의 프로세스로 실행하는 것이 그 예입니다. (Chrome이 대표적)
각 프로세스는 독립적인 메모리 공간을 가지므로, 한 프로세스가 비정상 종료 되어도 다른 프로세스에 직접적인 영향을 주지 않습니다.
프로세스간 통신이 필요하기 때문에 속도와 복잡도가 증가하고, Context Switching 비용이 큽니다. 또한 프로세스마다 메모리 할당을 하기 때문에 메모리 사용량이 크다는 단점이 있습니다.
멀티 스레딩
하나의 프로세스 안에서 여러 스레드를 생성해 실행하는 방식입니다.
스레드는 프로세스의 메모리를 공유하고, 공유 메모리를 사용하므로 통신 속도가 빠릅니다. 공유 자원을 사용하기 때문에 메모리 효율이 좋고, Context Switching 비용이 프로세스보다 적다는 장점이 있습니다.
하지만 동기화(Synchronization) 문제가 발생할 수 있고, 잘못하면 Race Condition 이 발생할 수 있어 동기화 제어가 필요합니다.
예) 채팅 앱에서 메시지 송신 스레드와 수신 스레드를 동시에 동작시키는 경우
멀티 코어
CPU 칩 안에 여러개의 코어를 넣어 동시에 명령을 처리하는 하드웨어 구조로, 하드웨어 수준에서 병렬처리가 가능하며, 멀티프로세스/ 멀티스레딩 모두 멀티코어 환경에서 효율적으로 동작합니다.
Subscribe to my newsletter
Read articles from 갱갱 directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
