오늘 포스팅 할 내용은 프로세스와 스레드에 대한 개념이다.
바로 프로세스에 대한 설명부터 시작해보자.
프로세스(Process)
- 정의
- 컴퓨터에서 실행되고 있는 프로그램
- 운영체제로부터 자원을 할당 받은 작업의 단위. 즉, 독립적인 메모리 공간을 할당 받아 실행되는 프로그램
- 각 프로세스는 별도의 메모리 공간에서 실행. 각 프로세스 간 변수나 자료구조에 대한 접근이 제한되어 있다.
- 프로세스가 별도의 메모리 공간을 받아 실행된다는 것은 메모리1에 1번 프로세스, 메모리2에 2번 프로세스 이런 이야기가 아니라
전체 메모리 공간을 나누어 각 공간에 주소를 매겨 사용하기에 1번지 ~ 10번지는 1번 프로세스 영역, 11번지 ~ 20번지는 2번 프로세스 영역 이런 방식으로 할당한다는 이야기이다.- 프로세스 간 자원에 접근하기 위해 IPC 통신을 사용한다.
프로세스 주소 공간
- 프로세스는 독립된 메모리 영역을 Code / Data / Stack / Heap 영역으로 할당받는다.
- Code 영역 : Code(명령어 집합) 자체가 존재하는 메모리 영역
- Data 영역 : 전역 변수, 정적(Static) 변수, 배열 등...
- Data 영역은 다시 Data 영역과 BSS(Block Started By Symbol) 두 가지로 구분된다.
- Data 영역 : 초기화 된 데이터 Ex) int a = 10;
- BSS 영역 : 초기화 되지 않은 데이터 Ex) int a;
- Heap 영역 : 프로세스 실행 중 동적으로 할당되는 데이터 Ex) C언어의 malloc, calloc과 C++, Java의 new
- Stack 영역 : 지역 변수, 함수의 매개 변수, return 값 등의 임시 데이터
"프로세스와 프로그램이 같은거 아냐?"에 대한 대답은 NO!
- 프로그램은 HDD, NAND와 같은 2차 저장장치에 저장되어 있는 아직 실행이 되지 않은 코드 덩어리들을 말하는 것이고,
프로세스는 1차 저장장치인 Main Memory 공간을 할당 받은 프로그램을 말하는 것이다.
스레드(Thread)
- 정의
- 프로세스 내에서 실행되는 여러 흐름의 단위
- 쉽게 설명하면 "에스프레소 한 잔을 만든다"는 하나의 프로세스를 "원두를 갈아낸다, 머신을 통해 에스프레소를 추출한다, 잔에 담는다" 같이 3개의 스레드로 나눌 수 있다
- 기본적으로 프로세스는 최소 1개의 스레드를 소유하고 이를 메인 스레드라 한다
- 스레드는 프로세스 안에서 존재한다
- 스레드는 프로세스 안에서 Stack 영역만 독립적으로 할당받는다
- 스레드는 Code / Data / Heap 영역은 서로 공유한다 ( 공유 자원으로 인해 발생 할 수 있는 문제들이 있지만 그것들은 추후에 설명하겠다)
오늘은 프로세스와 스레드에 대한 개념을 설명했다
다음 포스팅에서는 멀티 프로세스 & 스레드, 프로세스 스케줄링 등 프로세스와 스레드에 관한 추가적인 내용을 다루도록 하겠다