[CS]프로세스와 스레드 , TCP의 3-way handshake
1. 프로세스와 스레드
1. 프로세스란?
프로그램을 실행 시켜 정적인 프로그램이 동적으로 변해 프로그램이 돌아가고 있는 상태
= 컴퓨터에서 작업 중인 프로그램
프로세스의 구조
프로그램이 실행되어 프로세스가 만들어지면 4가지의 메모리 영역으로 구성

코드 영역 (Code / Text) : 개발자가 작성한 프로그램 코드가 CPU가 해석 가능한 기계어 형태로 저장
데이터 영역 (Data) : 코드가 실행되면서 사용하는 전역 변수나 각종 데이터들이 모여있는 곳
힙 영역 (Heap) : 생성자, 인스턴스와 같은 동적으로 할당되는 데이터를 위한 공간
스택 영역 (Stack) : 지역 변수 같은 호출한 함수가 종료되면 되돌아올 임시 자료를 저장하는 독립된 공간
프로세스 자원 공유 방법
- IPC(Inter-Process Communication) 사용
- LPC(Local inter-Process Communication) 사용
- 별도의 공유 메모리 사용
2. 스레드란?
하나의 프로세스 안에서 동시에 진행되는 작업 갈래, 흐름 단위
스레드 특징
- 스레드끼리 프로세스의 자원을 공유 => 동시 작업이 가능
- 스레드는 프로세스의 Stack만 할당받아 복사, Code, Data, Heap은 프로세스내 다른 스레드들과 공유
| 구분 | 프로세스 | 스레드 |
| 실행 단위 | 실행 중인 하나의 프로그램 | 프로세스 내부의 실행 흐름 |
| 메모리 | 프로세스마다 독립적인 메모리 공간 | Code, Data, Heap 공유 |
| Stack | 프로세스마다 존재 | 스레드마다 독립적으로 존재 |
| 자원 공유 | IPC 등 별도 방법 필요 | 공유 메모리로 쉽게 가능 |
| 생성 및 전환 비용 | 상대적으로 큼 | 상대적으로 작음 |
| 안정성 | 다른 프로세스의 영향을 적게 받음 | 하나의 스레드 문제가 프로세스 전체에 영향을 줄 수 있음 |
3. 멀티 프로세스와 멀티 스레드
멀티 프로세스 : 하나의 작업을 여러 프로세스를 이용해 처리하는 방식
멀티 스레드 : 하나의 프로세스 안에서 여러 스레드가 동시에 작업을 수행하는 방식
=> 공유 자원에 여러 스레드가 동시에 접근할 수 있기 때문에 동시성 문제를 고려해야 함.
4. 멀티스레드에서 동시성 문제가 발생하는 이유
여러 스레드가 같은 프로세스의 Code, Data, Heap을 공유 => 여러 스레드가 동시에 읽고 수정하면 실행 순서에 따라 예상치 못한 결과를 초래할 수 있다.
두 스레드가 동시에 count 값을 1 증가시킨다고 해보자.
count = 0
Thread A: count 읽기 → 0
Thread B: count 읽기 → 0
Thread A: 0 + 1 → count = 1
Thread B: 0 + 1 → count = 1
여러 스레드가 공유 자원을 동시에 접근하면서 실행 순서에 따라 결과가 달라지는 상황을 Race Condition(경쟁 상태)라고 한다. => 한 번에 하나의 스레드만 접근하도록 제어하는 동기화가 필요
자바에서는 synchronized , Lock, AtomicInteger 등의 Atomic 클래스를 사용할 수 있음
2. TCP 3-Way Handshake
1. TCP 3-Way Handshake란?
TCP / IP 프로토콜을 이용해 통신을 하는 응용 프로그램이 데이터를 전송하기 전 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 방식
과정

- Closed : 연결 시도 전 Client, Server의 상태 / TCP 포트가 닫혀진 상태
- Listen : TCP 포트가 열려 있고 연결 요청을 대기하는 상태
- Syn-Sent(Client) : Client가 Server에게 연결을 요청하는 SYN 패킷 전송(임의의 값 seq(100) 넘버를 함께 전송)
- Syn-Receved(Server) : SYN 패킷을 받은 Server는 요청을 수락하게 되면 SYN+ACK 패킷을 전송하며 응답 (임의의 값 seq(200) 넘버 전달, Client로부터 전달 받은 seq(100)+1을 한 ack(101) 넘버 전달)
- Established(Client) : Server의 SYN+ACK를 수신한 Client는 ACK 패킷을 Server에 전송하고 ESTABLISHED 상태로 전환
- Established(Server) : Client의 ACK를 수신한 Server도 ESTABLISHED 상태로 전환
왜 3-Way 인가?
클라이언트와 서버가 서로 양방향 통신이 가능한 상태인지 확인해야하기 때문!
만약 2-Way Handshake 까지만 진행된다고 가정하자
Client → Server : SYN
Client ← Server : SYN + ACK
여기까지 진행하면 클라이언트 입장에서는
"내가 보낸 SYN이 서버에 정상적으로 도착했다."
"서버가 보낸 SYN도 나에게 정상적으로 도착했다." 는 것을 확인할 수 있다.
서버 입장에서는 자신이 보낸 SYN + ACK가 클라이언트에게 정상적으로 도착했는지는 알 수 없다.
따라서 마지막으로 클라이언트가 ACK를 한 번 더 전송
Client → Server : SYN
Client ← Server : SYN + ACK
Client → Server : ACK
마지막 ACK를 서버가 수신하면 서버 역시 자신이 보낸 패킷이 클라이언트에게 정상적으로 도착했고, 클라이언트가 응답할 수 있는 상태임을 확인할 수 있다.