Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

동시성 프로그래밍 - 01 #12

Open
Brandnew-one opened this issue Jun 20, 2022 · 0 comments
Open

동시성 프로그래밍 - 01 #12

Brandnew-one opened this issue Jun 20, 2022 · 0 comments
Labels

Comments

@Brandnew-one
Copy link
Owner

Brandnew-one commented Jun 20, 2022

Concurrency

미루고 미루던 동시성 프로그래밍에 대해서 드디어 한번 자세하게 정리해보고자 한다!
강의와 블로그를 활용해서 휘발성 메모리를 가진 미래의 나를 위해 최대한 자세하고 이해하기 쉽게 풀어보려고 한다

다운로드

동시성 프로그래밍이 왜 필요힐끼?

동시성 프로그래밍이 필요한 이유는 단순하다. 동시성 프로그래밍을 이용하지 않고 메인 쓰레드에서 모든 작업을 수행하게 되면 느리다.
예를 들면 네트워크 통신을 통해 불러온 값을 테이블 뷰에 보여줄 때 스크롤을 하면 앱이 뚝뚝 끊기는 현상이다.

그럼 동시성 프로그래밍을 이용하면 위와 같은 문제를 어떻게 빠르게 처리할 수 있는걸까?
메인 쓰레드에서 모든 작업을 처리하는것은 실생활로 예를들면 아래 그림과 같다

스크린샷 2022-06-20 오후 6 58 25

불쌍한 노동자 한명만 열심히 일을 하고 있다. 나 못참아!!!

스크린샷 2022-06-20 오후 7 26 48

동시성 프로그래밍을 활용하면 위와 같이 한 노동자에게 작업이 몰리지 않고 이를 적절하게 동시에 수행할 수 있도록 작업을 분배할 수 있다

그럼 쓰레드(노동자)에게 작업을 일일이 직접 분배해야 하나요?

정말 감사하게도 우리는 직접적으로 쓰레드를 관리하지 않고, iOS에서 제공하는 대기행렬(Queue)에 보내기만 하면 된다.

스크린샷 2022-06-20 오후 8 15 53

  • GCD(=Dispatch Queue)
  • Operation Queue

iOS에서 제공하는 대기행렬은 크게 위의 두 종류이다!

우리는 작업들을 위의 큐에 넣어주면 각 큐의 특성에 맞게 OS에서 관리해준다!!

DispatchQueue.global().async {
  print("Task1")
  print("----------Task1---------")
}

사용예시를 보면
DispatchQueue(큐에 보낸다.).global()(global 이라는 큐에).async (비동기적으로){ 이하 작업을 } 으로 이해할 수 있다.

처음 공부할 때 나를 멘붕에 빠트렸던 동기/비동기 키워드가 보이는데 천천히 하나씩 풀어가보자!

동기와 비동기

놀랍게도 이전에 동기와 비동기에 대해서 간단하게 정리했던 적이 있다. 내 기억 어디간거야? 🤦

위와 같은 그림을 예제로 동기와 비동기를 이해해보자!
스크린샷 2022-06-20 오후 9 00 50

노동력 착취에 화가 나버린 메인 쓰레드가 Task1 을 큐에 보낸 상황이다.
하지만 메인 쓰레드가 해야하는 작업들(Task2, Task3, Task4)가 여전히 남아있죠?

이때 메인 쓰레드가 해야할 행동으로 올바른것은?

  • 아 몰랑 Task1이 완료될 때 까지 쉴래 (동기)
  • 어림도 없지 바로 Task2 시작 (비동기)

이게 동기와 비동기의 개념이다.

  • 동기는 메인쓰레드에서 큐로 보낸 작업이 완료될 때 까지 기다린다
  • 비동기는 메인쓰레드에서 큐로 보내고 작업 완료를 기다리지 않고 다음 작업을 시작한다.

사실 처음 공부할 때 비동기와 동기 그리고 동시와 직렬의 개념이 뒤죽박죽 섞이면서 위의 개념이 명확하게 확립되지 않았는데 이전에 우리가 기억하던 지식들을 배제하고 딱 저렇게 이해하자!

직렬과 동시 (Serial & Concurrent)

직렬과 동시는 큐의 특성에 관한것을 의미한다. 앞서 iOS에서 제공하는 큐는 크게 GCD, Operation Queue 2개로 나뉜다고 했는데 2개의 큐 모두 Serial, Concurrent로 사용할 수 있다.

Serial Queue에 여러 작업들을 보내게 되면 해당 큐는 작업들을 하나의 쓰레드에서 처리한다
Concurrent Queue에 여러 작업들을 보내게 되면 해당 큐는 작업들을 여러개의 쓰레드에서 처리한다

여기서 의문이 들 수 있다

  • 아니.. Serial Queue에 비동기적으로 여러 작업들을 처리하면 무슨 의미가 있는거야?

스크린샷 2022-06-20 오후 6 58 25

스크린샷 2022-06-20 오후 10 30 58

스크린샷 2022-06-20 오후 10 32 43

Serial Queue에 Task1,2,3를 async 하게 보냈다.
async하기 때문에 메인 쓰레드는 Task4를 바로 실행하게 될 것이고, Serial Queue는 작업들을 하나의 쓰레드에서 처리하기 때문에 파랭이 쓰레드가 큐에 있던 모든 작업들을 순차적으로 실행하게 된다.

  • 아니.. Concurrent Queue에 동기적으로 여러 작업들을 처리하면 무슨 의미가 있는거야?

스크린샷 2022-06-20 오후 6 58 25

스크린샷 2022-06-20 오후 10 39 07

스크린샷 2022-06-20 오후 10 41 05

Concurrent Queue에 Task 1,2,3를 sync하게 보냈다. Concurrent Queue에 이기 때문에 큐에 들어온 작업들은 동시적으로 여러 쓰레드에서 처리되고 sync 이기 때문에 큐에 들어갔던 작업들이 모두 완료되어야 task4가 실행된다


항상 헷갈렸던 개념을 다시 한번 정확하게 짚어 볼 수 있는 시간이였다.
Serial/Concurrent 와 Sync/Async 는 다른 개념이다!!

해당 내용은 앨런님의 강의를 듣고 이해한 내용을 정리한 글 입니다.

계속해서 정리 할 예정이고 틀리거나 부족한 부분이 있으면 언제든지 알려주세요!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant