기술 면접 스터디
✅ 프로세스와 스레드의 차이에 대해 설명해 주세요
1) 프로세스
사전적인 뜻으로는 일을 처리하는 일련의 과정을 의미한다.
💡 컴퓨터에게 프로세스란?
- 운영체제로부터 시스템 자원을 할당받는 작업의 단위
- 컴퓨터에서 연속적으로 실행되고 있는 프로그램
- 메모리에 올라와 실행되고 있는 프로그램의 인스턴스.
💡 하나의 프로세스 코드영역(code), 데이터 영역(date), 스택 영역(stack), 힙 영역(heap) 으로 이루어져 있다.
Code : 코드 자체를 구성하는 메모리 영역(프로그램 명령)
Data : 전역 변수, 정적 변수, 배열 등 (초기화된 데이터)
Stack : 지역변수, 매개변수, 리턴 값 (임시 메모리 영역)
Heap : 동적 할당 시 사용 (new(), mallock() 등)
실제로 하나의 프로그램이 실행될 때, 동시에 여러 가지 프로세스가 실행되는 경우들이 있다.
크레이지 아케이드라는 게임을 예를 들어보면, 게임을 하는 동안 물풍선을 맞고 물속에 갇히는 프로세스,
남은 게임 시간을 나타내는 프로세스, 다른 캐릭터들이 움직이는 프로세스 등 여러가지 프로세스들이
동시에 진행된다..
물풍선을 맞는 하나의 동작도 자세히 살펴보면,
1. 물풍선을 맞아서 물안에 갇히는 동작을 구현하는 프로세스
2. 물소리가 나는 프로세스
3. 갇힌 시간으로부터 일정 시간을 계산하는 프로세스 등..
동시에 많은 프로세스들이 진행된다.
그리고 이렇게 한 번의 사건이 발생해서 여러 가지 프로세스들이 실행될 때
우리 눈에는 동시에 진행되는 것처럼 보이지만, 실제로는 cpu는 프로세스 1을 어느 정도 하고 저장하고 프로세스 2를 진행하고 다시 돌아가며 여러 프로세스를 왔다 갔다 하는 콘텍스트 스위칭(Context Switching) 이 일어난다.
반복이 많아지게 되면 CPU의 부담이 늘어나고, 중복된 자원들이 비효율적으로 관리된다.
그럴 때 사용하는 것이 바로 멀티스레드이다.
2) 스레드
한 프로세스 내에서 동작되는 여러 실행의 흐름.
프로세스 하나에 자원을 공유하면서 일련의 과정을 여러 개를 동시에 실행시킬 수 있는 것.
👉 스레드를 추가로 생성하지 않는 한 모든 프로그램 코드는 메인 스레드에서 실행된다.
👉 하나의 프로세스는 여러 개의 스레드를 가질 수 있으며 이를 멀티 스레드라고 한다.
💡 멀티스레드의 구조
Code, Data, Heap 영역을 공유하고 있으며, Stack에서만 스레드를 별로 가진다.
여기서 질문!
💡 다른 자원들은 공유하지만 굳이 스택만 분리해서 사용하는 이유는?
LIFO(Last In First Out) / 후입 선출이라는 스택의 특성과도 연관이 있습니다.
왜냐하면? 코드와 데이터 힙 영역을 공유하는 것에는 큰 문제가 없지만,
스택 영역은 스택이 쌓이면 위에서부터 프로세스가 섞인 채로 순서대로 나오게 되므로
더 복잡해지기 때문에 원활한 실행 흐름을 위해 스택은 따로 독립적으로 존재하게 됩니다.
2. 멀티 프로세스와 멀티스레드
💡 멀티프로세스
하나의 컴퓨터에 여러 CPU 장착 → 하나 이상의 프로세스들을 동시에 처리(병렬)
장점 : 안전성이 높음 (독립된 구조기 때문)
단점 : 각각 독립된 메모리 영역을 갖고 있어, 작업량 많을수록 오버헤드 발생. Context Switching으로 인한 성능 저하
💡 멀티스레드
장점
- 프로그램의 응답 시간이 단축
- 시스템의 처리율이 향상
- 시스템의 자원 소모 감소
- 프로세스 간 통신 방법에 비해 스레드 간의 통신 방법이 훨씬 간단
단점
- 여러 개의 스레드를 이용하는 경우, 미묘한 시간차나 잘못된 변수를 공유함으로써 오류 발생 가능
👉 스레드 간 통신할 경우에 충돌 문제가 발생하지 않도록 동기화 문제를 해결해야 함 - 프로그램 디버깅 어려움
- 단일 프로세스 시스템에서는 효과 미비
👀 참고 블로그
✅ TCP와 UDP의 공통점과 차이점을 설명해보세요.
1) TCP?
전송을 제어하는 프로토콜(규약).
인터넷상에서 데이터를 메세지의 형태로 보내기 위해 IP와 함께 사용하는 프로토콜.
💡 특징
- 연결 지향 방식
: 3-way handshaking 과정을 통해 연결을 설정하고 4-way handshaking을 통해 해제
👉 패킷을 전송하기 위한 논리적 경로를 배정
👉 3-way handshaking : 목적지와 수신지를 확실히 하여 정확한 전송을 보장하기 위해서 세션을 수립하는 과정
👉 패킷 : 인터넷 내에서 데이터를 보내기 위한 경로배정(라우팅)을 효율적으로 하기 위해서 데이터를 여러 개의 조각들로 나누어 전송을 하는데 이때, 이 조각을 패킷이라고 함
👉 높은 신뢰성 보장
👉 데이터 흐름 제어 및 혼잡 제어
이러한 장점이 있지만 이로 인해
👉 UDP보다 속도 느림 - 전이중(Full-Duplex), 점대점(Point to Point) 방식
💡TCP 서버의 특징
- 서버소켓은 연결만을 담당한다.
- 연결과정에서 반환된 클라이언트 소켓은 데이터의 송수신에 사용된다
- 서버와 클라이언트는 1대1로 연결된다.
- 스트림 전송으로 전송 데이터의 크기가 무제한이다.
- 패킷에 대한 응답을 해야하기 때문에(시간 지연, CPU 소모) 성능이 낮다.
- Streaming 서비스에 불리하다.(손실된 경우 재전송 요청을 하므로)
TCP는 연속성보다 신뢰성있는 전송이 중요할 때에 사용하는 프로토콜로 예를 들면 파일 전송과 같은 경우에 사용
2) UDP?
사용자 데이터그램 프로토콜(규약).
데이터를 데이터그램 단위로 처리하는 프로토콜.
💡 특징
- 비연결형 서비스로 데이터그램 방식을 제공한다
👉 독립적인 관계를 지니는 패킷 - 정보를 주고 받을 때 정보를 보내거나 받는다는 신호 절차를 거치지 않는다
👉 TCP 보다 속도가 빠름
👉 네트워크 부하가 적다
👉 신뢰성이 낮다 - UDP헤더의 CheckSum 필드를 통해 최소한의 오류만 검출한다.
신뢰성보다는 연속 성이 중요한 서비스 예를 들면 실시간 서비스(streaming)에 자주 사용
💡UDP 서버의 특징
- UDP에는 연결 자체가 없어서(connect 함수 불필요) 서버 소켓과 클라이언트 소켓의 구분이 없다.
- 소켓 대신 IP를 기반으로 데이터를 전송한다.
- 서버와 클라이언트는 1대1, 1대N, N대M 등으로 연결될 수 있다.
- 데이터그램(메세지) 단위로 전송되며 그 크기는 65535바이트로, 크기가 초과하면 잘라서 보낸다.
- 흐름제어(flow control)가 없어서 패킷이 제대로 전송되었는지, 오류가 없는지 확인할 수 없다.
- 파일 전송과 같은 신뢰성이 필요한 서비스보다 성능이 중요시 되는 경우에 사용된다.
3) 공통점
데이터를 보내기 위해 사용하는 프로토콜
4) 차이점
👀 참고 블로그