: 프로세스는 실행 중인 프로그램을 의미하며, 운영체제(OS)에서 자원을 할당받아 독립적으로 실행되는 단위
• 운영체제로부터 독립적인 메모리 공간(코드, 데이터, 힙, 스택 등)을 할당받음
• 하나의 프로세스는 여러 개의 스레드를 가질 수 있음
• 프로세스 간에는 메모리를 공유하지 않음 (통신 시 별도의 방법이 필요함: IPC(Inter-Process Communication))
• 코드(Code) 영역: 실행할 명령어가 저장됨
• 데이터(Data) 영역: 전역 변수, 정적 변수 등이 저장됨
• 힙(Heap) 영역: 동적으로 할당된 메모리 공간
• 스택(Stack) 영역: 함수 호출 시 생성되는 지역 변수, 매개변수 저장
• Chrome 브라우저를 실행하면 여러 개의 프로세스가 생성됨 (탭마다 독립된 프로세스일 수도 있음)
• VS Code를 실행하면 하나의 프로세스가 생성됨
: 스레드는 프로세스 내에서 실행되는 작업의 단위야. 하나의 프로세스 안에서 여러 개의 스레드가 실행 될 수 있음
• 같은 프로세스 내에서 메모리(코드, 데이터, 힙)를 공유함
• 독립적인 실행 흐름(Stack을 따로 가짐)
• 프로세스보다 가볍고 빠르게 생성 및 종료됨
• 동기화 문제(데이터 충돌)가 발생할 수 있음
• PC(Program Counter): 실행할 명령어 주소 저장
• 레지스터: 연산에 필요한 데이터 저장
• 스택(Stack): 함수 호출 시 지역 변수, 매개변수 저장 (스레드마다 독립적)
• 웹 브라우저에서 여러 개의 탭이 동시에 실행 (각 탭이 다른 스레드일 수 있음)
• 게임에서 화면 렌더링, 입력 처리, 네트워크 통신이 동시에 수행
| 구분 | 프로세스 | 스레드 |
|---|---|---|
| 메모리 공유 | X (각자 독립적인 메모리) | O (코드, 데이터, 힙 공유) |
| 생성 속도 | 느림 (운영체제의 자원 할당 필요) | 빠름 (프로세스 내에서 생성) |
| 통신 방식 | IPC 필요 (파이프, 메시지 큐, 소켓 등) | 공유 메모리를 사용하여 통신 가능 |
| 독립성 | 개별적으로 실행 가능 | 하나의 스레드가 비정상 종료되면 전체 프로세스에 영향 가능 |
• 여러 개의 프로세스를 실행하는 방식
• 장점: 독립적 실행 (한 프로세스가 죽어도 다른 프로세스에는 영향 없음)
• 단점: 프로세스 간 통신이 어렵고, 메모리 사용량이 많음
• 하나의 프로세스 내에서 여러 개의 스레드를 실행하는 방식
• 장점: 메모리 공유로 인해 자원 사용 효율이 높음, 빠른 데이터 공유 가능
• 단점: 동기화 문제 발생 가능 (하나의 스레드가 문제를 일으키면 전체 프로세스에 영향을 줄 수 있음)
• 독립적인 작업을 수행할 때 (크롬 브라우저의 각 탭)
• 자원 공유가 필요 없는 경우
• 하나의 작업이 실패해도 다른 작업에 영향을 주지 않아야 할 때
• 같은 데이터를 여러 개의 작업이 동시에 처리해야 할 때
• 프로세스 간 통신 비용을 줄이고 싶을 때
• 빠른 응답 속도가 필요한 경우 (게임, 실시간 채팅)
• 프로세스: 실행 중인 프로그램, 독립적인 메모리 공간을 가짐
• 스레드: 프로세스 내에서 실행되는 작업 단위, 메모리를 공유함
• 멀티 프로세스: 독립적인 작업을 여러 개 실행할 때 사용
• 멀티 스레드: 같은 데이터를 동시에 처리할 때 사용
• 특정 기능을 수행하는 재사용 가능한 코드 묶음
• 개발자가 필요할 때 직접 호출해서 사용하는 방식
• 필요한 기능만 골라서 사용 가능
• 애플리케이션의 흐름을 개발자가 직접 제어
• 보통 함수, 클래스의 집합 형태
• NumPy, Pandas (데이터 분석)
• Lodash (JavaScript 유틸리티)
• Matplotlib (파이썬 그래프 그리기)
• jQuery (JavaScript DOM 조작)
• 애플리케이션 개발을 위한 전체 구조를 제공하는 틀
• 개발자가 그 틀에 맞춰 코드를 작성해야 함
• 기본적인 코드 구조가 미리 제공됨
• 개발자는 프레임워크의 규칙을 따라야 함
• 프레임워크가 애플리케이션의 흐름을 제어 (“제어의 역전” 원칙)
• Spring (Java 웹 개발)
• Django, Flask (Python 웹 개발)
• React, Angular, Vue.js (JavaScript 프론트엔드)
• Express.js (Node.js 백엔드)
예를 들어:
• jQuery (라이브러리): 개발자가 $('#button').click() 같은 코드를 직접 호출해서 사용
• React (프레임워크): React가 useEffect() 같은 함수를 알아서 호출
| 구분 | 프레임워크 | 라이브러리 |
|---|---|---|
| 제어 흐름 | 프레임워크가 코드 실행 흐름을 제어 | 개발자가 직접 코드 실행 흐름을 제어 |
| 유연성 | 정해진 방식대로 개발해야 함 | 필요한 기능만 가져다 사용 가능 |
| 사용 방식 | 코드의 큰 구조를 제공하고, 그 안에서 개발 | 특정 기능을 제공하며, 필요할 때 호출 |
| 예시 | Spring, Django, React | NumPy, jQuery, Lodash |
✅ 프레임워크를 선택해야 할 때
• 프로젝트의 구조를 잡아야 할 때
• 확장성과 유지보수가 중요한 경우
• 일관된 개발 방식이 필요한 경우
✅ 라이브러리를 선택해야 할 때
• 특정 기능만 필요할 때
• 프로젝트 구조에 큰 영향을 주지 않고 사용하고 싶을 때
예를 들어:
• React (프레임워크) + Lodash (라이브러리)
• Django (프레임워크) + NumPy (라이브러리)
➡️ 프로젝트의 큰 틀을 잡아주고, 라이브러리는 필요한 기능을 추가할 때 사용