Concurrency(동시성)프로그래밍에 대해서1(iOS에서의 비동기처리, GCD/Operation에 관하여, GCD/Operation에 앞서서 간단한 정의를 다룸(동기VS비동기, 직렬VS동시, 간단한 GCD/Operation소개))

2021. 11. 29. 18:15iOS/iOS

728x90
반응형
이 포스팅은 인프런의 동시성 프로그래밍 강의를 참고하여 제작하였습니다.

 

안녕하세요 bannavi입니다^ㅅ^

진짜 - ! 너무 오랜만에 포스팅을 하는것같네요 (저는 비공개로 계속 포스팅을 해오고 있긴 했지만ㅋ_ㅋ)

오늘부터는 동시성 프로그래밍에 대해 포스팅 해보려고 합니다.

 

동시성 프로그래밍 포스팅을 마칠때 즈음에는 "나 이제 GCD/Operation과 관련된건 A to Z 다 안다 다덤뵤!"

할 수 있도록.. 열심히 공부해보려고 해요.

바로 시작해보겠습니다.

 


스레드

 

스레드의 사전적인 의미는 한 프로세스 내에서 동작되는 여러 실행의 흐름을 의미합니다.

 

 

동시성 프로그래밍이 왜 필요한가요?

 

성능/ 반응성 향상과 최적화를 위해(ex. 스크롤 할때마다 버벅임 발생 방지)

(tmi. 아이폰의 화면은 16밀리 초마다 리프레싱 됩니다.)

 

스레드가 여러개 있었음에도 불구하고 우리는 지금까지 한개의 스레드에서만 일을 시켰었기 때문에 버벅였던 거에요!

일안하고 밑에 남아돌고 있는 스레드 녀석들...!

tmi. xcode 프로젝트가 켜진 상태에서 command + 7을 누르면 어떤 스레드가 일을 하고 있는지 확인 가능합니다.

아하...프로그래밍을 잘못했기때문에 한개의 스레드만 사용하고 있는모습..쓰읍.. 화면을 관리하는 스레드라면 엄청 버벅거리면서 스크롤 됐을듯..!

 

 

사실! 아래와 같이 print만 출력하는것과 같은 간단한 코드의 경우 스레드 한개만 가지고 일을 해도 버벅이지 않을 수 있겠지만..

 

아래의 tableView의 경우 이미지 하나하나를 네트워크를 통해서 다운한건데 (아래 (1)(2)(3)(4)참고)

아래의 셀들이 엄청난 일들을 하고있는것이죠!

그래서 1번 스레드가 자기가 소화하지 못할 만큼의 일들을 처리하고 있기 때문에 버벅임이 발생한 것입니다.

 

 

16밀리초마다 리프레싱 해줘야하는데 task 사이가 지금 너무 멀기때문에 버벅임 발생중..ㅠㅠ

 

 

실생활 예시) 복사집

한대의 복사기로만 처리하고 있었던 것을, 다른 복사기 위에 올려놓으면 처리할 수 있을텐데..

일머리가 부족한 점원이 하나의 복사기로만(스레드로만) 작업을 한다면..? 이럼 당연히 속도도 느리고 버벅대겠죠..

이때 소비자가(개발자가) 킹받을것은 당연함.

 

 

 

그럼 아래와 같이

어떻게 작업(task)들을 다른 스레드로(복사기로) 분산 처리할 수 있을까?

요것이 바로 동시성 프로그래밍의 핵심입니다.

정답은 작업(Task)을 "대기행렬"에 보내기만 하면 됩니다.

 

이걸 영어로 표현해보면

 

작업(Task)을 큐(Queue)에 보내기만 하면 됩니다.

 

 

아 뭐야 또 어려운 단어 나왔어 대기행렬...?

 

언제나 그렇듯 처음이라 익숙하지 않은것일 뿐일테고요! 

아래의 그림처럼 queue라는 대기행렬에 보낸다는것입니다.

우린 코드만 이제 이렇게 잘 짜주면?

 

아래의 그림처럼 iOS가 알아서 일을 분산시켜준다는것이에용!

 

아하 오케이. 나는 queue로 task를 보내기만 하면 된다 이거지?

오 재밌네요... 뭔가 제대로 공부 끝내고 제것으로 만들고 나면 프로그래밍 성능 향상이 뽝!!!! 시킬 수 있을것같아요 후후..

 

 

 

대기열에 먼저들어온 작업task들 순으로 배치가 되는데요 이를 선입선출(FIFO) 방식이라고 합니다. queue의 특징이죠.

먼저 들어온 녀석이 먼저 다른 스레드에 배치된다는 개념입니다.

(당연히 먼저 배치가 됐다고 해서 작업이 먼저 끝난다는 개념은 아님)

 

 

그럼 우리가 할일은 뭐?

 

작업을 큐로 보내는 것을 배우자.

 

 

 

다음 포스팅에서 계속됩니다^ㅅ^

reference

728x90
반응형