프로세스의 개념에 대해 알아보기 전에 먼저 프로세스와 프로그램의 차이에 대해 알아보겠습니다.
구분 | 프로그램 | 프로세스 |
---|---|---|
형태 | 실행할 수 있는 파일 | 실행중인 프로그램 |
상태 | 파일이 메모리에 올라가있지 않은 정적인 상태 | 메모리에 적재되고 CPU 자원을 할당받아 실행되고 있는 동적인 상태 |
이미지 |
Stack 영역
Heap 영역
Data 영역
Code 영역
프로세스 메모리 구조에서 Stack, Data, Code 영역의 크기는 컴파일 시 결정되고, Heap 영역의 크기는 런타임 시 동적으로 할당됩니다.
Stack과 Heap 영역은 동적 메모리 할당이 가능해 두영역 사이에 빈 메모리 공간이 존재하는데, 이 영역은 서로 침범할 수 있습니다.
이로 인해 스택 오버플로(스택이 힙을 침범)나 힙 오버플로(힙이 스택을 침범)가 발생할 수 있습니다.
💡 (참고) 스택, 힙 오버플로우
Stack Overflow: 주로 재귀 호출이 과도하게 발생하거나 지나치게 큰 지역 변수가 할당될 때 발생
Heap Overflow: 동적 메모리 할당이 과도하게 이루어져 사용 가능한 메모리 공간을 초과할 때 발생
스레드는 한 프로세스 내에서 나뉘어진 하나 이상의 실행 단위이며, 프로세스에 할당된 메모리와 자원을 공유하며 작업을 수행합니다.
프로세스는 운영 체제로부터 CPU 시간과 같은 자원을 할당받는 더 큰 개념이며, 실제로 CPU에서 작업을 수행하는 것은 프로세스 내부의 스레드들입니다. 그래서 프로세스가 CPU 코어에서 실행되기 위해서는 최소한 하나의 스레드가 필요합니다.
💡 스레드마다 별도의 Stack을 할당하는 이유
스레드가 독립적인 함수 호출과 실행 흐름을 유지할 수 있게 하기 위함입니다. 이를 통해, 각 스레드는 다른 스레드의 작업에 영향을 받지 않고 독립적으로 실행될 수 있습니다.
기술면접에서 흔히 물어보는 스레드는 OS 레벨의 스레드이고, 개발자가 쉽게 접할 수 있는 스레드는 자바 스레드 입니다.
자바 스레드는 JVM(Java Virtual Machine)을 통해 실행되며, JVM은 운영체제 상에서 하나의 프로세스로 작동합니다.
이 자바 스레드들은 OS 레벨의 스레드와 1:1로 매핑되어 실제로 실행되며, 이러한 매핑 덕분에 OS 레벨의 스레드를 간편하게 사용할 수 있습니다.
프로세스는 운영체제로부터 자원을 할당받아 실행하는 독립적인 작업 단위입니다. 각 프로세스는 독립된 메모리 공간(Stack, Heap, Data, Code)을 가지며, 다른 프로세스와 자원을 공유하지 않습니다. 이로 인해 프로세스 간의 통신을 위해서는 별도의 기법인 IPC가 필요합니다.
반면에, 스레드는 프로세스가 할당받은 자원을 이용하여 실행되는 더 작은 단위입니다.
하나의 프로세스 안에서 생성된 스레드들은 프로세스의 메모리 공간(Heap, Data, Code)을 공유하지만, 각 스레드는 고유한 Stack을 가지고 동작합니다. 이 공유된 자원 구조 때문에, 같은 프로세스 안에 있는 스레드들 간에는 데이터 공유가 가능합니다.
멀티 프로세스는 하나의 응용 프로그램이 여러 개의 프로세스를 동시에 실행할 수 있게 하는 운영체제의 기술입니다.
ex) 멀티 프로세스 예시: 크롬 브라우저의 멀티 탭
멀티 프로세스 환경에서는 하나의 부모 프로세스가 여러 자식 프로세스를 생성함으로써 다중 프로세스 구조를 형성합니다.
부모 프로세스와 자식 프로세스 모두 고유한 프로세스 ID(PID)를 가지고 있으며, 부모 프로세스는 이 PID를 통해 자식 프로세스들을 관리하고 제어할 수 있습니다.
하나의 프로세스 내에는 여러 개의 스레드가 존재할 수 있으며, 이 중 단 하나만 있는 경우를 싱글 스레드라고 하고, 두 개 이상 존재하는 경우를 멀티스레드 구조라고 합니다.
멀티 프로세스의 예로 크롬의 멀티 탭을 들었는데, 멀티 스레드의 예시로는 크롬의 단일 탭 내에서 네트워크 요청 처리, 사용자 인터페이스의 I/O 작업, 자바스크립트 이벤트 루프 관리 등과 같은 다양한 작업들이 여러 스레드에 의해 동시에 처리되는 것을 들 수 있습니다.
동기화 문제
가 발생할 수 있습니다.💡 (참고) 멀티 스레드에서 동시 접근 제어: 뮤텍스 사용
멀티 스레드 환경에서 뮤텍스는 공유 자원에 대한 동시 접근을 제어하는 역할을 합니다.
한 스레드가 특정 자원을 사용할 때 다른 스레드의 접근을 차단함으로써, 데이터의 무결성을 보장하고 Race Condition을 예방할 수 있습니다.
ref.
완전히 정복하는 프로세스 vs 스레드 개념
https://8iggy.tistory.com/178
[기술면접] 프로세스
https://girawhale.tistory.com/61
https://easy-code-yo.tistory.com/36
https://www.youtube.com/watch?v=1grtWKqTn50&t=846s
Inpa Dev 멀티 프로세스 vs 멀티 스레드 비교 완전 총정리
https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/main/OS
https://soopeach.tistory.com/252