프로그램
- 컴퓨터에서 실행할 수 있는 파일
- Window에서 .exe로 끝나는 파일들을 '프로그램'이라고 함
프로세스
- 프로그램이 실행되어 돌아가고 있는 상태
- 즉, 컴퓨터가 어떤 일을 하고 있는 상태
- 쾌적하게 컴퓨터를 사용할 수 있는 것은 운영체제가 여러 개의 프로세스를 함께 돌리고 있기 때문임
여러 프로세스 함께 돌리는 방법
- 동시적 : 프로세스 하나가 여러 작업을 돌아가면서 일부분씩 수행
- 진행중인 작업을 바꾸는 것을 Context Switching이라고 함
- 빠르게 돌아가기 때문에 프로세스들이 동시에 진행된다고 느낌
- 병렬적 : 프로세스 하나에 코어가 여러개 달려서 동시에 돌아가면서 수행
- 멀티코어 프로세서가 달린 컴퓨터에서 수행 가능 (듀얼코어, 쿼드코어, 옥타코어 등)
- CPU 속도가 발열 등 물리적 제약 때문에 예전만큼 빠르게 발전하지 못하자, 대안으로 코어를 여러개 달아서 작업을 분담할 수 있게 함
- 혼합적
스레드
- 브라우저도 하나의 프로그램이고, 이게 돌면서 하나의 프로세스가 진행됨
- 브라우저 내에서 게임 다운로드, 동영상 재생 등 여러 갈래의 작업들이 동시에 진행될 필요가 있음
- 이 갈래를 '스레드' 라고 함
- 프로세서 : 요리사
- 프로세스 : 대량 주문이 들어오는 식당에서 끊임 없이 만들어내는 각각의 요리 메뉴
- 컴퓨터는 프로세스마다 자원을 분할해서 할당함
- EX. 떡볶이 만드는 섹션, 김밥 만드는 섹션, 오믈렛 만드는 섹션 등
- 이렇게 조리 공간을 나눠서 요리사 한명이 돌아가면서 요리를 하거나 (동시적),
요리사 여러명이 각 섹션에서 동시에 요리를 하거나 (병렬적),
두 방식을 섞어서 하는 방식 (혼합적)으로 메뉴들을 만들어 냄
- 김밥을 만드는 섹션(프로세스)에서는
김밥 안에 들어갈 밥을 만드는 스레드가 진행되는 동안 김밥 재료를 손질하는 스레드도 진행될 수 있음
- 한 메뉴의 스레드들은 같은 조리대에서 진행됨
- 같은 메뉴를 만들때는 같은 공간과 장비 즉, 같은 자원을 공유하는 것이 효율적임
- 프로세스들은 컴퓨터의 자원을 분할해서 쓰지만, 스레드는 프로세스마다 주어진 전체 자원을 함께 사용함

- 이게 속도와 효율 면에서는 좋지만, 단점이 있음
- 만약 프로세스 안에서 공유되는 변수에 스레드 두 개가 동시에 접근한다면 에러가 발생함
(동기화 문제)
- 예를 들면 클릭 시 1씩 증가하는 버튼이 있고, 스레드 두 개가 버튼을 클릭하게 된다면 정확하게 카운팅 되지 않음
- 동시에 클릭하는 상황이 발생 할 수 있기 때문임
- 시간 문제로 발생하는 에러들을 예상하고 방지해야 하는 문제 때문에 스레드를 사용하는 프로그래밍은 코드를 짜기도 어렵고, 디버깅 하기도 어려움
- 이런 작업들을 더 쉽고 안전하게 할 수 있는 도구들이나 프로그래밍 방식들이 많이 있음 (Closure, Lambda, Functional Programming, Actor 등)
정리
- 프로세스는 운영체제에서 실행중인 프로그램의 독립적인 인스턴스
- 각 프로세스는 자체 메모리 공간을 가지고 있으며, 다른 프로세스와 메모리를 공유하지 않음
- 이는 보안성과 안정성 측면에서 유리하지만, 프로세스 간의 통신에는 IPC(Inter-Process Communication)과 같은 별도의 메커니즘이 필요함
- 스레드는 프로세스 내에서 실행되는 작은 실행 단위
- 스레드는 프로세스의 메모리 공간을 공유하기 때문에, 같은 프로세스 내의 다른 스레드들과 쉽게 데이터를 주고 받을 수 있음
- 이는 멀티스레딩을 통해 병렬 처리를 효율적으로 수행할 수 있게 해줌
- 하지만, 스레드 간의 자원 공유는 동기화 문제를 발생시킬 수 이어 주의가 필요함
용어 설명
인스턴스
- 특정 클래스나 프로그램의 실체화된 객체
- 소프트웨어에서 인스턴스는 실행 중인 프로그램의 구체적인 표현으로, 일반적으로 메모리에 로드된 상태를 의미
- 예를 들면, 동일한 프로그램을 여러 번 실행하면 각각의 실행은 독립적인 인스턴스가 됨
IPC (Inter-Process Communication)
- 프로세스 간 통신을 의미
- 서로 독립적으로 실행되는 프로세스들이 데이터를 주고받기 위해 사용하는 메커니즘
- 프로세스는 독립적인 메모리 공간을 사용하기 때문에 직접적인 데이터 공유 불가능
- 따라서 IPC를 통해 메시지, 큐, 파이프, 공유 메모리 등의 기법을 사용하여 데이터를 교환함
메커니즘
- 특정 기능이나 작업을 수행하기 위한 체계적이고 구조화된 방법이나 절차
- 소프트웨어에서는 특정 기능을 구현하기 위한 알고리즘이나 프로세스가 메커니즘으로 작동함
- 예를 들면, IPC 메커니즘은 프로세스 간의 데이터 통신을 가능하게 하는 일련의 방법들을 포함함
멀티스레딩
- 하나의 프로세스 내에서 여러 스레드를 생성하여 병렬로 작업을 수행하는 기술
- 멀티스레딩을 통해 동일한 메모리 공간을 공유하는 스레드들이 동시에 실행되어 작업의 효율성을 높임
- 이는 CPU 자원을 최대한 활용하여 응답성을 개선하고 처리 속도를 높이는 데 기여함
파이프 (Pipe)
- 단방향 통신을 제공하는 IPC 기법
- 주로 부모 프로세스에서 자식 프로세스로 데이터를 전달하는 데 사용됨
- 파이프는 두 프로세스 간의 데이터 흐름을 위해 커널 공간에 메모리를 할당하고,
이 메모리를 통해 데이터를 전송함
- 파이프는 간단하게 구현 가능하지만, 단방향 통신만 가능하다는 제한이 있음
- 양방향 통신을 위해서는 두 개의 파이프를 사용해야 함
커널 (Kernel)
- 운영체제의 핵심 부분
- 하드웨어와 소프트웨어 간의 중재자 역할을 함
- 커널은 시스템 리소스를 관리하고, 프로세스 간의 통신 및 데이터 교환을 조정함
- 커널의 주요 기능
- 프로세스 관리 : 프로세스의 생성, 스케줄링, 종료 등 관리
- 메모리 관리 : 메모리 할당 및 해제를 관리하고, 프로세스 간의 메모리 보호를 제공함
- 장치 관리 : 하드웨어 장치와의 상호작용을 처리함
- 파일 시스템 관리 : 파일 및 디렉터리 관리
- 커널은 사용자 모드와 커널 모드로 나뉨
- 커널 모드에서는 시스템 리소스에 대한 직접적인 접근 가능
커널 공간 (Kernel Space)
- 운영체제의 커널이 실행되는 메모리 영역
- 사용자 모드의 프로세스가 접근할 수 없는 보호된 영역
- 시스템의 안정성과 보안 유지에 중요한 역할을 함
- 커널 공간에서 이루어지는 작업
- 시스템 콜 처리 : 사용자 모드의 프로세스가 커널 기능을 요청할 때 사용되는 인터페이스 제공
- 하드웨어 제어 : 장치 드라이버가 커널 공간에서 실행되어 하드웨어 제어
- 메모리 관리 : 시스템 메모리의 할당 및 해제 처리
- 커널 공간은 운영체제 핵심 기능 수행하는 데 필수적이고, 사용자 모드의 프로세스는 시스템 콜을 통해 간접적으로 이 공간에 접근 가능
큐 (Queue)
- 자료 구조의 한 형태
- 선입선출 원칙을 따름 (FIFO, First in First Out)
- 먼저 들어온 데이터가 먼저 나가는 구조를 의미함
- 큐의 두 가지 주요 작업
- Enqueue: 큐의 끝에 요소를 추가하는 작업
- Dequeue: 큐의 앞에서 요소를 제거하는 작업
- 은행의 대기열을 생각하면 먼저 온 고객이 먼저 서비스를 받는 것과 같음
- 비동기 데이터 처리나 작업 스케줄링에 유용함
메시지 큐 (Message Queue)
- 메시지 전달을 통해 프로세스 간 통신을 지원하는 기법
- 커널에 의해 관리되며, 프로세스가 메시지를 보내고 받을 수 있는 큐를 제공함
- 이 방법은 메시지를 순서대로 처리할 수 있는 장점이 있으며, 데이터를 비동기적으로 전송할 수 있음
- 메시지 큐는 시스템 콜을 통해 구현되며, 커널이 중재 역할을 함
공유 메모리 (Shared Memory)
- 프로세스들이 메모리의 일부를 공유하여 직접 데이터를 읽고 쓸 수 있게 하는 방법
- 커널의 개입 없이도 빠른 통신이 가능함
- 프로세스가 커널에 요청하여 공유 메모리 영역을 할당 받으면, 해당 메모리 영역에 대한 접근은 일반적인 메모리 접근처럼 이루어짐
- 동기화 문제를 직접 처리해야 하고, 일관성 문제를 해결해야하는 단점이 있음