Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
149 changes: 149 additions & 0 deletions 02주차/week02.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
# 2주차 - OS - Process / Thread / 동시성

## 공통 키워드

### 1. Process(프로세스)

Process는 실행 중인 프로그램이다.

- Program은 디스크에 저장된 정적인 파일이고 Process는 그 Program이 메모리에 올라가 실행되고 있는 동적인 상태를 의미한다.
- SSD는 컴퓨터의 저장장치로, 파일을 **오래** 보관하는 창고 역할을 한다.
- 참고로 RAM은 지금 당장 실행할 것들을 **잠시** 올려두는 작업 공간이라는 차이가 있다.
- CPU는 RAM에 올라온 데이터를 가져와서 처리한다.
- Process는 생성부터 종료까지 아래와 같은 상태(State)를 거치며 전환된다.

#### Process의 상태

| 상태 | 설명 |
| --- | --- |
| New | Process가 생성되고 있는 상태 |
| Ready | 실행될 준비는 됐지만 아직 CPU를 할당받지 못한 상태 |
| Running | CPU를 할당받아 실제로 명령을 실행 중인 상태 |
| Waiting(Blocked) | I/O 등 다른 작업이 끝나기를 기다리는 상태 |
| Terminated | 실행이 끝나 종료된 상태 |


### 2. Thread(스레드)

Thread는 Process 안에서 실제로 작업을 수행하는 실행 단위이다.

- 크롬이라는 하나의 Process 안에서도 여러 작업을 동시에 처리할 수 있다.
- 예: 웹페이지 화면 처리, 파일 다운로드, 사용자 입력 처리
- 브라우저에서 기본적으로 JavaScript 코드와 화면 UI 관련 처리를 담당하는 Thread를 메인 스레드라고 한다.
- 같은 Process에 속한 Thread들은 Code, Data, Heap 영역은 함께 공유하고, Stack만 각자 따로 가진다.
- 그래서 Thread끼리는 데이터를 주고받기 쉬운 대신, 같은 데이터를 동시에 건드리면 Race Condition 같은 문제가 발생하기 쉽다.



### 3. Context Switching(문맥 교환)

Context Switching은 CPU가 실행하던 작업을 멈추고 다른 작업으로 바꾸는 것이다.

- CPU가 Process A를 실행하다가 잠깐 멈추고 Process B를 실행한 뒤, 다시 A로 돌아와 이어서 실행할 수 있다.
- OS가 현재 작업 상태(Context)를 저장하고 다른 작업 상태를 불러오는 과정 자체를 문맥 교환이라고 한다.
- Context Switching 자체도 시간이 걸리는 작업이라, 너무 자주 일어나면 오히려 오버헤드가 커져서 전체 성능이 떨어질 수 있다.


### 4. 동시성(Concurrency)

동시성은 여러 작업을 번갈아가면서 처리하는 것이다.

- 실제로는 한순간에 하나의 작업만 처리하지만, 아주 빠르게 작업을 바꿔가며 처리해서 동시에 처리하는 것처럼 보이게 한다.


### 5. 병렬성(Parallelism)

병렬성은 여러 작업을 진짜로 동시에 처리하는 것이다.

- CPU 코어가 여러 개라면 각 코어가 작업을 하나씩 담당해서, 여러 코어가 동시에 실행되는 방식으로 병렬 처리가 가능하다.
- 코어가 하나면 한 번에 하나의 작업만 처리할 수 있고, 코어가 여러 개면 여러 작업을 동시에 처리할 수 있다.

#### 동시성 vs 병렬성

| 구분 | 설명 |
| --- | --- |
| 동시성(Concurrency) | 여러 작업을 번갈아가며 처리, 동시에 처리하는 것처럼 보임 |
| 병렬성(Parallelism) | 여러 작업을 실제로 동시에 처리 |


### 6. Race Condition(경쟁 상태)

Race Condition은 여러 작업이 같은 데이터를 동시에 건드리면서, 실행 순서에 따라 결과가 달라지는 문제이다.

#### 예시 상황

- 잔액 10,000원인 계좌에서 A가 5,000원 출금, B도 5,000원 출금을 동시에 시도한다고 가정하자.
- 둘 다 먼저 "잔액이 10,000원이네"라고 읽어버리면, 결과가 0원이 되어야 하는데 5,000원이 남는 문제가 발생할 수 있다.
- 즉 누가 먼저 실행되느냐에 따라 결과가 달라지는 상황을 경쟁 상태라고 한다.
- 이 문제를 해결하기 위해 Lock, Mutex, Semaphore와 같은 동기화 방법을 사용한다.
- 여러 작업이 동시에 접근하면 문제가 되는 코드 구간을 임계 구역(Critical Section)이라고 부르며, 동기화 방법들은 결국 이 임계 구역에 한 번에 하나의 작업만 들어가도록 보장하는 역할을 한다.

### 7. Lock(락) 참고

Lock은 "이 데이터 지금 내가 쓰고 있으니까 다른 애들은 기다려"라고 하는 동기화 방법이다.

- 위 예시에서 A가 먼저 실행되면 Lock을 획득해서 5,000원 출금을 처리한 뒤 Lock을 해제한다.
- 진행 중인 Process가 끝날 때까지 다른 Process는 접근하지 못하고 기다린다.
- 다만 여러 개의 Lock을 서로 다른 순서로 잠그면 서로가 서로를 기다리는 Deadlock(교착 상태)이 발생할 수 있어 주의가 필요하다.


### 8. Mutex(뮤텍스)

Mutex는 상호 배제(Mutual Exclusion)의 준말로, 한 번에 하나의 작업만 특정 자원에 접근할 수 있도록 하는 잠금 장치이다.

- Lock과 비슷하다고 생각해도 된다.
- 여러 작업 중 딱 하나만 자원에 접근하도록 하는 동기화 도구이다.
- 문이라고 생각하면 이해하기 쉽다 → 한 명씩 입장(사용)하게 하는 잠금장치.
- Mutex는 Lock을 획득한 작업(소유자)만 해제할 수 있다는 점이 특징이며, 이 소유권 개념이 Semaphore와의 차이점이다.


### 9. Semaphore(세마포어)

Semaphore 역시 여러 작업이 동시에 자원을 사용할 때 접근을 조절하는 동기화 도구이다.

- Mutex와의 차이는 몇 개까지 동시에 접근할 수 있느냐이다.
- 한 번에 N개의 작업까지 접근을 허용한다.
- 값이 0과 1만 가지는 경우를 Binary Semaphore라고 하며 이 경우 Mutex와 동작이 비슷하고, 여러 값을 가질 수 있는 경우를 Counting Semaphore라고 한다.

#### Mutex vs Semaphore

| 구분 | 동시 접근 허용 개수 |
| --- | --- |
| Mutex | 1개 |
| Semaphore | N개 |


---

## Frontend 심화

### 1. JS Single Thread

JavaScript는 한 번에 하나의 작업만 실행할 수 있는 하나의 실행 흐름(Thread)을 가진다.

- 작업 A를 실행하는 동안에는 작업 B를 동시에 실행할 수 없다. 기본적으로 한 번에 하나씩 실행한다고 생각하면 된다.
- 브라우저의 Web API와 Event Loop를 이용해서 비동기 작업을 처리한다.
- 예: `setTimeout()`으로 몇 초 뒤 실행하는 등 비동기 처리
- JS 엔진은 하나의 Call Stack만 가지고 코드를 순서대로 실행하기 때문에, 무거운 연산이 Call Stack을 오래 차지하면 그동안 화면 렌더링이나 사용자 입력 처리가 멈춘 것처럼 보일 수 있다(블로킹).


### 2. Web Worker

Web Worker는 JavaScript의 무거운 작업을 별도의 스레드에서 실행할 수 있게 해주는 기능이다.

- 기본적으로 JS는 싱글 스레드라서 무거운 작업을 만나면 화면이 멈출 수 있다.
- Web Worker를 사용하면 무거운 계산을 다른 스레드로 보내고, 메인 스레드는 계속 UI를 처리할 수 있다.
- 메인 스레드와 Worker가 같은 변수를 직접 만지는 게 아니라, 서로 메시지를 주고받으며 데이터를 교환한다.
- 같은 방(메모리)을 쓰는 것이 아니라 메세지로 소통한다고 생각하면 된다.
- 다만 Web Worker는 DOM에 직접 접근할 수 없다는 제약이 있어서, 화면을 직접 조작하는 작업이 아니라 계산 위주의 작업에 활용된다.


### 3. 브라우저 Multi-Process 구조

브라우저 하나 안에서도 여러 Process로 나눠서 작업을 처리한다는 의미이다.

- 브라우저 전체가 하나의 Process로 돌아간다면, 탭이 여러 개 있을 때 하나의 탭에 문제가 생기면 브라우저 전체에 영향을 줄 수 있다.
- 그래서 브라우저는 작업을 여러 Process로 나눈다.
- 나누어진 Process 안에는 각 프로그램에 맞는 Thread들이 다르게, 그리고 다양하게 존재한다.
- 이 구조를 통해 안정성, 보안, 성능 측면에서 이점을 얻을 수 있다.
- 예를 들어 크롬은 전체를 총괄하는 Browser Process 하나와, 탭(사이트)마다 별도로 뜨는 Renderer Process, 그 외 GPU Process, Network Process 등으로 나뉘어 동작한다.