#1. 프로세스 (Process)
- 운영체제로부터 자원을 할당받은 작업의 단위
- Process is a program in execution
- 프로세스는 실행중인 프로그램을 의미
모든 프로그램은(운영체제 포함) 메모리에 올라와야 사용할 수 있다 (폰 노이만 구조)
작업관리자에서 프로세스들을 볼 수 있다. (PID = Process ID)
📌 프로세스의 구조 (메모리 배치)
1. Stack 영역
- 호출된 함수의 작업을 마치고 복귀할 주소 및 데이터(지역변수, 매개변수, 리턴 값 등)를 임시로 저장하는 공간
- 스택 = LIFO 구조를 사용하여 메모리의 높은 주소부터 시작하여 낮은 주소로 할당됨
- 컴파일 타임에 크기가 결정됨 (stack overflow 발생 가능성 있음)
- 함수 호출시 할당되고 리턴시 소멸됨
- Read-Write 가능
2. Heap 영역
- 메모리 주소 값에 의해서만 참조되고 사용되는 동적 데이터 영역
- 메모리의 낮은 주소에서 높은 주소 방향으로 할당됨
- 다른 영역과는 다르게 런타임에 크기가 결정됨
- malloc, calloc, realloc, new
- memory leak 방지를 위해 메모리 해제 필요 (free, delete 또는 GC가 처리)
3. Data 영역 (BSS, GVAR)
- 프로그램이 사용하는 데이터를 저장하는 공간
- BSS(Block Started by Symbol) : 초기값이 없는 전역 변수/static 변수/배열 등
- GVAR(Global Variable) : 초기값이 있는 전역 변수/static 변수/배열 등
4. Text(Code) 영역
- 프로그램의 컴파일된 코드(기계어)가 저장되어 있음
- CPU는 여기서 명령어를 하나씩 가져와 처리함
- Read-only
📌 공간을 나눈 이유?
📌 Heap과 Stack의 방향이 반대인 이유?
- 스택은 항상 커널의 반대 방향으로 자라기 때문에 스택이 아무리 커져도 커널을 건드리지 않음
- 공유 라이브러리 영역을 가운데에 두고 서로 마주보는 형태를 갖기 때문에 메모리 공간을 알뜰하게 활용 할 수 있음
#2. 스레드 (Thread)
- 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위
- 프로세스 내에서 동시에 진행되는 작업의 갈래, 흐름의 단위
- 하나의 프로세스는 최소 하나의 Thread(메인 스레드)를 가짐
- 스레드는 프로세스 내에서 Code, Data, Heap 영역은 공유하여 사용하고 Stack 영역만 따로 할당받음
- 한 스레드가 프로세스의 자원을 변경하면 다른 스레드에도 그 변경이 즉시 반영됨
#3. 멀티 프로세스 & 멀티 스레드
#멀티 프로세스
- 하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업(task)을 처리하도록 하는 것
예를 들어 위 크롬 프로그램은 여러 자식 프로세스로 구성되어 있다.
-
😀 장점
- 여러 자식 프로세스 中 하나에 문제가 발생해도 해당 프로세스만 죽을 뿐 그 영향이 확산되지 않음
-
😥 단점
- Context Switching 비용 (Overhead)
- Context Switching은 캐쉬 메모리 초기화 등 상대적으로 시간과 비용이 큰 작업
- 프로세스는 각각 독립된 메모리 영역을 할당받기 때문에 프로세스 간 공유하는 메모리가 없어 Context Switching시 캐쉬에 있는 모든 데이터를 리셋하고 다시 불러오는 과정이 필요함
- 📌 Context Swtiching
#멀티 스레드
-
하나의 프로세스를 여러 개의 스레드로 구성하고 각 스레드가 하나의 작업(task)을 처리하도록 하는 것
멀티 프로세스의 단점들을 극복하기 위해 등장.
-
😀 장점
- 스레드의 생성 및 Context Switching은 프로세스보다 훨씬 빠르고
- 프로세스 처럼 데이터 교환을 위해 IPC와 같은 기법이 필요 없다.
- 즉, 프로세스처럼 메모리 영역을 통째로 복사하는 것이 부담스럽기 때문에 멀티 스레드를 사용
-
😥 단점
- 자원 공유 문제 (동기화 문제, 교착 상태)
- 한 스레드에 문제가 발생하면 전체 (프로세스)가 영향을 받음
-
메모리 공유가 필요하고, I/O bound 작업이 많은 경우 적합
📌 CPU bound vs I/O bound
Ref
https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%E2%9A%94%EF%B8%8F-%EC%93%B0%EB%A0%88%EB%93%9C-%EC%B0%A8%EC%9D%B4
https://www.hackerschool.org/Sub_Html/HS_University/BOF/essential/PDF_Files/15.pdf
https://kkongchii.tistory.com/entry/dsd
https://velog.io/@aeong98/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9COS-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C#%EB%A9%80%ED%8B%B0%ED%83%9C%EC%8A%A4%ED%82%B9-%EB%A9%80%ED%8B%B0%EC%8A%A4%EB%A0%88%EB%93%9C
https://brunch.co.kr/@babosamo/100
https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html
https://velog.io/@mooh2jj/Process-vs-Thread-%EB%B9%84%EA%B5%90%ED%95%98%EA%B8%B0