Info
🔖프로그램
- 파일이 저장 장치에는 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태
- 실행되지 않은 파일 그 자체를 가리킴 ex) 윈도우의 .exe 파일, MacOS의 .dmg 파일
🔖프로세스
- 프로그램이 실행되어 돌아가고 있는 동적인 상태
- 운영체제가 메모리 등의 필요한 자원을 할당해준 실행 중인 프로그램
🔖스레드
- 프로그램 하나가 단순히 한 가지 작업만을 하는 경우가 없으므로 이를 해결하기 위함 ( ∵ 프로세스는 자신에게 할당된 메모리 내의 정보에만 접근할 수 있도록 제약을 두고 있고, 이를 벗어나는 정보에 접근하려면 오류가 발생)
- 프로세스보다 더 작은 실행 단위의 개념
🔖정리 프로그램은 코드 덩어리 파일, 그 프로그램을 실행한 것이 프로세스 스레드는 프로세스의 코드에 정의된 절차에 따라 실행되는 특정한 수행 경로
📖프로세스
메모리 상에서 실행 중인 프로그램으로 운영체제로부터 시스템 자원을 할당받은 작업의 단위

- 운영체제는 프로세스마다 독립된 메모리 영역을 Code/Data/Stack/Heap의 형식으로 할당
- 각 프로세스는 독립된 메모리 영역을 할당받기 때문에 다른 프로세스의 변수나 자료에 접근 불가능 → IPC(Inter Process Communication)를 통해 통신
📎할당받는 시스템 자원
- CPU 시간
- 운영되기 위한 주소 공간
- Code/Data/Stack/Heap의 구조로 되어있는 독립된 메모리 영역 ദ്ദിᐢ•ᗜ•ᐢ₎ go go
📖스레드
프로세스가 할당 받은 자원을 이용하는 실행 흐름의 단위

- 프로세스마다 최소 1개의 스레드 가짐 (
Main thread) - 한 프로세스 내에서 동작되는 여러 실행 흐름으로 프로세스 내의 주소 공간이나 자원을 공유
- 스레드는 프로세스 내의 Code/Data/Heap 영역은 다른 스레드와 공유하고 Stack 영역을 따로 할당받음
스레드 간의 자원 공유는 전역 변수(데이터 세그먼트)를 이용하므로 함께 상용할 때 충돌이 발생할 수 있음
스레드 하나에서 오류가 발생한다면 같은 프로세스 내의 스레드가 모두 강제 종료
🔖강제 종료가 될 수 있는 위험에도 메모리를 공유하는 이유는? 스레드: CPU 입장에서의 최소 작업 단위 프로세스: 운영체제 관점에서의 최소 작업 단위
프로세스는 하나 이상의 스레드를 가짐 but, 운영체제 관점에서는 프로세스가 최소 작업 단위 → 같은 프로세스 내의 스레드끼리는 메모리를 공유해야만 해!!!
📎Thread-Safe
멀티 스레드 환경에서 여러 스레드로부터 동시에 접근이 이루어져도 프로그램 실행에 문제가 없으며 항상 일정한 결과를 기대할 수 있는 것
Thread-Safe를 지키는 방법
- Mutual Exclusion : 공유자원에 하나의 스레드만 접근할 수 있도록 자원의 접근을 세마포어/뮤텍스의 lock으로 통제함
- Thread-Local Storage : 공유 자원의 사용을 최대한 줄여 각각의 스레드에서만 접근 가능한 저장소들을 사용함으로써 동시 접근을 막음
- Re-entrancy : 어떤 함수가 한 스레드에 호출되어 실행중일 때, 다른 스레드가 그 함수를 호출하더라도 그 결과가 각각에게 바르게 주어져야 함
- Atomic Operation : 공유 자원에 접근할 때 원자적으로 정의된 접근 방법을 사용함으로써 상호 배제를 구현
📖멀티 프로세스
하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 수행하는 것
📎장점
- 공유하는 자원이 없기 때문에 동일한 자원에 대해 접근하는 일이 없음
- 여러 개의 프로세스 중 하나에 문제가 발생해도 다른 프로세스에 영향을 미치지 않음
📎단점
- 각각 독립된 메모리 영역을 가져 메모리 사용량이 많음
- 스케쥴링에 따른
Context-Switching으로 인한 성능 저하
📖멀티 스레드
하나의 프로세스를 여러 개의 스레드로 구성하여 하나의 스레드가 하나의 작업을 수행하는 것
📎장점
- Context-Switching을 할 때, 공유하고 있는 메모리만큼 메모리 자원을 아낄 수 있음
- 프로세스 내의 stack 영역을 제외한 메모리 영역(Code/Data/Heap)을 공유하기 때문에 통신의 부담이 적어 응답 시간이 빠름
📎단점
- 스레드 중 하나에 문제가 생기면 전체 프로세스에 영향을 줄 수 있음
- 자원을 공유하기 때문에 동기화 문제 발생할 수 있음
📖멀티 프로세스보다 멀티 스레드를 사용하는 이유

1. 자원의 효율성 ↑
- 멀티 스레드는 메모리 영역을 공유하기 때문에 시스템 자원을 효율적으로 사용 가능
멀티 프로세스의 경우 프로세스를 생성하여 자원을 할당하는 시스템 콜을 할 때마다 오버헤드가 큼
2. 응답 시간 ↓
- 프로세스 간의 통신(IPC) 비용 > 스레드 간의 통신의 비용 ( ∵ 스레드는 Stack 영역을 제외한 모든 메모리 영역(Code/Data/Heap)을 공유하기 때문)
3. 처리 비용 감소 ↓
- 프로세스 간의 전환 속도 < 스레드 간의 전환 속도
( ∵ 스레드는
Context-Switching을 할 때 공유된 메모리 영역을 제외한 Stack 영역만 처리하기 때문)