서문
'스레드와 메모리의 차이점을 설명해 주세요'라는 질문을 들었을 때 머리가 새하얘졌습니다. 어,, 이거 분명히 다르긴 한데 정확히 어떻게 다른 거지,,?라는 생각이 들면서 아,, CS가 부족한 밑천이 이렇게 드러나는구나라고 아쉬움이 남았습니다. 하지만 아쉬움뿐이면 또 어떻게 성장하겠어요! 이번 기회에 CS 관점에서도, iOS 관점에서도 제대로 짚고 넘어가 보려 합니다.
GPT 선생님께 여쭤보자
이런 보편적인 정의, 특징, 차이점을 알고 싶을 때 GTP 만큼 효율적인 것이 없는 것 같습니다. GPT의 내용을 인용해 자세히 살펴보겠습니다.
1. 스레드 Thread
프로세스 내에서 실행되는 작은 실행 단위.
프로세스가 할당 받은 메모리 자원을 공유하며, 독립적으로 실행 가능한 단위를 제공.
- 경량 프로세스: 스레드는 프로세스보다 가볍고 빠르게 생성 및 종료됩니다.
- 공유 메모리: 같은 프로세스 내의 스레드들은 힙(Heap)과 전역 변수(Global)를 공유합니다.
- 독립적인 실행 흐름: 각 스레드는 독립적인 호출 스택(Stack)을 가지며, 다른 스레드와 병렬로 실행됩니다.
- 멀티스레딩: 여러 스레드가 병렬로 실행되며, CPU 코어를 효율적으로 사용할 수 있습니다.
- 컨텍스트 스위칭: 여러 스레드가 실행될 때 CPU가 스레드를 전환하는데 약간의 오버헤드가 발생합니다.
여기서 벌써 문제에 맞닦뜨렸습니다. 하나를 몰라서 검색해 봤는데, 두 개 세 개를 모르는 상황이 생겨버린 것입니다. 프로세스는 뭐고,, CPU와 코어는 뭐지? 해당 개념부터 알아야 특징들을 이해할 수 있을 것 같습니다.
* Tread는 직역하면 실타래라는 뜻을 가지고 있습니다. 실행 흐름을 뜻 실처럼 표현한 건 가봐요!
2. 프로세스 Process
실행 중인 프로그램을 의미.
운영체제가 관리하는 실행 단위로, 특정 작업을 수행하기 위해 실행되고 있는 프로그램의 인스턴스.
- 독립성: 프로세스는 고유의 메모리 공간(코드, 데이터, 힙, 스택)을 가지고 있으며, 다른 프로세스와 분리됩니다.
- 운영체제의 관리 대상: 운영체제는 프로세스의 실행, 종료, 자원 할당 등을 관리합니다.
- 상태 전이: 프로세스는 생성 > 준비 > 실행 > 대기 > 종료 상태를 거칩니다.
- 멀티태스킹: 현대 운영체제는 여러 프로세스를 동시에 실행(멀티태스킹)하며, CPU 스케줄링을 통해 실행 시간을 배분합니다.
즉, 프로세스의 하위 개념으로 스레드가 있는 것으로 이해하면 될 것 같습니다.
* 하나의 프로그램은 하나 이상의 프로세스를, 하나의 프로세스는 하나 이상의 스레드를 갖습니다.(그 하나가 메인스레드!)
3. 중앙처리장치 CPU(Central Processing Unit)
컴퓨터의 핵심 장치로, 명령어를 해석하고 실행하며 컴퓨터 시스템의 연산과 제어를 담당.
소프트웨어와 하드웨어 간의 작업을 조율.
- 명령어 처리: 메모리에서 명령어를 가져오고(fetch), 해석(decode)한 뒤 실행(excute)합니다.
- 데이터 연산: 수치 계산과 논리적 비교를 수행합니다.
- 제어 및 조율: 하드웨어(메모리, I/O 장치 등)와 소프트웨어 간의 작업을 조율합니다.
말 그대로 컴퓨터의 '뇌'와 같은 것입니다.
4. 코어 Core
CPU의 구성 요소 중 하나로, 실제 연산과 처리를 담당하는 기본 단위.
- 연산 처리: 프로세서 코어는 명령어를 읽고, 계산하며, 결과를 반환하는 작업을 수행합니다.
- 병렬 처리: 멀티 코어 CPU는 여러 코어를 통해 동시에 여러 작업을 처리할 수 있습니다.
GPT의 맛깔나는 비유에 따르면 CPU는 공장, Core는 공장 내의 작업자와 같다고 합니다.(바로 이해됨)
지금까지 내용을 정리해 보자면, CPU와 Core는 하드웨어를 나타내기 때문에 개념적으로 간단히 이해하고 넘어가면 될 것이고, 프로세스는 프로그램(소프트웨어)을 나타내며, 스레드는 프로세스의 실행 단위를 나타낸다는 점을 기억하는 것이 가장 중요할 것 같습니다. 이제는 메모리를 살펴볼 차례입니다.
5. 메모리 Memory
데이터와 명령어를 저장하는 컴퓨터의 저장 공간.
프로세스와 스레드가 실행될 때 필요한 데이터를 임시로 저장.
- 계층 구조: 코드 / 데이터 / 힙 / 스택으로 이루어져 있습니다.(엘런에서 배웠던 것!)
- 휘발성: RAM은 휘발성 메모리로, 전원이 꺼지면 데이터가 사라집니다.
- 속도와 비용: RAM은 빠르지만, 용량 대비 비용이 높습니다.
- 공유와 독립성: 프로세스 간에는 메모리가 독립적이지만, 스레드는 메모리를 공유합니다.
결국에 메모리도 하드웨어를 나타내는 것으로 해석할 수 있으며, 프로세스와 스레드가 실행될 때 필요한 데이터를 임시로 저장한다는 것을 기억하는 것이 가장 중요할 것 같습니다.
Swift 관점에서의 스레드와 메모리
마지막으로 Swift의 관점에서 스레드와 메모리의 특징을 살펴보겠습니다.
1. 스레드 Thread
- Swift에서 스레드는 코드의 실행 단위.(위에서 이야기했던 정의와 같음)
- Swift는 기본적으로 메인스레드에서 UI 업데이트 및 주요 작업을 실행.
- GCD(Grand Central Dispatch), OperationQueue를 이용한 직접적인 스레드 관리.
- Swift Concurrency를 이용한 간접적인 동시성 관리.(추상화된 개념)
2. 메모리 Memory
- Swift에서 메모리는 크게 힙(Heap)과 스택(Stack)으로 나뉘어 관리.(요것도 엘런에서 배웠던 것!)
- 힙: 참조 타입(class, closure, actor)이나 동적으로 할당된 데이터 저장. (ARC를 통해 메모리 관리)
- 스택: 값 타입(struct, enum)이나 함수 호출 시 생성되는 지역 변수를 저장. (자동으로 메모리 관리)
3. 스레드와 메모리의 관계
- 각 스레드는 고유의 스택 메모리를 가짐.
- 지역 변수는 스레드의 스택에서 관리되므로 스레드 간 간섭이 없음.
- 힙 메모리는 스레드 간 공유.
- 이 때문에 여러 스레드가 동시에 힙을 수정했을 때 Data Race가 발생할 수 있음.
* 정리하면서 생각이 들었는데 아마 면접에서 물어봤었던게 스레드와 메모리의 차이가 아닌, 스레드와 프로세스의 차이였던 것 같습니다,,!
CS는 모호하고 어려워
CS는 눈에 보이지 않아 더 어려운 것 같습니다. 예전 엘런 강의를 들으면서 '코데힙스' 그림에 조금은 익숙해졌기에 그나마 수월하지 않았나 싶습니다,,, 하지만 개발자라면 이런 기본적인 CS는 꼭 알고 있어야 함을 느낍니다. 앞으로는 자신 있게 스레드와 메모리에 대해 이야기해 볼 수 있을 것 같습니다.
참고한 링크
'CS' 카테고리의 다른 글
책임과 역할, 비슷한 듯 다른 두 개념 (0) | 2025.02.03 |
---|---|
추상화와 일반화, 비슷한듯 다른 두 개념 (1) | 2025.02.02 |
테스트 더블? 두 번 테스트 하는 건가요? (0) | 2025.01.21 |