안녕하세요! 소들입니다 :)
오늘은 쓰레드 관련해서 공부해볼 거예요!!!!
으으.. 네트워크 통신하다보면
Sync / Async
프로세스 / 쓰레드
Serial / Concurrent
Main Thread / Global Thread
등등....
이런 단어들을 많이 보게 되는데,
정확하게 개념을 이해하고 있진 못하시는 분들을 위해(나 포함)
이번 포스티팅을 통해 다 정리해보고자 합니다!!!!!!
이번엔 먼저 프로세스 / 쓰레드 부터 다뤄 봅시당 :)
모든 포스팅은 편의 말투로 합니다~!!
1. 프로세스(Process) vs 쓰레드(Thread)
자, 먼저 프로세스와 쓰레드가 무엇인지에 대해 알아볼 것임 👀
1-1. 프로세스(Process)와 멀티 프로세스(Multi Process)
프로세스(Process)
운영체제로부터 시스템 자원을 할당받는 작업의 단위
프로세스의 개념은 위와 같음을 말하는 것임!!
따라서 이 프로세스들은
각각의 독립된 메모리 영역 (Code, Data, Stack, Heap)을 각자 할당 받음!
따라서 프로세스끼리는 서로의 변수나 자료구조에 대해 절대 접근할 수 없음
만약, A 프로세스가 B 프로세스 자원 접근하려고 하면,
프로세스간 통신(IPC)를 사용해야 함(파일, 소켓 등)
멀티 프로세스(Multi Process)
하나의 프로그램을 여러 개의 프로세스로 구성하여,
각 프로세스마다 하나의 작업(Task)씩 처리하도록 하는 것
을 말함!
예를 들어 우리가 알람 어플을 사용 하면서
1초 후에 울리는 알람을 맞춘다고 해보면
알람 시간 조정 동작을 구현하는 프로세스
알람 시간이 울리기까지 계산하는 프로세스
알람이 울리는 프로세스
이런 식으로 알람이라는 하나의 프로그램에서 일어나느 여러 개의 작업을
프로세스를 여러 개 생성하여 각자 하나씩 처리하도록 해주는 것임!
먼저, 멀티 프로세싱의 장점부터 말하겠음
앞서 설명했듯이, 프로세스는 독립된 메모리 영역을 각자 할당받기 때문에,
프로세스 간 서로의 자원에 침투할 수 없음
따라서 독립된 구조이기 때문에 안정성이 높음!
A라는 프로세스에서 문제가 생긴다고 해도, B라는 프로세스 입장에선 모 어쩌라고가 되는 것임
그렇다면 단점은,
아까 알람을 예로 들었으니 알람으로 설명하자면
우리가 알람을 1초 후로 맞추면, 등록하자 마자 동시에 알람이 울려서
각각의 프로세스들이 동시에 진행되는 것처럼 보이지만,
실제로 CPU는 위 프로세스들을 빠르게 왔다 갔다하며 실행하고 있음
따라서, 프로세스를 왔다 갔다 하는 과정에서
A프로세스를 실행할 땐 A프로세스의 메모리 영역을 올리고,
B프로세스를 실행할 땐 B프로세스의 메모리 영역을 올리고
이런 작업들을 Context Switching이라고 하는데,
프로세스는 메모리가 모두 독립적으로 존재하기 때문에,
Context Switching 시 CPU의 부담도 커지고 오버헤드가 발생하게 된다는 것이 가장 큰 단점임
또, 프로세스 간 자원 공유가 어렵다는 점도 또 하나의 단점임
1-2. 쓰레드(Thread)와 멀티 쓰레드(Multi Thread)
쓰레드(Thread)
한 프로세스 내에서 동작되는 여러 실행의 흐름
쓰레드의 정의는 이럼
쓰레드는 프로세스가 아닌, 프로세스 내에서 동작되는 것이기 때문에
메모리 영역을 독립적으로 할당받지 못함!
따라서,
이런 식으로 Code, Data, Heap 영역은 공유하고 Stack 영역만 독립적으로 할당받을 수 있음!!
(Stack 영역만 별도로 가지는 이유는 Stack 영역이 LIFO라서,
Stack이 쌓이면 프로세스가 섞인 채로 순서대로 나와 흐름에 방해를 주기 때문이라 함 ;ㅁ;)
따라서 쓰레드들 끼리는 힙 영역을 공유하여 같은 자원을 접근할 수 있지만,
각자의 스택 영역은 서로 접근할 수 없음
멀티 쓰레드(Multi Thread)
하나의 프로그램을 여러 개의 쓰레드로 구성하여,
각 쓰레드마다 하나의 작업(Task)씩 처리하도록 하는 것
윈도우, 리눅스 등 많은 운영체제가 멀티 프로세싱을 지원하지만,
이 멀티 쓰레드를 기본으로 하고 있음!!
그럼 왜 멀티 프로세싱이 아닌, 멀티 쓰레드가 기본인지 장단점을 살펴보자 :)
먼저 장점부터 보자면,
쓰레드 간 Code, Data, Heap 영역을 공유하기 때문에, Context Switching이 빠름
또한 프로세스를 생성하여 자원을 할당하는 것이 아니기 때문에,
생성/종료 시간도 프로세스보다 빠름
또 프로세스 간 통신이 까다로운 반면에, 쓰레드들은 stack 영역을 제외하고
나머지 영역을 공유하기 때문에 통신 방법이 훨씬 간단함
다만 단점도 존재함
설계가 까다로움. 왜냐면 Stack영역 빼고 공유를 하기 때문에,
A쓰레드가 접근하려는 힙 영역의 자원을 B가 갑자기 접근해서 바꿔버리는 등
자원 공유의 문제가 생기기 때문(동기화 문제)
또한 독립적이지 않아, 하나의 쓰레드에서 문제가 발생 시 전체 쓰레드가 영향을 받음
또 단일 프로세스 시스템의 경우 효과를 기대하기 어렵다는데.. 이건 잘 이해가 안가서
나중에 이해하면 추가 하겠음!!
2. 정리
멀티 프로세스 | 멀티 쓰레드 | |
정의 | 하나의 프로그램을 여러 개의 프로세스로 구성하여, 각 프로세스마다 하나의 작업(Task)씩 처리하도록 하는 것 | 하나의 프로그램을 여러 개의 쓰레드로 구성하여, 각 쓰레드마다 하나의 작업(Task)씩 처리하도록 하는 것 |
생성 / 종료 시간 | 많은 시간 소요 | 적은 시간 소요 |
Context Switching | 많은 시간 소요 | 적은 시간 소요 |
자원 접근 | IPC 사용 | 공유 자원 사용 |
메모리 할당 | Code/Data/Stack/Heap 모두 독립적으로 할당 |
Code/Data/Heap 만 공유 Stack만 독립적으로 할당 |
장점 | 독립된 구조이기 때문에 안전성이 높음 |
Context Switching이 빠름 생성/종료 시간도 빠름 프로세스 간 자원 공유가 간단함 |
단점 | Context Switching 시 시간이 많이 소요되는 등 오버헤드 발생 생성/종료 시간이 오래 걸림 프로세스 간 자원 공유가 어려움 |
설계가 까다로움 동기화 문제가 있음 하나의 쓰레드에서 문제 발생 시 전체 쓰레드에 영향이 감 |
'iOS > iOS' 카테고리의 다른 글
iOS) GCD (Grand Central Dispatch) (6) | 2020.12.02 |
---|---|
iOS) Sync vs Async / Serial vs Concurrent (16) | 2020.12.01 |
iOS) 메모리 저장 방식 - Big Endian / Little Endian (1) | 2020.11.28 |
iOS) APNs :: Push Notification 동작 방식 (15) | 2020.11.24 |
iOS) APNs :: 인증서 발급받는 방법 (p.12, pem) (11) | 2020.11.23 |