조금은 당돌한 제목으로 시작하는 플러터의 동시성에 대한 글
이 글은 수업 중 강사님의 말로 시작됐다..
flutter는 단일스레드를 원칙으로해요
일반개발자가 스레드 건드리는 것보단 컴퓨터한테 맡기는 걸 더 효율적으로 보는거야
... 네에~?~?~?!!! 메모리 관리는 개발자의 꽃. 아니었나요?
iOS는 기본적으로 UI작업을 메인스레드에서만 진행한다. 오래걸리는 네트워킹 및 등등등 많은 작업들이 메인스레드에 추가되게되면,
메인스레드가 스파이크를 찍어 cpu사용량을 110%를 찍을때가 있다. 이러면 느려져서 디버깅을 통해 앱이 왜 느려졌는지, 어디서 느려졌는지 파악하고, 만약 메인스레드에 너무 몰려있는게 원인이 될시에 개발자들은 작업들을 큐로 분산시켜 메인스레드가 하는 일을 줄여줘야한다 .
Swift는 GCD라는 효율적인 툴도 제공한다. 개발자가 이 작업 큐에 작업들을 넣어주면 이 GCD라는 도구가 알아서 멀티스레딩과 동시성 처리를 간편하게 만들어서 진행해준다.
iOS에서 Grand Central Dispatch(GCD)는 멀티스레딩과 동시성 처리를 간편하게 할 수 있도록 도와주는 강력한 도구입니다. GCD는 대부분의 복잡한 작업을 추상화해주지만, 개발자는 여전히 일부 중요한 부분을 직접 관리해야 합니다. GCD를 사용할 때 개발자가 직접 관리해야 하는 주요 요소들을 살펴보겠습니다.
작업 큐 선택
GCD에서는 작업을 수행할 큐를 선택해야 합니다. 작업 큐는 크게 두 가지로 나눌 수 있습니다:
- Serial Queue (직렬 큐): 작업을 하나씩 순서대로 실행합니다.
- Concurrent Queue (병렬 큐): 작업을 병렬로 실행합니다. 여러 작업이 동시에 실행될 수 있습니다.
GCD는 전역적으로 사용할 수 있는 몇 가지 기본 큐를 제공하며, 필요에 따라 개발자가 직접 큐를 생성할 수도 있습니다.
- Main Queue: 메인 스레드에서 실행되는 직렬 큐입니다. UI 업데이트는 반드시 이 큐에서 실행되어야 합니다.
- Global Queue: 시스템이 제공하는 병렬 큐로, QoS(Quality of Service)에 따라 다양한 우선순위를 가질 수 있습니다.
swift에서는 concurrency와 Parallelism(병렬성)은 거의 같이 가는 개념이었다. 비동기 작업으로 '동시성'을 구현할거면 '다른 스레드'에서 동시에 실행되는게(=병렬) 당연한거 아님? 의 생각이었다.
개념을 이렇게 정리해놓기도 했다.
그치만 flutter에서는 완전히 달랐고
일단 단일코어의 개념을 사용한다
작업이 3개가 있다고 가정하면
task 1 -> 그냥 일반 계산작업 (동기)
task 2 -> Networking 작업 (비동기)
task 3 -> 그냥 일반 비동기 작업 (비동기)
이렇게 진행되는거다
task2, task3 이거 병렬아님? 이라고 생각 할 수 있지만 이건 동시성(concurrency)일뿐이지 병렬은 아니고,
얘를 까보면
task2가 cpu의 5%만 사용하게 된다..그러면 task3이 남은 cpu의 점유율을 차지하며 실행되는거다!!
Flutter에서 말하는 동시성의 개념을 다시한번 살펴보면
동시성(Concurrency)은 컴퓨터 과학에서 여러 작업이 겹치면서 실행되는 상황을 설명하는 개념입니다. 이는 반드시 모든 작업이 동시에 실행된다는 것을 의미하지는 않지만, 시스템이 여러 작업을 겹쳐서 처리하는 것을 의미합니다.
이거였다.
동시성의 개념을 그동안 병렬작업과 똑같이 보고 있어서 혼동이 온듯했다
그치만 다르다
어떻게 다른지 개념적으로 짚어보자
동시성 (Concurrency)
동시성은 여러 작업이 논리적으로 동시에 진행되는 것을 의미함.
한 작업이 실행되는 동안 다른 작업이 멈추거나 대기하는 방식으로, 단일 프로세서에서도 여러 작업이 동시에 실행되는 것처럼 보이게 할 수 있음.
특징
- 단일 CPU에서도 구현 가능함.
- 작업들이 시간 분할을 통해 진행되며, 실제로는 번갈아가면서 처리됨.
- 여러 작업이 동시에 진척되고 있는 것처럼 보이지만, 실제로는 한 번에 하나의 작업만 CPU에서 실행됨.
병렬성 (Parallelism)
병렬성은 여러 작업이 물리적으로 동시에 실행되는 것을 의미함.
여러 개의 CPU 코어 또는 프로세서가 각각 다른 작업을 동시에 수행함.
특징
- 다중 CPU나 다중 코어 환경에서만 가능함.
- 작업들이 실제로 동시에 실행됨.
- 높은 성능을 요구하는 작업에 사용되며, 작업이 동시에 완료될 수 있음.
으로 요약해 볼 수 있겠다.
즉 동시성은 여러 작업이 동시에 진행되는 것처럼 보이도록 스케줄링하는 것이고 병렬성은 여러 작업이 실제로 다중코어를 통해 동시에 실행되는 것인거다.
'Flutter > Flutter' 카테고리의 다른 글
mainColor를 const로 고정해주고 싶었을 뿐인데 (0) | 2024.08.30 |
---|---|
위젯 만들 때 마다 계속 나오는 @override와 super.key는 뭐지? (2) | 2024.08.26 |
왜 자꾸 const를 쓰라고 하는거지? (0) | 2024.08.26 |
1. Postman 사용해보기 (0) | 2024.08.21 |
Flutter/Dart 기본 개념 파악하기 (그니까 이게 뭔데) (0) | 2024.07.30 |