stdio 라이브러리를 사용할 때 버퍼링 수준이 3개인가요, 아니면 2개 수준인가요?

stdio 라이브러리를 사용할 때 버퍼링 수준이 3개인가요, 아니면 2개 수준인가요?

에서Linux 프로그래밍 인터페이스:
(관련 내용을 읽어봤습니다. 설명을 위해 이 요약 다이어그램을 붙여넣었습니다.) 여기에 이미지 설명을 입력하세요

나는 시스템 호출을 read사용 하는 직접 IO에 대해 알고 있습니다 . write버퍼링에는 2가지 수준이 있습니다. read/write buffer+ kernel buffer.

stdio직접 시스템 IO 호출 위에 구축된 라이브러리 호출을 사용하는 경우

  1. stdio buffer+ read/write buffer+ kernel buffer, 3단계 버퍼링,

또는

  1. stdiowrite/read동일한 버퍼를 공유합니다. 2가지 수준의 버퍼링

stdio calls <---> user buffer<------> read/write+kernel buffer

?

(버퍼링 2단계인거 같은데 확실히 확인하고 싶습니다.)

답변1

일반적인 경우에는 두 가지 수준이 있습니다. 사용자 공간의 버퍼는 stdio 라이브러리에 의해 할당되며 puts/printf/fprintf 등에 대한 호출은 이 버퍼에 문자를 넣습니다. 어떤 단계에서(예: 버퍼가 가득 찼거나 줄 바꿈이 기록되고 스트림이 라인 버퍼 모드에 있는 경우) stdio 라이브러리는 write커널에 버퍼 쓰기를 요청하기 위해 호출합니다. 커널은 일반적으로 버퍼를 커널 버퍼에 복사하고 데이터를 대상으로 가져오는 데 필요한 모든 것을 시작하고 반환합니다. 그러면 사용자 공간은 원하는 대로 사용자 공간 버퍼를 자유롭게 사용할 수 있습니다.

이를 다르게 수행하는 stdio의 다른 구현을 갖는 것이 가능합니다(그러나 일반적이지 않습니다).SFIOstdio 호환성 레이어가 있습니다. 등을 위해 다양한 계획이 제안되었습니다 zero copy. 요점은 stdio효과가 어떻게 이루어지는지 알려주는 것이 아니라 효과가 무엇인지 알려주는 것입니다.

관련 정보