728x90
1. 스레드
1) 스레드
- 하나의 프로세스 내에서 실행되는 동작의 단위
- 각 스레드는 프로세스의 스택 메모리를 제외한 나머지영역인 코드, 데이터, 힙 영역을 공유
- 프로세스 내에서 독립적인 기능을 수행하며 이는 독립적인 함수를 호출함을 의미하며 따라서 스택메모리가 별도로 필요
- 스택 메모리가 별도로 필요하다면 스레드 별로 실행되고 있는 명령어의 위치 또한 다르므로 PC 레지스터도 각각 필요
2) 독립적인 스택 메모리
- 함수를 호출하기 위해서 인자 전달, Return Address와 함수 내 지역변수 저장 등을 위한 독립적인 스택 메모리 공간 필요
- 프로세스로부터 Stack memory 영역은 독립적으로 할당받고, Code, Data, Heap 영역은 공유
3) PC Register
- 멀티 쓰레드에서는 각각의 쓰레드마다 PC Register를 가지고 있어야 함
- 한 프로세스 내에서도 쓰레드끼리 context switch가 일어나게 되는데, PC Register에 code address가 저장되어 있어야 하기 때문
4) 프로세스 vs 스레드
- 프로세스는 운영체제로부터 자원을 할당받아 실행 중인 프로그램의 인스턴스
- 스레드는 프로세스로부터 자원을 할당받는 프로세스 내의 실행 단위
- 스레드는 다른 스레드와 스택 영역을 제외한 메모리 영역을 공유해 통신 과정을 거칠 필요가 없어 효율적
- 컨텍스트 스위칭도 캐시 메모리를 비우지 않아도 되는 스레드가 빠름
2. 멀티 스레드
1) 멀티 스레드
- 하나의 프로세스가 동시에 여러 개의 일을 수행할 수 있도록 해주는 것
- 하나의 프로세스에서(실행된 하나의 프로그램) 여러 작업을 병렬로 처리하기 위헤서 멀티 쓰레드를 사용
- 멀티 쓰레드에서는 한 프로세스 내에 여러 개의 thread
- 각 쓰레드들은 Stack 메모리를 제외한 나머지 영역(Code, Data, Heap) 영역을 공유
- ex) 유튜브 영상을 시청하면서, 좋아요 버튼을 누르는 독립적인 함수 호출
2) 멀티 프로세스와 멀티 스레드. ⭐️
- 멀티프로세스
- 문맥교환 시 멀티 프로세스의 경우 힙, 데이터, 코드 영역의 정보까지 바뀌므로 문맥교환 비용 높음
- 많은 CPU 시간과 메모리 공간을 차지하며 하나의 프로세스가 죽더라도 다른 프로세스에 영향을 주지 않음
- 메모리 구분이 필요할때 사용
- 멀티 스레드
- 문맥교환 시 스택영역의 내용만 변경되면 되므로 문맥교환 비용 낮음
- 메모리 공간과 시스템 자원 소모가 줄어듬
- 프로세스간의 통신(IPC)보다 쓰레드간의 통신 비용이 적기 때문에 통신으로 인한 오버헤드가 적음
- 자원을 공유하기 때문에 동기화 문제가 발생할 수 있고 하나의 스레드 장애가 여러 스레드의 장애로 이어질 위험 있음
- 문맥 교환이 자주일어나고 데이터공유가 빈번하다면 사용
멀티 프로세스 | 멀티 스레드 | |
메모리 구분 | 각 프로세스는 서로 다른 메모리를 사용 | 메모리의 데이터 영역과 힙 영역은 모든 쓰레드가 같이 사용 |
Context Switching |
완전 다른 프로세스를 시작해야 하므로 느림 | C 레지스터가 서로 공유하고 있는 메모리 내의 코드 영역만 왔다갔다 하면 되므로 빠름 |
안정성 | 하나의 프로세스는 다른 프로세스에 영향을 주지 않기 때문에 안정성 면에서 더 좋을 수 있음 |
다수의 쓰레드가 동시에 데이터나,힙 영역의 메모리에 접근하게 되면 동기화 문제가 발생할 수 있음 하나의 쓰레드 장애가 전체 쓰레드 장애를 초래할 수 있어 안정성이 떨어질 수 있음 |
더보기
참고
728x90