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

열심인 참새님의 프로필 이미지
열심인 참새

작성한 질문수

김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션

정리

버퍼 질문입니다.

작성

·

63

0

1. 1byte 씩 전송하면 당연히 시스템콜이 많이 작동하므로 속도가 느리다
2. 8바이트씩 전송하면 시스템 콜에서 어차피 8바이트씩 전송하므로 시스템 콜을 적게 호출 할 수 있다

[질문]
한번에 전송해도 시스템콜에서 8kb바이트씩 보낼텐데
시스템콜 요청하는 횟수가 2번과 비슷할텐데 왜 버퍼를 쓰는게 더 빠르게 나오는 걸까요?
혹시 이게 한번 전송하면 한꺼번에 시스템콜 직전까지 전달하므로 병목현상 뭐 그런걸까요?
++
강의에서 한번에 써도 os상에서 8kb씩 보내신다고 했던것 같은데 맞나요?
메모리에 한번에 올려서 시스템콜에 가져다 주는 것이 부하가 걸려서 8kb씩 버퍼로 하는 것보다 더 느린걸까요?

답변 2

0

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

안녕하세요. 열심인 참새님

2번 내용을 잘못 이해하신 것 같아요.

2. 8바이트씩 전송하면 시스템 콜에서 어차피 8바이트씩 전송하므로 시스템 콜을 적게 호출 할 수 있다

 

다음과 같이 3단계가 필요합니다.

자바 -> 시스템 콜 -> 디스크 쓰기

자바에서 8kb 씩 전송하면 시스템 콜에서 디스크 쓰기시점에 8kb를 전송한다고 보시면 됩니다.

그리고 자바에서 시스템 콜을 호출하는 것 차제가 매우 무거운 작업으로 이해하시면 됩니다 🙂

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다. 열심인 참새님!

버퍼를 사용하는 이유는 크게 두 가지로 나눌 수 있습니다. 첫째, 시스템 호출(system call)의 횟수를 줄여주는 것과 둘째, 데이터 전송의 효율성을 높이기 위함입니다.

  1. 시스템 호출 횟수 감소: 파일을 1바이트씩 읽거나 쓰면 매번 시스템 호출을 해야 합니다. 시스템 호출은 운영체제와의 인터페이스 역할을 하기 때문에 네이티브 코드로 변환되면서 오버헤드가 발생합니다. 따라서, 시스템 호출을 줄여서 오버헤드를 감소시키는 것이 중요합니다.

  2. 입출력 속도의 향상: 실제로 운영체제가 데이터 전송을 처리할 때 8KB(또는 다른 설정된 크기) 단위로 데이터를 관리하기 때문에, 버퍼를 통해 가능한 한 많은 데이터를 한 번에 모아 처리하는 것이 효율적입니다. 즉, 버퍼에 데이터를 모았다가 일정 크기 이상이 되었을 때 한꺼번에 전송하기 때문에 운영체제의 디스크 입출력 작업이 최적화됩니다.

질문하신 내용 중에, “한 번에 전송해도 시스템콜에서 8KB씩 보낼 텐데 시스템콜 요청하는 횟수가 비슷할 텐데 왜 버퍼를 쓰는 게 더 빠르게 나오는 걸까요?“라는 부분에서는, 버퍼를 사용하지 않고 매번 8바이트를 전송할 경우 버퍼링하여 데이터를 모아서 보내는 것보다 호출 횟수가 더 많고 잦아지기 때문에 비효율적이 되는 것입니다.

한 번에 데이터를 메모리에 올려서 시스템 호출에 전달하는 것보다 적절한 크기(예: 8KB)로 버퍼링하여 전달하면 운영체제의 입장에서도 효율적으로 데이터 전송을 관리할 수 있어 전반적인 입출력 성능을 향상시킬 수 있습니다.

유사한 질문에 대한 흥미로운 답변이 다음 링크에 있을 수 있습니다:
- 싱글톤 객체에 접근할 때 병목현상(?)에서의 시스템 설명

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

열심인 참새님의 프로필 이미지
열심인 참새

작성한 질문수

질문하기