이런 질문을 하는 이유
질문이 다소 추상적이고 넓은 느낌이 들죠
모호해 보이는 이런 질문은 여러 대답들이 나올 수 있기 때문에 지원자 분이 어느 정도까지 알고 있는지,
어떤 관점에서 문제를 바라보는지,
알고 있는 지식을 잘 정리해서 성능과 연결 지어 판단할 수 있는지
이런 것들을 확인하기 위한 목적이 있습니다
이런 다소 모호한 질문은 어떻게 접근하는 것이 좋은가?
이런 종류의 질문은 생각해 볼 여지가 있는 질문이라서
긴장하지 마시고 자신이 알고 있는 것을 잘 정리해서 논리적으로 대답하는 것이 중요합니다
동시성 측면에서 접근
자, 그러면 이런 질문에 어떻게 답변할 수 있는지 예를 들어 보겠습니다
당장 드는 생각은,
'스레드를 많이 쓰면 쓸수록 동시에 더 많은 작업들을 실행할 수 있으니까 애플리케이션의 성능이 전체적으로 좋아질 것 같다'
라는 생각이 듭니다
하지만 항상 그럴까요? 곰곰이 생각을 해봅시다
'스레드를 많이 쓰면 쓸수록 동시에 더 많은 작업들을 실행할 수 있다'
라는 말에는, 우리도 모르게 암묵적으로 전제를 하나 깔고 있습니다
어떤 전제냐면,
'해당 애플리케이션은 더 작은 작업들로 잘게 쪼개서 동시에 실행이 가능한 성격의 애플리케이션'
이라는 전제가 암묵적으로 깔려있는 거죠
만약 해당 애플리케이션의 동작이 순차적으로 실행돼야만 하는 특징을 가진다면,
그래서 잘게 쪼개서 동시에 실행하기에 매우 어려운 성격의 애플리케이션이라면,
이런 암묵적인 전제는 깨지게 되고 스레드를 많이 쓰려고 해도 실제로 사용할 수 있는 스레드 수는 한계가 있을 겁니다
그러니까 이런 경우에는 스레드 수를 계속 늘려봤자 나중에는 별 이점이 없는 거죠
context switching의 관점에서 접근
코어에서 실행되던 스레드가 다른 스레드로 바뀌는 작업을 context switching라고 하는데요,
이런 스위칭 작업 또한 CPU 코어에서 실행되는 작업입니다
즉, 코어에서 스위칭 작업을 처리하는 동안에는 해당 코어에서는 애플리케이션 코드가 실행되지 않죠
이때 스위칭 작업을 위해 소비되는 CPU time은
애플리케이션과 직접적인 관련은 없지만 멀티스레딩으로 동작하기 위해 필요하기 때문에
이런 것을 overhead, 즉 간접 비용이라고 부릅니다
그러면 이런 지식들을 가지고 곰곰이 생각을 해보니
CPU의 코어 수는 고정되어 있는데 스레드 수를 계속 늘리면 각 코어에서 경합하는 스레드 수가 점점 많아질 거고
그러면 overhead도 더 많아질 것 같다는 생각이 듭니다
결국 스레드 수를 계속 늘리면 어느 순간에는 overhead 때문에
성능 면에서도 한계에 부딪칠 것 같다는 생각이 드는 거죠
여기까지 생각해 낸 것도 잘하고 있는 겁니다
그러면 이걸 좀 더 발전시켜 볼게요
CPU bound, I/O bound 관점에서 접근
CPU bound 애플리케이션은 CPU를 많이 쓰기 때문에 코어 수와 비슷한 수준 이상으로 스레드 수를 늘려봤자 별 이점이 없습니다
오히려 각 코어에서 경합하는 스레드 수가 많아질수록 context switching 때문에 overhead만 더 많아져서 성능에 안 좋은 영향을 주게 되겠죠
반면에 I/O bound 애플리케이션은 I/O 작업이 많기 때문에 CPU가 놀고 있는 시간이 많습니다
이런 상황에서는 코어 수보다 두 배, 세 배, 혹은 그 이상으로 스레드 수를 늘려주는 것이
overhead가 좀 더 늘긴 해도 코어들을 더 효율적으로 쓸 수 있기 때문에 성능 면에서 이점이 더 큽니다
하지만 이 경우에도 너~무 많은 스레드를 쓰게 되면 오히려 성능에 악영향을 줄 수 있겠죠
이 외에도 여러 관점에서 생각해 볼 여지가 있는데요,
결국 핵심은 내가 얼마나 알고 있는지,
그리고 알고 있는 지식들을 논리적으로 전개해서 적절한 판단을 할 수 있는지
이게 중요한 포인트가 되겠습니다
보통 컴공 이론을 배울 때는 개념 위주로 차례차례 배우기 때문에
성능과 연결 지어서 논리적이고 종합적으로 생각해 볼 기회가 많지는 않습니다
하지만 실무에서 좋은 서비스를 만들고 또 유지하려면
이런 걸 생각하고 판단할 수 있는 능력이 필요합니다
주요 개념을 잘 알고 있어야 하는 것은 말할 것도 없고요
물론 학생 때는 이렇게 생각해 보는 것이 쉬운 일은 아닙니다
어려운 일이죠
하지만 그렇기 때문에 학생 때부터 내가 알고 있는 지식들이 성능과 어떤 관계가 있을지 생각해 보는 습관을 가진다면
훨씬 더 매력적인 신입 개발자로 어필할 수 있을 거라고 생각합니다
그래서 오늘의 핵심 !
실력 있는 개발자가 되고 싶다면
성능과 연결 지어서 논리적이고 종합적으로 생각해 보는 습관을 가져보자
분명히 성장에 도움이 된다
쉬운코드는 기본에 충실합니다