진행하고 있는 프로젝트에서 @Async를 통해 비동기 처리를 하여 성능 개선을 계획 중이다. 관련 공부를 하던 와중에 멀티스레드, 비동기의 차이가 뭐지?라는 질문에 대답을 못하였고 이번 기회에 제대로 알고 가기 위해서 정리해 본다.
우선 결론은 멀티스레드 ≠ 비동기
동기, 비동기 VS 단일스레드, 멀티스레드
동기, 비동기 -> 작업(Task)에 관한 것 / 단일스레드, 멀티스레드 -> 작업자(Thread)에 관한 것 이 기본 개념이다.
이해를 돕기 위해 라면을 끓여 보겠다(?) (이해를 돕기 위함이므로 맛은 중요하지 않다. 처리 속도, 효율성을 생각해 보자~)
Task -> 물 끓이기, 스프 넣기, 면 넣기 / Thread -> teho, 백종원님(이하 백선생)
- 동기 : 물이 다 끓으면 -> 스프를 다 넣으면 -> 면을 넣는다. (앞서 일어난 작업이 끝이 나야 다음 작업이 실행된다. 순서가 존재한다)
- 비동기: 아 몰라 물 안 끓는데 스프, 면 그냥 막 넣어버려. (앞선 작업들의 실행 종료와 상관없이 진행한다, 순서가 사라진다는 뜻)
- 단일스레드 : teho 혼자 라면 끓이는 일을 한다. (작업자 1명)
- 멀티스레드 : teho와 백선생이 일을 나누어 라면을 끓인다. (작업자 1명 이상)
이렇게 동기, 비동기 / 단일스레드, 멀티스레드는 다른 내용이기 때문에 서로 조합이 가능하다.
- 동기 - 단일 스레드 : teho가 물을 끓이는데 다 끓으면 -> teho가 스프를 다 넣으면 -> teho가 면을 넣는다.
- 동기 - 멀티 스레드 : teho가 물을 끓이는데 다 끓으면 -> 백선생이 스프를 다 넣으면 -> teho가 면을 넣는다.
(작업자는 늘어났지만 앞에 일이 끝나야 다음 일을 할 수 있어서 작업자가 늘어난 장점을 찾기 힘들다) - 비동기 - 단일 스레드 : teho가 물 끓이다가, teho가 라면 스프 뜯다가, teho가 물 다 끓이고, teho가 면 넣고, teho가 뜯은 스프 넣는다.
(순서가 없다. 하지만 혼자 모든 일을 이것저것 동시에 하는 것이기에 장점은 찾기 힘들다.) - 비동기 - 멀티 스레드 : teho가 물 끓이는 동안, 백선생님이 스프 넣던가 면 넣던가. 남아 있는 일 이것저것 번갈아 처리한다.
(순서가 없고 여러 명이서 일을 처리하기에 빠르다.)
이 내용을 그래프로 나타내면 아래와 같다.
다시 라면 끓이기로 치환해 보면..?
그렇다면 비동기 - 멀티 스레드 방법으로 다 처리하면 되는 거 아닌가???? 할 수 있지만 각각의 단점들이 있다.
- 비동기 단점 - 동작이 끝났는지 안 끝났는지를 별도로 체크를 해주어야 함. (동기면 다음 코드 실행되면 동작이 끝난 것이라 생각 가능) 그에 따라 로직 복잡도, 오류 처리의 어려움이 증가한다.
- 멀티 스레드 단점 - 스레드는 CPU와 메모리 같은 시스템 자원을 소비한다. 전략 없는 스레드 사용은 큰 화를 불러올 수 있다.
비동기 - 멀티 스레드가 유용한 경우가 있고, 올바르게 사용하지 않으면 시스템 자원을 과하게 사용할 수 있다는 결론이 나왔다. 그렇다면 시스템 자원을 적절하게 사용하는 방법은?
스레드 풀
새로운 Task가 생겨서 새로운 스레드를 생성하고, 다 사용한 스레드를 제거하는 데는 많은 비용이 든다. 이를 해결하기 위해 스레드 풀이라는 개념을 사용한다.
스레드 풀은 스레드를 미리 생성하고 생성된 스레드들을 관리해 준다. -> 생성/삭제로 인한 비용을 감소시켜준다. 추가적인 설명은 아래와 같다.
- 스레드 풀은 당장 필요하지 않아도 존재하는 core threads, 필요할 때 생성하고/ 필요 없으면 삭제할 수 있는 excessive threads로 구성되어 있다.
- core threads, excessive threads의 수를 설정하여 성능을 관리한다.
- task가 많아서 생성할 수 있는 모든 스레드가 일을 하고 있다면 아직 스레드를 할당받지 못한 task는 queue에 들어가서 순서를 기다린다.
- 일을 다한 excessive threads가 얼마 뒤에 삭제될지(기다리다가 task 새로 들어오면 일 더 해야 하기 때문에),
스레드를 할당받지 못한 task가 대기하는 queue의 크기는 어느 정도로 할지(task가 무한정으로 쌓이면 자원 손실 등 어려움이 있기에 일정 양이 queue에 쌓이면 에러를 발생시킨다.) 를 상황에 맞게 조절하여 성능 관리를 진행한다.
'Network & CS' 카테고리의 다른 글
[CS] 대칭키 & 비대칭키 / HTTPS 통신 방법 (0) | 2024.09.13 |
---|---|
HTTP 캐시 (캐시, 조건부 요청, 캐시 VS 쿠키?) (2) | 2022.09.14 |
http 일반 헤더 (쿠키?) (3) | 2022.09.11 |
HTTP 상태 코드 (404 error??) (1) | 2022.09.02 |
HTTP 메서드 (GET, POST, PUT, PATCH, DELETE), 메서드 속성 (0) | 2022.08.23 |