diff --git "a/02\354\243\274\354\260\250/week02.md" "b/02\354\243\274\354\260\250/week02.md" new file mode 100644 index 0000000..a53fb62 --- /dev/null +++ "b/02\354\243\274\354\260\250/week02.md" @@ -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 등으로 나뉘어 동작한다.