2024. 2. 5. 20:02ㆍ코틀린
우와ㅏㅏ 이제 마지막 단원이다 ㅎㅎㅎ
근데 이게 끝이 아니고 복습 다시 하고 추가적으로 학습 할 필요가 씁,, ㅎㅎ
그래도 오늘은 오늘대로 최선을 다하자!
동시성 프로그래밍
동기적(synchronous) 수행
순서대로 작업을 수행하여 하나의 루틴을 완료한 후 다른 루틴을 실행하는 방식으로, 다양한 기능이 한꺼번에 일어나는 다중 실행 환경에서는 성능상의 제약이 발생 할 수 있다. 예를 들어, UI나 데이터 다운로드를 동시에 대응 하는 경우를 볼 수 있다.
비동기적(asynchronous) 수행
다양한 기능을 동시에 수행할 수 있는 방식으로 전통적인 스레드를 이용하거나 RxJava,Reactive와 같은 서드파티(third-party) 라이브러리에서 제공한다. 특히 코틀린에서는 코루틴(coroutines)을 기본으로 제공한다.
앞서 코루틴에 대해 정리를 해보았지만 다시 한번 정리를 해보려고 한다!
코루틴은?
하나의 개별적인 작업은 루틴(routine)이라고 불리는데, 여러 개의 루틴들이 협력(co)한다는 뜻으로 만들어진 합성어다.
코틀린의 코루틴을 사용하면 논블로킹(non-blocking) 또는 비동기 코드를 마치 일반적인 동기 코드처럼 쉽게 작성하면서 비동기 효과를 낼 수 있다고 한다. 스레드처럼 분리된 코드가 아닌 순차적인 코드처럼 쉽게 작성된다.
블로킹
자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다가 본인의 작업을 시작한다.
시간의 순서대로 표가 되어 있고, A가 먼저 시작하고 나서 다른 업무가 시작되고 종료될 때까지 Blocking이 된다. 아래의 업무를 하고 있는 것은 후 순위인 B에 옮겨갈 수 있다. 이유는 운영체제의 의해서 호출시켜서 다른 태스크를 올려서 실행한다. 처리가 완전히 완료하면 A는 다시 작동하고 B는 다시 멈추게 된다. A의 모든 작업이 완료하면 B는 다시 깨어나서 다시 작업을 마무리 한다.
논블로킹
다른 주체의 직업에 관련 없이 본인의 직업을 시작하는 것을 뜻한다.
A가 실행중일때, 특정 IO 작업이 일어나서 더이상 할일을 못하는 경우, 그 일과는 별도로 운영체제가 다시 되돌려준다.
그 후 다른 일을 해도 되는 메시지를 받고 다른 루틴을 실행할 수 있어서 비교적 빠르게 수행할 수 있다.
아래의 업무가 다 처리가 되면 callback(특정 이벤트가 완성되면 호출되는 function) 루틴으로 돌아오면 이어서 처리하면 된다. OS스케줄러에 따라 제어가 이동하는 동시성처리도 이루어진다.
블로킹 방식은 구현하기 쉽고 직관적이다. 하지만 단점으로는 I/O 작업 등 오래 걸리는 연산 중에 CPU가 유휴 상태가 되어 리소스 활용도가 낮아질 수 있다. 또한 제어권을 넘기고 제어권을 다시 돌려받을 때까지 기다렸다가 돌려받고 동작을 시작한다. 예를 들어 주유소에 한 주유구만 있다고 생각하면 된다.
논블로킹 방식은 이런 문제를 해결하며 여러 요청을 동시에 처리할 수 있어 효율적인 경우가 많다. 그러나 비동기 로직 처리와 에러 핸들링 등 복잡성 증가라는 단점도 가지고 있다. 또한 제어권을 넘기지 않고 동작을 한다.
예를 들어 카페로, 한 손님은 주문받고 주문벨을 받으면 뒤에 있는 사람은 기다리지 않아도 주문이 바로 가능한 것을 들 수 있다.
태스크(task) 개념
보통 태스크는 큰 실행 단위인 프로세스(process)나 좀 더 작은 실행 단위인 스레드(thread)로 생각 할 수 있다.
프로세스는 실행되는 메모리, 스택, 열린 파일 등을 모두 포함하기 때문에 프로세스 간 문맥 교환(context-switching)을 하는데 비용이 크다. 반면에 스레드는 자신의 스택만 독립적으로 가지고 나머지는 대부분 공유하므로 문맥 교환 비용이 낮아 프로그램에서 많이 사용하지만 여러 개의 스레드를 구성 할 경우 코드가 복잡하다는 단점이 있다.
문맥 교환(context-switching)
하나의 프로세스나 스레드가 CPU를 사용하고 있는 상태에서 다른 프로세스나 스레드가 CPU를 사용하도록 하기 위해, 이전의 프로세스의 상태(문맥)을 보관하고 새로운 프로세스의 상태를 적재하는 과정이다.
또한 멀티태스킹(=멀티 프로세싱)을 가능하도록 해준다. 이 중에는 다른 작업을 할 수 없는데, 이러한 시간을 오버헤드라고 할 수 있다.
오버헤드를 해결하는 방안으로는 세 가지가 있는데,
- 문맥 교환이 자주 발생하지 않도록 다중 프로그래밍의 정도를 낮춘다.
- 스택 중심의 장비에서는 Stack 포인터 레지스터를 변경하여 프로세스 간 문맥 교환을 수행한다.
- 스레드(Thread)를 이용하여 문맥 교환 부하를 최소화시킨다.
자 이제,, 코ㅎ루틴 할 차례 쿨럭,, ㅎㅎ 이전에도 젤 어렵다고 생각했던거지만... 잘 해보자,, 후아ㅏㅏ후아ㅏ
계속 하다보면 제대로 이해될 날이 언젠가 오겠지,, 아ㅏ 그날이여~
'코틀린' 카테고리의 다른 글
TIL 20240208 - 코루틴(coroutine) ? (2) (0) | 2024.02.09 |
---|---|
TIL 20240207 - 코루틴(coroutine) ? (1) (0) | 2024.02.07 |
TIL 20240204 - 컬렉션의 확장 함수 (0) | 2024.02.04 |
TIL 20240202 - Set과 Map (0) | 2024.02.02 |
TIL 20240202 - 컬렉션 (0) | 2024.02.02 |