원댓글: 비동기는 코루틴으로 구현하는거고 쓰레드랑은 다름
댓글 작성자가 주장하는 내용이 무엇인지 잘 보이지 않는다.
비동기를 구현하는 방법이 코루틴이라 유일하다 말하고 싶은건가.
비동기와 쓰레드는 무엇이 다르다고 말하고 싶은건가.
그래서 심심한김에 내가 아는 내용들을 깃갤에 공유해보자.
요즘은 비동기란 단어가 너무 자주 사용되지만 그 모티브는 비동기 "IO"에서 왔다.
여기서 IO란 스토리지에서 데이터를 가져오는걸 얘기한다.
동기 IO를 생각해보자
사용자 앱은 커널에 IO 요청을 보내면 커널이 앱을 재우고 디스크에 데이터를 요청한다.
디스크가 데이터를 로드했다면 인터럽트를 보내고 커널은 앱을 다시 깨운다.
앱을 왜 컨텍스트 스위칭을 하면서까지 재워야할까.
데이터를 가져오는건 본질적으로 디스크가 하는거지 CPU가 하는게 아니기 때문이다. (ex. DMA)
하지만 데이터를 가져오는건 너무나 느리기 때문에
잠시 코드 흐름을 멈추고, 다른 일을 하다, 다시 코드를 실행하게 해주는 컨텍스트 스위칭이 필요하다.
비동기 IO는 이걸 개선해보자고 나온 기술이다.
데이터가 오는동안 날 멈추지 말고 내 일을 계속 하게 해달라고 요청하는 기술인거다.
근데 문제점이 있다.
데이터를 다 가져왔다는걸 어떻게 알 수 있을까.
동기 IO에선 고민할 필요가 없는 문제였다.
그냥 함수의 반환으로 주면 됐기 때문이다.
하지만 비동기 IO 코드에선 데이터가 다 로드됐을 시점엔 이미 다른 코드를 실행중이기 때문에
실행중인 코드를 갑자기 정지시키고 데이터처리를 하는 코드를 실행할 수가 없다.
자바스크립트는 이 문제를 단순하게 해결했다.
이벤트루프에 데이터가 왔다고 알림을 넣어주고
함수가 끝날때마다(콜스택이 비어있을때마다) 이벤트루프를 확인해서
알림이 있다면 콜백 코드를 실행한다.
즉 자바스크립트의 함수는 콜스택이 빌 때마다 일시정지 될 수 있다.
이 구조는 단순한만큼 멀티코어를 활용하기 어려운 단점을 가진다.
조금만 생각해봐도 단일 이벤트루프 객체에 여러 쓰레드가 알림을 가져가려하면 경쟁상태 문제가 생긴다는걸 알 수 있다.
좀 더 멀티코어 친화적인 방법을 고려해보자.
쓰레드 풀을 관리하는 디스패처가 있고 데이터가 도착하면 놀고있는 쓰레드에게 데이터를 처리하도록 던져주면 될거같다.
하지만 모든 쓰레드가 일을 하고 있으면 어떻게 할까
그래서 코루틴을 사용하는거다.
함수 실행 중에 일시 정지를 하고, 데이터를 처리한 후, 일시정지된 함수를 재개시키면 된다.
하지만 아까 분명 코드를 갑자기 정지시킬 수 없다고 했었는데 어떻게 가능할까
그래서 코루틴엔 두 종류가 있다.
우선 협력형 멀티태스크를 사용하는 코루틴부터 보자.
내가 어떤 위치에서 코드를 정지할 수 있는지 코드상에 다 표현하는것이다.
코틀린에선 suspend 함수를 호출하는 위치는 모두 일시정지가 가능한 지점이다.
이 방식의 문제점은 함수가 일시정지를 지원하지 않으면 함수가 끝날때까지 계속 대기해야한다.
이런 코루틴을 일반적으로 스택리스 코루틴이라 부른다.
고랭의 고루틴은 이렇지 않는다.
고랭의 고루틴은 자신만의 콜스택을 가지고 있기 때문에
함수의 어떤 위치에서든 현재 실행 상태를 저장하고 일시정지 시킬 수 있다.
그래서 데이터가 오면 그 즉시 기존 코드를 정지시키고 데이터 처리를 할 수 있다.
이런 코루틴을 스택풀 코루틴이라 부른다.
마치 쓰레드와 비슷하지 않는가? 맞다.
쓰레드도 개념적으로 보면 스택풀 코루틴으로 볼 수 있다.
여기까지 설명하고 원댓글을 다시 한번 살펴보자.
비동기는 코루틴으로 구현하는건가? 아니다. 여러가지 구현 방법 중 하나 일 뿐이다.
비동기는 쓰레드와 다른가? 애초에 비교 대상이 아니다.
댓글 작성자가 주장하는 내용이 무엇인지 잘 보이지 않는다.
비동기를 구현하는 방법이 코루틴이라 유일하다 말하고 싶은건가.
비동기와 쓰레드는 무엇이 다르다고 말하고 싶은건가.
그래서 심심한김에 내가 아는 내용들을 깃갤에 공유해보자.
요즘은 비동기란 단어가 너무 자주 사용되지만 그 모티브는 비동기 "IO"에서 왔다.
여기서 IO란 스토리지에서 데이터를 가져오는걸 얘기한다.
동기 IO를 생각해보자
사용자 앱은 커널에 IO 요청을 보내면 커널이 앱을 재우고 디스크에 데이터를 요청한다.
디스크가 데이터를 로드했다면 인터럽트를 보내고 커널은 앱을 다시 깨운다.
앱을 왜 컨텍스트 스위칭을 하면서까지 재워야할까.
데이터를 가져오는건 본질적으로 디스크가 하는거지 CPU가 하는게 아니기 때문이다. (ex. DMA)
하지만 데이터를 가져오는건 너무나 느리기 때문에
잠시 코드 흐름을 멈추고, 다른 일을 하다, 다시 코드를 실행하게 해주는 컨텍스트 스위칭이 필요하다.
비동기 IO는 이걸 개선해보자고 나온 기술이다.
데이터가 오는동안 날 멈추지 말고 내 일을 계속 하게 해달라고 요청하는 기술인거다.
근데 문제점이 있다.
데이터를 다 가져왔다는걸 어떻게 알 수 있을까.
동기 IO에선 고민할 필요가 없는 문제였다.
그냥 함수의 반환으로 주면 됐기 때문이다.
하지만 비동기 IO 코드에선 데이터가 다 로드됐을 시점엔 이미 다른 코드를 실행중이기 때문에
실행중인 코드를 갑자기 정지시키고 데이터처리를 하는 코드를 실행할 수가 없다.
자바스크립트는 이 문제를 단순하게 해결했다.
이벤트루프에 데이터가 왔다고 알림을 넣어주고
함수가 끝날때마다(콜스택이 비어있을때마다) 이벤트루프를 확인해서
알림이 있다면 콜백 코드를 실행한다.
즉 자바스크립트의 함수는 콜스택이 빌 때마다 일시정지 될 수 있다.
이 구조는 단순한만큼 멀티코어를 활용하기 어려운 단점을 가진다.
조금만 생각해봐도 단일 이벤트루프 객체에 여러 쓰레드가 알림을 가져가려하면 경쟁상태 문제가 생긴다는걸 알 수 있다.
좀 더 멀티코어 친화적인 방법을 고려해보자.
쓰레드 풀을 관리하는 디스패처가 있고 데이터가 도착하면 놀고있는 쓰레드에게 데이터를 처리하도록 던져주면 될거같다.
하지만 모든 쓰레드가 일을 하고 있으면 어떻게 할까
그래서 코루틴을 사용하는거다.
함수 실행 중에 일시 정지를 하고, 데이터를 처리한 후, 일시정지된 함수를 재개시키면 된다.
하지만 아까 분명 코드를 갑자기 정지시킬 수 없다고 했었는데 어떻게 가능할까
그래서 코루틴엔 두 종류가 있다.
우선 협력형 멀티태스크를 사용하는 코루틴부터 보자.
내가 어떤 위치에서 코드를 정지할 수 있는지 코드상에 다 표현하는것이다.
코틀린에선 suspend 함수를 호출하는 위치는 모두 일시정지가 가능한 지점이다.
이 방식의 문제점은 함수가 일시정지를 지원하지 않으면 함수가 끝날때까지 계속 대기해야한다.
이런 코루틴을 일반적으로 스택리스 코루틴이라 부른다.
고랭의 고루틴은 이렇지 않는다.
고랭의 고루틴은 자신만의 콜스택을 가지고 있기 때문에
함수의 어떤 위치에서든 현재 실행 상태를 저장하고 일시정지 시킬 수 있다.
그래서 데이터가 오면 그 즉시 기존 코드를 정지시키고 데이터 처리를 할 수 있다.
이런 코루틴을 스택풀 코루틴이라 부른다.
마치 쓰레드와 비슷하지 않는가? 맞다.
쓰레드도 개념적으로 보면 스택풀 코루틴으로 볼 수 있다.
여기까지 설명하고 원댓글을 다시 한번 살펴보자.
비동기는 코루틴으로 구현하는건가? 아니다. 여러가지 구현 방법 중 하나 일 뿐이다.
비동기는 쓰레드와 다른가? 애초에 비교 대상이 아니다.
원댓글은 코틀린 코루틴을 공부하고 있는 뉴비같고 개념에 혼동이 온듯!
고랭조아
설명은 잘 했는데 애초에 저런거 헷갈리는 애들은 코루틴이 뭔지도 몰라서 프로세스 스레드 코루틴 차이부터 설명해줘야됨
오맞아
비동기 io에서도 하드웨어의 도움을 받아 io작업이 끝나면 cpu에 완료됐다고 반환하지 않나요?? os 배울 떈 그렇게 배웠는데
와 1타강사