핵심 아이디어: CPU(연산 담당)와 Memory(저장 담당)를 따로 분리하고, 실행해야 할 명령어와 데이터를 모두 메모리에 저장해 두는 구조.
즉, 필요한 순간에 CPU가 메모리에서 명령어를 읽어와 실행한다. 이 구조 덕분에, 하드웨어를 갈아끼우지 않아도 프로그램(소프트웨어)만 바꾸면 새로운 기능을 수행할 수 있게 됨.
💡: 예전에는 계산기처럼 ‘버튼 누르면 정해진 연산만 하는 기계’였지만, 폰 노이만 구조는 ‘필요한 계산 방법(프로그램)을 책(메모리)에 써놓고, 그때그때 읽어서 계산하는 사람(CPU)’ 같은 것.
작동 과정
장점
소프트웨어만 바꿔도 새로운 작업 가능 → 하드웨어를 다시 만들 필요 없음. 세계 최초의 프로그램 내장 방식 컴퓨터인 EDSAC이 이 구조를 사용.
문제점
CPU는 매우 빠르게 계산 가능하지만, 메모리에서 명령어/데이터를 가져오는 속도가 상대적으로 느림. 즉, CPU가 “다음 명령어 줘!” 하고 기다려야 하는 상황이 자주 발생 → 전체 속도 저하.
이를 폰 노이만 병목(von Neumann bottleneck)이라고 함.
💡: CPU = 빨리 일하는 요리사, 메모리 = 재료 창고. 요리사가 아무리 빨라도 재료를 창고에서 늦게 가져오면 전체 요리 속도가 느려짐.
해결책
캐시 메모리(Cache): CPU 안에 자주 쓰는 데이터/명령어를 미리 저장해 두는 초고속 메모리.
멀티코어(Multi-core): CPU 안에 코어 여러 개를 넣어 여러 명령을 동시에 처리.
병렬처리(Massively Parallel Processing): 여러 CPU 또는 코어가 동시에 작업을 나눠서 수행.
우리가 쓰는 컴퓨터는 여러 하드웨어 부품이 연결되어 하나의 시스템을 이룸. 이 부품들은 버스(Bus)라는 통로를 통해 서로 데이터를 주고받음.
구성 요소별 역할
CPU (Central Processing Unit): 컴퓨터의 ‘두뇌’. 명령어 해석과 연산을 수행.
Main Memory (주기억장치): 프로그램과 데이터를 저장.
Bus (버스): 하드웨어 장치 간 데이터를 이동시키는 통로.
주변 장치 컨트롤러 (Controller): 외부 장치를 CPU·메모리와 연결해주는 ‘중간 관리자’.
작동 흐름 예시
디스크(HDD/SSD)에서 프로그램 파일을 읽음 → Disk Controller가 데이터 전달
Main Memory에 프로그램 로드
CPU가 버스를 통해 명령어를 하나씩 읽어 실행
GPU로 그래픽 데이터 전송 → 화면 출력
컴퓨터에는 여러 단계의 저장장치가 있고
CPU와 가까울수록 → 속도는 빠르지만 용량이 작고 비쌈
CPU에서 멀수록 → 속도는 느리지만 용량이 크고 저렴함
이런 구조는 속도와 용량의 균형을 맞추기 위해 설계됨.
계층별 특징
계층 | 위치 | 속도 | 용량 | 휘발성 여부 | 예시 |
---|---|---|---|---|---|
레지스터(Register) | CPU 내부 | 매우 빠름 | 매우 작음 (수십~수백 B) | 휘발성 | 연산 중간 값 저장 |
캐시(Cache) | CPU 칩 위 | 빠름 | 작음 (MB 단위) | 휘발성 | 자주 쓰는 변수·명령어 |
RAM(Main Memory) | CPU 외부, 메인보드 | 중간 | 큼 (GB 단위) | 휘발성 | 실행 중인 프로그램 |
보조기억장치(Secondary Storage) | 메인보드/외부 | 느림 | 매우 큼 (GB~TB) | 비휘발성 | HDD, SSD |
외부 저장장치(Removable) | 외부 연결 | 느림~중간 | 다양 | 비휘발성 | USB, 외장 HDD |
속도–용량 관계
용량이 커질수록 → 속도는 느려지고 가격은 저렴해짐.
용량이 작을수록 → 속도는 빨라지고 가격은 비싸짐.
하나의 CPU 칩 안에 여러 개의 독립적인 처리 장치(코어, Core)를 넣은 구조. 각 코어는 하나의 CPU처럼 명령어를 해석하고 실행할 수 있음.
코어가 많아지면 동시에 더 많은 작업(스레드)을 처리 가능.
병렬 처리(Parallel Processing) 가능 → 전체 처리량 증가.
코어 1개 = 보통 1개의 스레드를 동시에 실행 가능.
(하이퍼스레딩 사용 시, 1코어에서 2스레드 실행 가능)
코어 수가 많다고 무조건 빠른 건 아님
→ 클럭 속도(Clock Speed)와의 균형 중요.
코어 수 ↑: 병렬 작업에 유리.
클럭 속도 ↑: 단일 작업 속도 향상.
장점
여러 작업을 동시에 처리 → 멀티태스킹 효율 향상.
CPU 사용률 분산 → 발열 관리와 전력 효율 개선 가능.
고성능 작업(영상 편집, 3D 렌더링, 과학 연산 등)에 유리.
단점/주의점
모든 프로그램이 멀티코어 성능을 100% 활용하지 못함.
(단일 스레드 기반 프로그램은 코어 수 증가 효과가 적음)
코어 수와 클럭 속도, 발열, 전력 소모 간의 트레이드오프 존재.
프로세스(Process): 실행 중인 프로그램.
프로그램이 저장 장치(HDD/SSD)에 있을 때는 단순한 ‘코드 덩어리’일 뿐. 메모리에 올라와서 CPU 자원을 할당받아 실행될 때 → 프로세스가 됨.
운영체제(OS)는 이 프로세스들이 CPU, 메모리, I/O 장치 같은 한정된 자원을 효율적으로 사용하도록 관리.
프로세스의 상태
프로세스는 실행되는 동안 여러 상태를 오감.
New: 생성 중 (메모리에 로드 중)
Ready: 실행할 준비 완료, CPU 할당 대기
Running: CPU에서 명령어 실행 중
Waiting: I/O 요청 등으로 CPU 외 장치 작업 대기
Terminated: 실행 종료
OS의 프로세스 관리 역할
생성(Create): 새 프로세스를 메모리에 올려 실행 준비.
스케줄링(Scheduling): 어떤 프로세스에 CPU를 먼저 줄지 결정.
동기화(Synchronization): 여러 프로세스가 자원을 동시에 쓰는 상황에서 순서 조정.
종료(Termination): 작업이 끝난 프로세스를 메모리에서 제거.
프로세스 관리가 중요한 이유
자원 한정성: CPU, 메모리, 디스크 I/O 등은 수가 한정돼 있음 → 효율적 배분 필요.
공정성: 특정 프로세스가 자원을 독점하면 다른 작업이 멈출 수 있음.
응답 속도: 사용자 경험(UX)에 직결.
스레드(Thread): CPU가 실제로 작업을 수행하는 최소 실행 단위.
하나의 프로세스 안에 여러 스레드가 있을 수 있으며,
같은 프로세스 안의 스레드들은 코드·데이터·메모리 영역을 공유.
멀티스레딩(Multi-threading)
하나의 프로세스를 여러 실행 흐름(스레드)으로 나누어 동시에 작업.
장점: 자원 공유: 메모리, 파일 핸들 등을 공유 → 효율적. 응답성 향상: 한 스레드가 대기 상태여도 다른 스레드가 계속 실행 가능.
단점: 동기화 문제: 여러 스레드가 같은 데이터에 동시에 접근 시 충돌 가능. 디버깅 어려움: 실행 순서가 매번 달라질 수 있음.
워드프로세서 실행 중:
스레드 1: 화면에 글자 표시
스레드 2: 키보드 입력 처리
스레드 3: 맞춤법 검사
→ 세 스레드가 동시에 실행되며 사용자 경험 부드러움.
Scheduler(스케줄러): CPU를 언제, 어떤 프로세스에 할당할지 결정하는 OS 모듈. CPU 효율 극대화, 응답 시간 최소화, 공정성 유지.
장기 스케줄링(Long-term): 어떤 프로세스를 메모리에 올릴지 결정 (메모리 적재 속도 조절)
중기 스케줄링(Mid-term): 메모리 부담 완화를 위해 일부 프로세스를 일시적으로 중단(Suspend)
단기 스케줄링(Short-term / CPU 스케줄링): CPU를 어떤 프로세스에 바로 줄지 결정 (ms 단위)
FCFS(First Come First Served): 먼저 온 순서대로 실행.
SJF(Shortest Job First): 실행 시간이 짧은 프로세스 먼저.
Round Robin: 시간 할당량만큼 번갈아 실행.
노트북에서 브라우저, 음악 플레이어, 문서 작성 세 작업을 동시에 실행할 때: 스케줄러가 10ms 단위로 CPU를 번갈아 할당 → 사용자에게는 동시에 동작하는 것처럼 보임.
여러 프로세스 또는 스레드가 공유 자원(파일, 변수, 메모리 영역 등)에 동시에 접근하면 문제 발생 가능. 이러한 공유 자원 접근 구역을 임계 구역(Critical Section)이라고 함.
동기화(Synchronization): 임계 구역 접근을 제어하여 데이터의 일관성 유지.
문제점
경쟁 조건(Race Condition): 여러 스레드가 동시에 데이터를 수정하려 할 때 결과가 예측 불가. 예: 은행 계좌 입출금 동시 처리 → 잔액 오류 가능.
해결 방법
뮤텍스(Mutex): 한 번에 하나의 스레드만 접근 가능하도록 잠금(Lock) 제공.
세마포어(Semaphore): 허용 가능한 동시 접근 개수를 제한.
모니터(Monitor): 동기화와 조건 변수를 함께 제공하는 고급 기법.