1. 버퍼 (Buffer)
버퍼란?
데이터를 임시로 저장해두는 공간이다.
데이터를 보내는 쪽과 받는 쪽의 속도 차이가 있을 때, 중간에서 데이터를 모아두었다가 한꺼번에 전달하는 역할을 한다.
동작 원리
[데이터] → (조금씩 꺼내서 버퍼로 보냄) → [버퍼] → (버퍼가 채워지면 전송) → [데이터 처리]
버퍼의 위치
버퍼는 보내는 쪽과 받는 쪽 모두에 있을 수 있다.
| 종류 | 설명 | 예시 |
|---|---|---|
| 송신 버퍼 | 데이터를 모아서 한꺼번에 전송 | 프린터로 문서 보낼 때 |
| 수신 버퍼 | 빠르게 들어오는 데이터를 받아두고 처리 | 유튜브 영상 미리 받아두기 |
버퍼의 목적은 속도 차이 해결이다.
속도가 다른 두 지점 사이 어디든 필요하면 버퍼가 생긴다.
예시
- 유튜브: 서버에서 영상 데이터를 미리 받아 버퍼에 저장 → 끊김 없이 재생 (재생 바보다 빨간 바가 앞서가는 이유)
- 프린터: 문서를 버퍼에 저장 후 프린터 속도에 맞춰 전송
- 음악 스트리밍: 네트워크가 불안정해도 끊기지 않게 미리 저장
2. 프로세스 & 스레드
프로세스 (Process)
실행 중인 프로그램 하나. (예: 크롬 브라우저, 카카오톡)
스레드 (Thread)
프로세스 안에서 실제로 일을 처리하는 단위.
컴퓨터
└── 프로세스 (실행 중인 프로그램)
├── 스레드 1
├── 스레드 2
└── 스레드 3
싱글 스레드 vs 멀티 스레드
| 싱글 스레드 | 멀티 스레드 | |
|---|---|---|
| 프로세스당 스레드 수 | 1개 | 여러 개 |
| 구조 | 단순함 | 복잡함 |
| 속도 | 상대적으로 느림 | 빠름 |
| 단점 | - | 동시에 같은 데이터 접근 시 충돌 가능 (동시성 문제) |
싱글 스레드 ≠ 싱글 프로세스
싱글 스레드는 "프로세스 하나당 스레드가 하나"라는 의미이지, 프로세스 자체가 하나라는 뜻은 아니다.
프로세스 A └── 스레드 1개
프로세스 B └── 스레드 1개
프로세스 C └── 스레드 1개
→ 싱글 스레드 프로세스를 여러 개 띄울 수 있다. (ex. Node.js)
멀티 스레드 + 멀티 프로세스
프로세스 여러 개를 띄우고, 각 프로세스가 멀티 스레드면 수십 개의 스레드가 동시에 존재할 수 있다.
프로세스 A ├── 스레드 1 ├── 스레드 2 └── 스레드 3
프로세스 B ├── 스레드 1 ├── 스레드 2 └── 스레드 3
단, 프로세스끼리는 독립적이라 서로의 데이터를 직접 공유할 수 없다.
ex. 크롬 브라우저
크롬은 탭마다 별도의 프로세스를 띄우고, 각 프로세스 안에 여러 스레드가 있다.
→ 탭 하나가 뻗어도 다른 탭이 멀쩡한 이유!
3. 콜스택 & 이벤트 루프 (JavaScript)
콜스택 (Call Stack)
자바스크립트 코드가 실행되면서 생성되는 실행 컨텍스트를 저장하는 스택 구조.
- 함수 호출 시 → 스택에 추가(push)
- 함수 실행 완료 시 → 스택에서 제거(pop)
이벤트 루프 (Event Loop)
콜스택과 콜백 큐(태스크 큐)를 모니터링하면서 비동기 작업을 관리한다.
콜스택이 비어있을 때 콜백 큐의 작업을 콜스택으로 이동시킨다.
setTimeout은 정확하지 않다
setTimeout(fn, 1000)의 실제 의미는
"1초 후에 실행해줘"
→ "콜스택이 비었을 때, 1초는 지났으면 실행해줘"
콜스택이 바쁘면 콜백 큐는 그냥 밀려서 늦게 실행된다.
setTimeout(() => console.log("타임아웃!"), 1000);
// 3초 걸리는 무거운 작업
for (let i = 0; i < 10000000000; i++) {}
console.log("반복문 끝");
// 실행 결과:
// 1초 지남 → 콜백 큐에서 대기 중...
// 3초 지남 → "반복문 끝" 출력 (콜스택 비워짐)
// → 그제서야 "타임아웃!" 출력 ← 1초가 아닌 3초 후!
결론
setTimeout은 "최소 N초"를 보장할 뿐, 정확한 시간을 보장하지 않는다.- 이것은 자바스크립트가 싱글 스레드이기 때문에 생기는 근본적인 한계다.
'JavaScript' 카테고리의 다른 글
| JavaScript-DOM(문서 객체 모델) 2-실습(1) (0) | 2023.08.25 |
|---|---|
| JavaScript-DOM(문서 객체 모델) 1-실습 (0) | 2023.08.17 |
| JavaScript-DOM(문서 객체 모델) 요소 추가와 노드 삭제/순서배열(2) (0) | 2023.08.12 |
| JavaScript-DOM(문서 객체 모델) 요소에 접근하기(1) (0) | 2023.08.05 |
| JavaScript-Array(배열) 객체 (0) | 2023.07.28 |