강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

백엔드해야지님의 프로필 이미지
백엔드해야지

작성한 질문수

김영한의 실전 자바 - 고급 3편, 람다, 스트림, 함수형 프로그래밍

'병렬스트림 사용시 주의점1' 중 I/O 바운드 작업은 '소요시간이 긴 작업'으로 이해해도 될까요?

해결된 질문

작성

·

56

·

수정됨

0

 학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.


1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? - 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? - 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? - 예

[질문 내용]

안녕하세요, 강의 즐겁게 듣고 있습니다.

  • 강의: 섹션 13. 병렬 스트림 - 병렬스트림 사용시 주의점1

  • 질문: 강의 내용 중 'Fork/Join 프레임워크를 I/O 바운드 작업에는 사용하지 않는다'는 내용에서 I/O 바운드 작업을 '소요시간이 긴 작업'으로 이해해도 될까요?

  • 세부

    • I/O 바운드 작업을 공용 풀에서 처리할 경우 발생하는 문제들이 I/O 작업 자체보다는 긴 시간이 소요되는 작업으로 풀의 한정된 수의 스레드를 점유하는 것이 원인이라 이해했는데 강의내용이 I/O 바운드 작업에 초점을 맞추어 제 이해에 오해가 있는가 싶습니다.

      • 병렬 스트림 등의 기능을 통해 공용 풀에서 I/O 바운드 작업이 처리되면 스레드 블로킹에 의한 CPU 낭비, 스레드 수를 증가시킨다면 컨텍스트 스위칭 오버헤드 증가, 작업 훔치기 기법 무력화 등의 부작용이 있는데 이는 긴 시간이 소요되는 작업으로 풀의 한정된 수의 스레드가 오래 점유되면서 발생하는 문제로 이해했습니다.

      • CPU 바운드 작업이라도 소요시간이 길다면 CPU 낭비를 제외하고 위와 같은 문제가 발생되리라 생각합니다. (I/O 바운드 작업이 긴 시간 CPU를 사용하지 않으면서 스레드를 점유한다면 무거운 CPU 바운드 작업은 긴 시간 CPU를 사용하면서 스레드를 점유, 이로 인해 공용풀의 스레드를 늘린다면 컨텍스트 스위칭 오버헤드 증가, CPU 바운드 작업이더라도 작업이 빨리 끝나지 않아 훔치기 기법 무력화 등)

      • 일반적으로 I/O 바운드 작업은 CPU 바운드 작업보다 긴 시간이 소요되는 것이 경험적/현실적 가정으로 알고 있습니다. 이런 일반적인 현상을 전제로 I/O 바운드 작업을 '소요시간이 긴 작업'을 대표하는 의미로 사용하신 것인지, 아니면 제가 놓친 다른 의미, I/O 바운드 작업만이 가지는 특징을 염두에 두신 것인지 궁금합니다.

좋은 5월 보내시길 바랍니다. 감사합니다.

답변 2

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 백엔드해야지님

AI 인턴이 잘 답변을 해주었는데요.

추가로 말씀드리자면 Fork/Join 공용 풀을 I/O 바운드 작업에 사용하지 말라고 경고하는 것은 단순히 '소요 시간이 길기 때문'만은 아닙니다. I/O 바운드 작업이 긴 시간 동안 CPU를 사용하지 않고 대기한다는 특성이, CPU 코어 수에 맞춰 스레드 수가 제한된 공용 풀의 자원을 비효율적으로 점유하여 전체 시스템의 병목을 유발하기 때문입니다. 결국 CPU도 사용하지 않고, 스레드만 대기하기 때문입니다.

긴 작업이어도 CPU를 충분히 소모하는 작업이라면 괜찮다 생각합니다.

감사합니다.

1

안녕하세요, 인프런 AI 인턴입니다. 백엔드해야지님.

질문해주신 내용에 대해 답변드리겠습니다.

I/O 바운드 작업은 일반적으로 CPU보다는 외부 장치나 네트워크와 같은 입출력 작업에 의존도가 높은 작업을 의미합니다. 이러한 작업들은 실제로 CPU를 많이 소모하지 않지만, 데이터 입출력의 지연으로 인해 시간이 많이 소요될 수 있습니다. 따라서, “소요 시간이 긴 작업”이라는 것은 I/O 바운드 작업의 특성상 발생할 수 있는 결과 중 하나로 볼 수 있습니다. 하지만, I/O 바운드 작업을 단순히 “소요시간이 긴 작업”으로만 이해하는 것은 다소 제한적일 수 있습니다.

강의에서 언급된 ‘Fork/Join 프레임워크를 I/O 바운드 작업에 사용하지 않는다’는 것은 프레임워크의 효율적인 사용을 위해 주로 CPU 집중적인 작업에 활용하는 것이 적합하다는 뜻입니다. 왜냐하면, I/O 바운드 작업을 처리하는 동안 스레드가 대기 상태가 되거나 블로킹될 수 있기 때문에, 한정된 수의 스레드 풀에서 비효율이 발생할 수 있습니다.

따라서, I/O 바운드 작업은 스레드가 대기를 해야 하는 상황이 많기 때문에, 이러한 작업을 병렬처리 프레임워크에 포함시키면 CPU를 활용하지 못한 채로 스레드가 잠시 동안 활용되지 않게 될 위험이 있습니다. 이는 스레드 풀의 한계와 맞물려 결과적으로 더 큰 부작용을 야기할 수 있습니다.

강의의 설명은 이러한 실행상의 맥락에서 나왔을 가능성이 높습니다. 소요시간이 길어지는 이유가 CPU를 집중적으로 사용해서가 아니라, 주로 데이터 입출력의 지연 때문이라는 점을 염두에 두시면 좋을 것 같습니다.

질문해주신 내용을 통해 학습에 도움을 드릴 수 있었길 바랍니다. 좋은 하루 보내세요! 😊

출처: Spring Boot Reference Documentation - IO

백엔드해야지님의 프로필 이미지
백엔드해야지

작성한 질문수

질문하기