2022. 4. 8. 22:44ㆍProgramming theory/Computer science
- 목차
이 글은 이전에 운영하던 깃 블로그에서 옮겨온 글입니다.
서론
예전부터 프로세스와 스레드를 혼동하는 경우를 많이 봤습니다 다. 사실 둘은 같기도 하고 다르기도 하죠, 비슷하지만 엄연히 다른 프로세스와 스레드. 이 글에서는 각각의 간단한 정의에 대해서 살펴보려 합니다.
프로세스와 스레드(Process & Thread)
- 프로세스(Process) : 실행되는 프로그램의 작업 단위
- 스레드(Thread) : 프로세스 안에서 실행되는 흐름의 단위
둘 다 무언가의 단위입니다. 위 설명에서 보듯이, 스레드는 프로세스의 하위 개념이 되겠네요.
Process
Thread 1 |
Thread 2 |
Thread 3 |
… |
Thread N |
즉, 이처럼 프로세스라는 큰 단위에서 스레드라는 여러 흐름이 있는 것입니다.
메모리의 관점에서 본 프로세스와 스레드
사실 프로세스와 스레드의 차이점을 설명할 때 메모리에 관해 빼놓을 수 없습니다. 가장 큰 차이가 드러나기 때문이죠.
프로세스는 운영체제로부터 일정량의 메모리를 할당받아 작동합니다. 프로세스의 하위 개념인 스레드는 자신이 속한 프로세스가 할당받은 메모리를 나눠서 작동하게 되어있습니다.
메모리의 영역을 구분해보면 Data 영역, Code영역, Stack영역, Heap영역으로 나눌 수 있죠. 각 영역의 특징을 생각해보면 스레드가 어떤 영역을 다른 스레드와 공유하고 따로 쓰는지 알 수 있습니다.
- 공유하는 영역
- Data 영역 : 전역 변수와 정 적변 등이 저장되는 영역이다. 이 변수들은 특정 함수의 호출이 끝나고도 남아있어야 하며, 전 지역에서 사용되기 때문에 공유됨
- Code영역 : 프로그램을 구성하는 코드 자체가 적재되는 영역. 당연히 공유됨
- Heap영역 : 런타임 때 동적으로 제어할 수 있는 메모리 영역. 역시 공유됨
- 공유하지 않는 영역
- Stack영역 : 지역변수 등이 저장되는 영역. 각각의 기능(함수)이 구동되는 독립적인 영역이므로 각 스레드가 별도로 가지고 있음
- 프로세스들 사이에는 메모리를 공유하지 않는다. 운영체제가 별도로 할당
통신
위와 같은 이유로 프로세스와 프로세스 사이의 통신, 스레드와 스레드 사이의 통신방식이 다릅니다.
- 프로세스끼리의 통신
- 각각의 프로세스가 가지고 있는 메모리는 다른 프로세스가 직접 접근하지 불가
- 파일, 소켓 등 중간에 연결될 것이 있어야 통신이 가능
- 스레드끼리의 통신
- 스레드는 한 프로세스에서 공유하는 메모리 영역이 존재
- 공유되는 메모리는 동기화를 해주지 않으면 데이터 레이스 등의 문제가 발생할 수 있음
헷갈리기 쉬운, 비슷해 보이는 프로세스와 스레드의 차이는 포함 개념과 메모리 관점에서 보면 확실히 알 수 있습니다. 이 부분도 개발자 기술면접 질문 중 단골이라고 하네요.
마무리
여담으로 헷갈릴 수 있는 개념이 있습니다. 멀티 프로세서와 멀티코어이죠.
멀티 프로세서를 지원하는 CPU는 여러 개의 프로세스를 수행 가능하게 해 줍니다. 즉, 여러 ‘프로그램’을 동시에 실행하게 해주는 것이죠. 멀티코어를 지원하는 CPU는 한 프로세스의 여러 쓰레드를 동시에 동작가능하게 해줍니다.
프로세스가 실행 중인 프로그램의 단위라고 해서 프로그램과 프로세스를 같다고 생각하는 경우가 있는데, 프로세스는 메모리에 적재되어 '실행 중인' 프로그램입니다. 엄연히 다릅니다.
'Programming theory > Computer science' 카테고리의 다른 글
[Computer science]메모리 단편화(Fragmentation) (0) | 2022.04.09 |
---|---|
[Computer science]컨텍스트 스위칭(Context switching, 문맥 교환) (0) | 2022.04.09 |