제라스의 Swift 공부/Swift 지식

[Swift 지식] 너 동시성 프로그래밍 제대로 알아? - 개념 비교하기

Xerath(제라스) 2024. 6. 29. 18:42
728x90
반응형

서론

안녕하세요~! 오랜만에 기술 블로거 제라스로 돌아왔습니다 👋🏻🤖👋🏻

 

최근 포스팅이 상당히 뜸했는데... 이것저것 병행하다보니 많이 바빠진 것 같네요 ㅎㅎ

이번에는 조금 긴 호흡의 포스팅을 해보려고 합니다!

 

바로 Swift Concurrency인데!

솔직히 고백하자면... 작년에 정말 열심히 학습을 했는데...!

프로젝트에서 야무지게 반영을 잘 못해내는 것 같단 진단이..

포기하지마 제라스...!

사실상 '동시성 프로그래밍 포기 == iOS 포기'와도 같지 않나~~~~~~~란 생각이 듭니다... 🥲 🥲

그렇기에 이번엔 정말 지식 거지, 왕초보자로 돌아가서 제대로 된 이빨로 저작운동을 해야겠단 마음가짐으로 포스팅 여정을 떠나고자 합니다!!

 

그.전.에!!

얼레벌레 시작하는 자에게 길을 안내해준 감사한 분들...!!!

먼저, Swift에서의 '동시성 프로그래밍' 학습의 주체가 되어주신 오동나무, 날진님 두 분께 감사의 인사를 전합니다!

 

https://yagom.net/courses/%eb%8f%99%ec%8b%9c%ec%84%b1-%ed%94%84%eb%a1%9c%ea%b7%b8%eb%9e%98%eb%b0%8d-concurrency-programming/

 

동시성 프로그래밍 (Concurrency Programming) - 야곰닷넷

동시성 프로그래밍 동시성 프로그래밍(Concurrency Programming) 코스에 오신 것을 환영합니다! 이번 코스는 동시성 프로그래밍에 대한 이해를 […]

yagom.net

오동나무님의 동시성 프로그래밍 강의는 정말 이해도 쉽고 교과서 그 잡채...

 

https://medium.com/@sujinnaljin

 

naljin – Medium

Read writing from naljin on Medium.  https://github.com/sujinnaljin/TIL. Every day, naljin and thousands of other voices read, write, and share important stories on Medium.

sujinnaljin.medium.com

 

 

날진님의 차근차근 시작하는 GCD 시리즈 외 동시성 관련 포스팅은 신이야...!!

 

정말 좋은 글들이라 꼭 이 분들의 글을 읽어보심을 추천드립니다!!

 

그럼 긴 포스팅 여정 시작해보겠습니다!

코어 vs 쓰레드

먼저, 코어와 쓰레드의 개념이 있습니다.

코어

코어(Core)는 CPU에 있는 하드웨어 중 하나로 CPU 내에서 여러 연산작업들을 하는 핵심 요소입니다.

간단하게 비유하자면...'CPU'란 회사에 있는 1명의 직원으로 보면 됩니다!

이 코어는 옛날엔 CPU에 한개만 있었지만 지금은 점점점점점점점 늘어나서

현재 우리는 여러 코어를 가진 멀티 코어 CPU를 쓰고 있습니다.

즉, CPU에 여러개의 코어가 있습니다.(보통 4-16코어 등으로 다양해요!)

 

아~~그럼 코어가 많으면 일을 여러명이서 하니까 무조건 빨리 끝나겠네??

 

물론 대부분은 그렇지만...!

항상 그렇진 않아요 ㅠㅠ

 

우리가 평소 협업하는 과정을 예를 들어볼게요!

우리가 앱을 만드는데 엄청엄청 단순한 View 하나를 그려야한다고 해봅시다!

 

고작 이 쪼그마한 업무를 다같이 세세하게 나누고서 만드는게 빠를까요? 그냥 혼자서 쓱싹 만드는게 빠를까요?

답정너식 질문이지만 후자겠죠 😅😅

 

그리고 또 다른 예를 들면, 우리가 일할 수 있는 공간에 한명밖에 안 들어가지는데 두명이 온들, 10명이 온들...무슨 소용돌이..ㅠ

결국은 혼자서 그 일을 처리해야 하죠...!

 

이처럼 싱글 코어에 적합한 작업도 있을 수 있기에 코어가 많다고 반드시, 무조건, 100% 더 빠르게 작업이 끝나는 건 아닙니다!

쓰레드

먼저, 쓰레드가 2개의 개념으로 나뉘어집니다!

 

- HW에서의 쓰레드

- SW에서의 쓰레드

 

먼저, 하드웨어에서의 쓰레드부터 봅시다.

코어는 원래 '1개 코어 - 1개 쓰레드의 관계'였지만 지금은 쓰레드(Thread)가 2개의 쓰레드를 가지는 경우가 많습니다.

각 쓰레드는 각자 하나의 코어인 듯 작업을 처리합니다.

 

원래는 물리적 코어 딱 1개가 있어서 얘만 작업을 처리해왔거든요?

근데, 이젠 하이퍼스레딩/SMT(Simultaneous MultiThreading)를 통해 이와 비슷하게 동작하지만 자체적인 자원을 갖지 않고

물리적 코어의 자원을 공유받아서 작업을 처리하도록 만들 수가 있습니다. 이걸 논리적 코어라고 하고 단위는 쓰레드입니다.

이러면 1개의 코어가 2개의 코어처럼 일을 하는데, 정확히는 2개의 쓰레드를 운용하는 것이죠.

간단하게 말하면 논리적 코어는 물리적 코어에서 하이퍼스레딩으로 만들어낸 쓰레드다! 이렇게 보면 도비니다.

 

다만, 물리적 코어의 보급형 정도이기에 성능이 2배가 되는게 아니라 20-30% 정도 향상됩니다.

 

이렇듯 하드웨어에서의 쓰레드란 실제 어떤 연산작업을 처리하는 코어 내에서 일을 분리해서 작업을 하는 단위 정도로 이해하면 됩니다.


반면, 소프트웨어에서의 쓰레드는 조금 다릅니다!

여기서는 실제 작업을 하는 HW적인 요소가 아니라 개념적인 가상 쓰레드입니다.

즉, 어떤 작업을 처리한다고 생각하는 하나의 단위입니다.

실제 이 작업은 코어들, 그리고 그 내부의 HW적 쓰레드들이 알.아.서 나눠져서 처리를 할 겁니다.

그렇기에 우리는 하드웨어에서의 쓰레드는 생각하지 말고 딱 이 SW에서의 쓰레드만 신경쓰면 됩니다!

 

병렬 프로그래밍 vs 동시성 프로그래밍

병렬 프로그래밍, 동시성 프로그래밍 둘 다 정말 똑같아 보이죠...?

하지만 두 개념은 다릅니다!

 

병렬 프로그래밍어떤 하나의 동일한(혹은 유사한) 일에 대해서 여러 코어가 나눠서 작업하는 것입니다.

 

의류회사 공장을 예를 들어볼게요!

우리는 여러 택배박스들에 스티커를 붙이는 작업을 해야 합니다.

근데 이 작업을 여러 사람이 하는 겁니다!

 

동.일.한 '택배박스에 스티커 붙이기'라는 작업을요~~

 

이렇다면 서로 다른 작업들을 나눠서 코어들이 작업하는 건...? 병렬 프로그래밍이 아니죠!


반면, 동시성 프로그래밍(Concurrent Programming)하나의 코어가 여러 작업들을 동시에 처리하는 겁니다.

즉, 하나의 코어가 여러개의 쓰레드를 갖고 있잖아요?

(HW적으로는 2개지만, 여기서는 이걸 의미하는게 아니라 SW적으로 여러개를 갖고 있다는 말입니다!)

 

여러 작업들을 코어 내의 각 쓰레드가 나눠서 실행하는 겁니다.

 

이것도 예를 들어보면...!

우린 택배박스에 물건을 넣는 일, 테이프로 포장하는 일, 택배박스에 스티커를 붙이는 일...

여러 가지의 일을 혼자해야 합니다.

이때 각 일들을 동시에 하나씩 수행들을 빠르게 해서 하나의 택배를 만들죠??

이렇듯 빠르게 쓰레드를 돌면서 서로 다른 작업들을 수행하는 겁니다.

 

 

자, 그러면 가볍게 정리해보면!

병렬 프로그래밍여러개의 코어를 쓰는 방식이고, 동시성 프로그래밍여러개의 쓰레드를 사용하는 방식입니다.

직렬성 프로그래밍 vs 동시성 프로그래밍

직렬성 프로그래밍(Serial Programming)

하나의 코어에서 하나의 쓰레드 밖에 없고 이 친구 혼자서 작업들을 처리하는 방식입니다.

즉, 주변에 친구가 없고...ㅠㅠ 도와주는 다른 무리들도 없고...😭😭 그냥 혼자서 작업들을 수행해내는 거죠!

 

동시성 프로그래밍의 쓰임

일단, 딱 생각해봅시다!!

그냥 머리 비우고 생각해봤을 때,

일을 혼자하는 것보단 여럿이서 나눠서 하는게 좋잖아요?? ㅋㅋㅋㅋㅋㅋㅋ

 

지금 제가 타이핑하고 있는 이 왼손, 오른손, 심지어 여러 손가락으로 나눠서 치겠어요~~~

한 손가락으로 치면 이...ㄹ..ㅓ..ㅎ.ㄱ..ㅔ 오래 걸리니까요!

ㅌ..ㅗ...ㄷ..ㅗ독..토...ㄷ..ㅗ..ㄱ

 

이렇듯 여러개의 스레드가 일을 나눠서 하면 작업처리를 효율적으로 할 수 있습니다!

 

이걸 조금 더 깊이 얘기해보면,

우리는 UI와 관련된 작업들은 Main 쓰레드에서 수행해야 한다!라는 얘기를 정말 많이 들어왔습니다.

이건 제가 따로 포스팅을 올려두겠습니다!

 

(UI에서 실행되어야 하는 이유 포스팅 링크)

 

대신 메인 쓰레드에서 다른 연산 작업들이나 네트워킹 작업이 발생하면... 화면이 멈추고 사용자들은 앱이 버벅이거나 속된 말로 뻑갔다는 생각이 들겠죠?

 

예를 들면, 사진들을 여러 장 가져와서 현재 ScrollView에 나열한다고 합시다!

이때, 메인 쓰레드에서 이것들을 가져오는 작업을 하면...

스크롤이 엄청 버벅대다가 사진을 가져오는 속도보다 스크롤 속도가 빠르면 화면이 잠시 멈추었다가 보여주게 됩니다.

이런건 유저 입장에서 UX적으로 큰 문제로 느끼게 되죠!

 

그래서 이런 연산 작업, 네트워킹 작업은 다른 쓰레드에서 실행되어야 합니다.

다른 쓰레드?!?!?!?!

 

아하!!!!!!! 동시성 프로그래밍으로 구현해야겠구나!

 

이렇게 되는 거죠!

동기 vs 비동기

직렬성 프로그래밍 vs 동시성 프로그래밍의 차이만큼 상.당.히 중요한게...!!

동기(synchronous)와 비동기(Asynchronous) 차이를 잘 아는 겁니다!

 

우리가 직렬성 프로그래밍 vs 동시성 프로그래밍의 개념 차이가 뭐였죠...?

하나의 쓰레드에서 작업들을 수행하는 방식 vs 여러 쓰레드에서 작업들을 수행하는 방식의 차이입니다.

 

쓰레드를 하나로 하냐, 여러개에서 나눠서 하냐의 차이~~!!

 

반면, 동기, 비동기의 차이는 이 작업이 끝날 때를 기다리냐, 안 기다리냐의 차이입니다.

 

동기로 한다면 작업들이 순서대로 앞의 작업(A)이 끝나야 그 다음의 작업(B)이 수행되겠지만,

비동기로 한다면 앞의 작업(A)을 비동기로 수행 시 뒤의 작업(B)은 앞의 작업(A)을 기다리지 않고 실행됩니다.

 

마무리

이번 포스팅에선 기본적으로 알고 있어야 할 개념들로

- 병렬 vs 동시성 vs 직렬성 프로그래밍의 차이

- 동기 vs 비동기 프로그래밍의 차이

를 알아봤습니다!

 

이게 진짜 제대로 공부해놓지 않으면 헷갈리는 개념입니다...

(저도 학부생 때 엄청 헷갈려서 개념을 머리에 박아두는 데에 2년 걸림...!😅😅)

 

그럼 다음 포스팅부터는 iOS 개발에서 Swift로 동시성 프로그래밍을 구현하는 방법들과 그 과정을 깊게 정리해보겠습니다~!!

긴 포스팅 읽어주셔서 감사합니다! 

참고

https://yagom.net/courses/%eb%8f%99%ec%8b%9c%ec%84%b1-%ed%94%84%eb%a1%9c%ea%b7%b8%eb%9e%98%eb%b0%8d-concurrency-programming/

 

동시성 프로그래밍 (Concurrency Programming) - 야곰닷넷

동시성 프로그래밍 동시성 프로그래밍(Concurrency Programming) 코스에 오신 것을 환영합니다! 이번 코스는 동시성 프로그래밍에 대한 이해를 […]

yagom.net

https://medium.com/@sujinnaljin

 

naljin – Medium

Read writing from naljin on Medium.  https://github.com/sujinnaljin/TIL. Every day, naljin and thousands of other voices read, write, and share important stories on Medium.

sujinnaljin.medium.com

https://iosdevlime.tistory.com/entry/iOSCombine-CPU%EC%99%80-%EC%BD%94%EC%96%B4-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EA%B0%9C%EB%85%90

 

[iOS/Combine] CPU와 코어, 그리고 프로세스와 스레드의 개념

동기, 비동기, 동시성 프로그래밍, 스레드, 큐.. 프로그래밍을 학습하는 과정에서 느닷없이 마주치게 되는 익숙한 용어지요? 하지만, 프로그래밍을 언어(문법) ➟ 개발 프레임워크(UIKit, SwiftUI)

iosdevlime.tistory.com

https://betwe.tistory.com/entry/IT%EC%9E%A1%EC%A7%80%EC%8B%9D-%EB%AC%BC%EB%A6%AC%EC%BD%94%EC%96%B4Physical-Core%EC%99%80-%EA%B0%80%EC%83%81-%EC%BD%94%EC%96%B4Virtual-Core%EC%9D%98-%EB%B9%84%EA%B5%90%ED%91%9C

 

[IT잡지식] 물리코어(Physical Core)와 가상 코어(Virtual Core)의 비교표

물리 코어(Physical Core)와 가상 코어(Virtual Core)는 CPU의 성능과 관련된 용어입니다. 물리 코어는 하나의 CPU 칩 안에 실제로 존재하는 독립적인 프로세서 코어를 의미하며, 가상 코어는 물리 코어에

betwe.tistory.com

 


아직 꼬꼬마 개발자입니다.

더 나은 설명이나 코드가 있다면 언제든 환영입니다.

적극적인 조언과 피드백 부탁드립니다!

 

그럼 오늘도 개발 가득한 하루되세요!

- Xerath -

🤖🤖🤖🤖🤖🤖🤖

 

728x90
반응형