일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Cocoapods #PrivateRepo #SpecRepo
- 스쿠버다이빙
- 시밀란
- 스플리트
- 연금저축펀드
- 크로아티아
- 라이브러리
- Device 등록
- 푸켓여행
- Gradle
- 강릉
- SwiftUI #Skeleton #데이터갱신
- 공기먹는다이버스
- xcode
- 그라나다
- 괌 자유여행
- swiftUI
- 러브스플리트
- 스페인광장
- 지팍스페인
- 스페인여행
- 리브어보드
- 아시아나
- cocoapod
- Swift #Concurrency #쓰레드
- Concurrency #Swift #Combine
- 러브자그레브
- 대한항공
- 도심공항
- 세비야
- Today
- Total
JEP's Diary
Concurrency와 쓰레드 본문
이슈
50개의 병렬작업을 하는데 측정한 시간이 꽤나 오래 걸리는 이슈를 만났다.
데이터가 50개가 있고, 이를 각각 API 콜을 해서 데이터를 구성한 다음 하나의 리스트 데이터로 구성해야 한다. 한개의 API 콜을 하는시간이 1초도 되지 않기 때문에, 50 개를 병렬로 콜 해도 1초정도 걸리겠거니를 기대했었는데, 대략 7~8초가 걸리는 것이었다.
Concurrency로 병렬작업으로 처리를 했고, 코드에도 이상이 없는 것 같은데 예상보다 오래 걸려서, 어렴풋이 쓰레드는 코어 갯수의 X2를 생성한다라고 알고있던 지식으로, 아 이건 속도를 더 높일 수 없다. 라고 결론을 지었다가.. 진짜 왜 속도가 느린건지에 대해 검토해보려한다.
ChatGPT에게 물어보았다.
질문
Concurrency에서의 쓰레드를 최대 몇개까지 만들 수 있어?
대답
Swift의 Concurrency 모델에서는 개발자가 명시적으로 쓰레드를 만들고 관리하는 것이 아니라, 시스템이 내부적으로 쓰레드를 관리하고 최적화합니다. 따라서 개발자가 직접 쓰레드를 생성하거나 제어하는 것은 아닙니다.
Concurrency 모델에서는 작업(Task)이라는 개념을 사용하여 비동기적인 코드를 구성합니다. 작업은 시스템이 자동으로 실행하는 독립적인 단위로, 작업이 실행될 때마다 시스템이 필요에 따라 적절한 수의 쓰레드를 생성하고 관리합니다. 이는 작업의 수행 상황, 우선 순위, 실행 컨텍스트 등을 고려하여 동적으로 최적화됩니다.
실제로 생성되는 쓰레드의 최대 개수는 시스템에 따라 다를 수 있습니다. Swift의 Concurrency 모델은 GCD(Grand Central Dispatch)와 같은 기존의 다중 쓰레드 라이브러리와 함께 작동하므로, GCD에서 지원하는 큐(Queue)와 스레드 풀(Thread Pool)을 활용하여 작업을 처리합니다. 따라서 시스템의 하드웨어, 운영체제, 실행 환경 등에 따라 생성되는 쓰레드의 최대 개수가 다를 수 있습니다. 개발자가 명시적으로 쓰레드를 제어하는 것이 아니라 작업을 생성하고 예약하면, 시스템이 적절한 쓰레드를 사용하여 작업을 실행하고 최적의 성능을 이끌어냅니다.
궁금했던 포인트는 대답을 안해주네 ㅜㅜ
정리
Concurrency는 스레드의 갯수를 core의 갯수와 동일하게 제한했다는 글을 발견!
역시 그랬던 거였어....
아래 글은 Swift Concurrency가 나온 이유에 대한 설명이다.
- GCD는 Thread Explosion가 발생함
- GCD 에서 sync를 활용하는 방법도 있지만 async를 쓰면 어쨌든 thread가 늘어나며 제한이 없어서 스레드가 많아지게 되면 성능 문제가 발생할 수 있다.
- Thread Explosion이 발생하면 컨텍스트 스위칭이 많아 지고 성능이 저하된다. 즉, 많은 쓰레드 블록에서 메모리 오버헤드를 발생시킬 수도 있고, 많은 컨텍스트 스위칭때문에 스케줄링 오버헤드가 발생될 수 있다.
- Thread Explosion 문제를 발생시키지 않도록 쓰레드 관리가 편한 Swift Concurrency가 나온 것
- await으로 중단 됐을때 컨텍스트 스위칭을 해서 다른 쓰레드를 불러오는 것이 아니라 같은 쓰레드에서 다음 함수를 실행한다.
- 하나의 코어가 하나의 쓰레드를 실행하도록 유지하는 것을 보장한다.
- 즉, 컨텍스트 스위칭 해서 다른 쓰레드에서 하던 작업이 하나의 쓰레드 내에서 다른 함수를 실행하는 것으로 대체된 것이다. (Continuation이라는 것을 두고 Continuation간 스위칭을 하여 작업을 처리한다.)
- Concurrency를 사용하면 쓰레드의 갯수가 CPU 코어 갯수보다 커지지 않는다.
- Concurrency Task는 선입선출이 아니라서 우선순위가 높은 Task를 먼저 실행 할 수 있다.
참고.
https://ios-development.tistory.com/1289
https://engineering.linecorp.com/ko/blog/about-swift-concurrency
'Development > 개발일지' 카테고리의 다른 글
SwiftUI에 맞는 아키텍쳐가 뭘까?(1) (0) | 2023.04.25 |
---|---|
SwiftUI의 LazyVStack의 아이템 갱신 이슈 (0) | 2023.04.25 |
시간기준 때문에 생긴 이슈 (0) | 2023.03.05 |
GitHub Copilot (0) | 2023.02.14 |
올해의 회사일의 목표, Xcode Cloud 사용해보기 (0) | 2023.02.08 |