[코루틴에 관한 정리] 1. 프로세스와 컨텍스트 스위칭, 병렬성 프로그래밍

5
post-thumbnail

최근에 한분과 코루틴에 대해서 얘기를 나눴었습니다.
자신은 코루틴에 대해 공부했다고 자신있게 말했습니다.

"어 진짜요? 그럼 코루틴에 대해 좀 설명해 주실수 있나요?"

코루틴은 비동기 프로그래밍이래

코루틴은 Light-Weight Thread 래

코루틴은 Context-switching이 안일어난대

코루틴은 쓰레드보다 더 좋대!

틀린말은 아니었습니다.

하지만 Deep하게 들어가보니 말을 못했습니다.(그게 저였습니다 하하하하 🥰🥰 <3 지금부터.. 다시 공부해야죠 )

겉핥기 식으로 트렌드한 기술을 다루는것은 위험부담이 큽니다.

그래서 최소한 기존의 기술과 뭐가 다른지는 알고 가는게 좋을것같아 코루틴에 대해 정리 해봤습니다.
코루틴을 정리하기에 앞서, 설명하고 넘어가야하는게 있습니다.


프로세스(Process)와 쓰레드

프로그램은 단순한 데이터 쪼가리입니다.
메모리에 올라가있지 않은 정적인 상태를 의미하죠.

이 프로그램을 실행,즉 메모리에 올라가게되는순간을 우리는 프로세스라고 명칭합니다.


출처 : raejoonee/프로세스와-스레드의-차이

프로세스의 구조

프로세스는 실행파일을 일고, 내부적으로 여러개의 구역으로 나누어서 관리를 합니다. 이것을 세그 먼트라고합니다.
각각 Code, Data, Stack, Heap으로 불리는데, 독립된 메모리영역이기 때문에 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없습니다.

과거의 프로세스는 위와같이 프로세스 하나만을 사용해 프로그래밍이 되었다고 합니다.
하지만 프로그램 규모가 커짐에따라, 단순하게 하나의 프로세스 만으로 처리하기 어려워졌습니다.
그래서 더 작은 실행 단위가 필요하게 되었는데 그것이 Thread입니다.

Thread는 같은 프로세스 내의 쓰레드들은 같은 메모리 영역과 자원(Heap,Static,Code)을 공유받고,
독립된 stack(지역변수와 함수 리턴 주소)을 물려받습니다.

멀티 프로세스와 멀티 스레드의 차이?

멀티 프로세스의 경우 프로세스 하나가 문제가 발생할때 해당 프로세스 하나만 죽기 때문에
다른 프로세스에 전이되지않지만(쓰레드일 경우, 프로세스에 전파가 된다.) 독립된 메모리 영역를 할당 받았기 때문에 변수를 공유 할수 없습니다.
물론 장점도 있으니 더욱 자세한 내용은 프로세서와 쓰레드의 차이에서 읽기를 바랍니다.


1개의 프로세스에는 무조건 하나의 Thread를 갖는다.🥰🥰

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

1. 병렬성 프로그래밍

자 이제, 쓰레드에 대해서 알아봤으니 조금 더 Deep하게 들어가봅시다!

위의 사진과 같이 Thread가 많은경우가 있는데, 이것을 멀티 쓰레드(multi thread)라고 말합니다.

일반적으로, 코어 한개당 한개의 쓰레드를 만들수가 있다고 하는데요.
"야 우리집 컴퓨터는 쿼드코어야! 코어가 4개야!"했던 그 코어가 맞습니다.
듀얼코어는 총 2개의 쓰레드를, 쿼드코어는 총 4개의 쓰레드를 가질수 있습니다.
10000개의 일을 5000개씩 배분해서 작업할수있습니다.

이것을 병렬성프로그래밍을 의미하는데, 반드시 병렬성프로그래밍이 이루어지려면 멀티코어여야 합니다.

병렬
병렬성 프로그래밍은 최소 2개의 코어가 필요합니다.
단순하게 코어가 많다고 병렬성 프로그래밍이 작동하지않습니다.
병렬성 프로그래밍을 만족시키려면, 10000개의 일이 있다고 할때, 프로그램을 설계시 코어의 수만큼 배분해서 작업하게끔 프로그래밍이 되어야합니다.

2. 동시성 프로그래밍


"병렬로 생각하기는 쉽지만 프로그래밍은 그렇게 단순하지 않다."
버그가 일어날 확률이 높기때문에 병렬성 프로그래밍은 언제나 어려운 과제이다.

하지만 병렬성 프로그래밍에는 문제가 하나 있습니다.

만약 쓰레드가 코어의 숫자의 이상이라면 어떤일이 일어날까요?

그럴때 우리는 동시처리가 일어난다고 얘기합니다.

코어 하나에 두개의 쓰레드가 번갈아 작업하는것이죠.

이처럼 A Thread에서 B Thread로 옮기는것을 Context Switching이라고 합니다.

Context Switching에서 좀더 자세히 알고싶어!


쓰레드 전환시, 해당 Context(레지스터, 커널 스텍, 사용자스텍과 같은 Thread에 들어있는 정보를 말합니다)를 저장하고, 다른 Thread의 Context를 불러오는 작업으로 설명할수 있습니다.

사실 따지고보면 동시에 라는 말은 병렬성과 어울립니다.
그리고 하나의 코어에서는 두개의 작업을 번갈아 하는것이기때문에 성능에서는 병렬성 프로그래밍보다 떨어질지도 모르죠.

하지만 병렬성은 자원분배에 스트레스를 겪기도합니다.(병렬성 프로그래밍은 힘든 일이다)
핸드폰 컴퓨터 기기 성능이 상향 평준화 되었기때문에,고성능 작업이 필요한 네이티브 안드로이드(NDK)나 고사양 게임에 쓰인다고 합니다.

그래서 병렬이 되는 환상(동시성)을 보여주고자 한다면 동시성 프로그래밍을, 하드웨어를 쥐어 짜내야 한다면 병렬성 프로그래밍을 선택하도록 합시다.

결국 중요한 얘기는요.. NDK 안드로이드 개발자가 아니면 병렬성 프로그래밍은 사용하지 않는다는 말씀!!

결국 주절주절 설명한건 안드로이드에서 쓰이지 않습니다.
안드로이드 개발자한테는 UI(메인)스레드와 Worker쓰레드로 동작하고, 동시성 프로그래밍으로 구현되기 때문입니다.
하지만 기본 개념은 언제나 필수인만큼, 기본 개념을 숙지해 킹왕짱 개발자가 되어봅시다.

너도 그렇고 나도 그렇고

다음은 코루틴은 무엇이고 어떻게 작동하는지에 대해 설명하겠습니다.


profile
쉽게 가르칠수 있도록 노력하자

0개의 댓글