-
[iOS] - GCD를 알아야하는 이유(1/4)iOS/iOS 2024. 3. 16. 14:13728x90반응형
오늘은 최근에 했던 컴퓨터구조 스터디를 기반으로 포스팅을 해보겠다.
스터디의 내용은 메인스레드에 관한 내용이였고, 그중 swift에서 사용하는 GCD를 자세하게 공부했다.
자 한번 가보자
메인스레드란?
프로그램이 시작될때 기본적으로 실행되는 스레드이다.
우리가 작성한 코드는 빌드되어 앱에서 실행되고, 앱의 전체적인 생명주기 제어와 여러 이벤트를 실행시키는 역할을 한다.
iOS에선 메인스레드는 사용자의 UI를 처리하거나 입력을 받는 등의 처리는 모두 메인스레드에서 진행되는데, 그 이유는 일관성을 유지하기 위해서라고 생각한다. 만약 여러 스레드에서 동시에 UI에 관한 작업이 실행될 경우 각 컴포넌트 혹은 그보다 더 작은 단위로 따로따로 작동해 시각적인 혼란이 올 것이다.
간혹 코드를 짜다보면

이런 경고가 뜰 때가 있는데, 이것은 메인스레드에서 뷰의 업데이트 도중에 데이터를 변경시키려 할 때 발생하는 것이다.
이런 경고가 뜰 경우 작동시키면 원치않는 이벤트가 발생할 수 있다.
메인스레드 외에도 스레드가 존재할까?
당연하다. 애초에 스레드가 메인스레드 밖에 없을 경우 '메인'이라는 말도 붙이 않았을 것이다.
한 스레드에서 모든일을 처리할 경우, 컴퓨터 자원을 효율적으로 사용하기 힘들기 때문에, 특정 작업을 실행하기 위해 CPU에서 스레드를 생성해준다.
여기서 말하는 '한 스레드'는 메인스레드를 말하는 것이다. 사실 CPU라는 단어보다 우리는 코어라는 개념에 집중해서 이해해야 하는데, 이건 다른 포스팅에서 자세하게 설명하겠다. 한가지 중요한 것이 있는데, 한 코어당 한개의 스레드만 실행할 수 있다.
한 코어당 스레드를 하나밖에 동작시키지 못한다면, 멀티 스레딩은 어떻게 가능한거지? 이런생각이 들 수 있다. 이것은 밑에서도 설명을 할것이고, 따로 포스팅을 하겠다.(컴퓨터 구조 카테고리에서..)
스레드는 자동으로 생성이 되는것이 아닌 개발자에 의해서 생성 및 관리가 이루어지기 때문에, 이를 관리하는 방법을 개발자가 알아야한다.
여기서 말하는 스레드는 메인스레드가 아니다. 아까도 말했듯이 기본적으로 프로그램이 실행되면 모든 작업은 메인스레드에서 작동한다. 그것을 다른스레드로 옮기는 작업이 필요하고, 그것을 context switch라고 부른다.
스레드의 실행 방식
혹시 이 글을 보는 사람이 iOS개발자가 아니라면, 개념만 이해하고 각자만의 방식을 찾길 바란다. 하지만 난 swift를 예시로 들겠다.
(ㅈㄴ 카리스마 있어..)앱의 생명주기는 사용자에게 보여지는 UI를 처리하는 메인스레드와 다른 작업을 도와주는 그외의 스레드가 존재할 것이다. 위에서도 언급했듯이 개발자가 직접 메인스레드에서 다른 스레드로 보내는 작업을 할텐데, 그 이유는 메인스레드에서 모든 일을 처리하게 될 경우 야기되는 문제가 몇개 있기 때문이다.

위와 같은 작업이 있다고 하자.
현재 task1, task2, task3, task4를 모두 메인스레드에서 처리하고 있다. 근데 만약 적게는 1초 많게 4초가 걸리는 작업들이 쌓여있다고 치자. 우리에겐 짧은 시간이지만, 컴퓨터에게는 매우 긴시간이다. (참고로 패킷하나가 미국과 네덜란드를 왕복하는 데 걸리는 시간은 0.15초라고 한다.)
이렇게 긴 시간동안 메인스레드는 원래 본인이 해야하는 UI업데이트를 못하는 것이다.
그럼 이제 4초라는 시간이 얼마나 길지 모두 느껴질 것이다. 그리고 메인스레드는 저렇게 바빠죽겠는데, 나머지 스레드는 놀고 있다. 당연히 이것은 자원을 효율적으로 활용하지 못하는 것이 된다.
자 이것들을 어떻게 해결할까? 그래서 우리는 GCD를 사용한다.
GCD에 대한 내용이 다룰게 너무 많아 조금씩 나누기로 했다.. 지금은
다음 포스팅
[Swift] - GCD에 대해서(2/4)
이전 포스팅을 읽고 읽어주길 바란다. https://quarang.tistory.com/71 [Swift] - GCD를 알아야하는 이유(1/4) 오늘은 최근에 했던 컴퓨터구조 스터디를 기반으로 포스팅을 해보겠다. 스터디의 내용은 메인스
quarang.tistory.com
'iOS > iOS' 카테고리의 다른 글
[iOS] - 비동기와 동기(3/4) (1) 2024.03.16 [iOS] - GCD에 대해서(2/4) (1) 2024.03.16 [iOS] - Swift에 대하여(Feat. UIkit,SwiftUI) (0) 2024.01.09 [iOS] - URLSession VS Alamofire (1) 2023.12.07 [iOS] - Swift Package Manager 생성 및 배포 (0) 2023.11.28