stdio 라이브러리를 사용할 때 레벨 3 버퍼링이 있습니까, 아니면 레벨 2 버퍼링이 있습니까?

stdio 라이브러리를 사용할 때 레벨 3 버퍼링이 있습니까, 아니면 레벨 2 버퍼링이 있습니까?

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

나는 그것이 사용하는 직접 IO readwrite시스템 호출을 알고 있습니다. 레벨 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 라이브러리에 의해 할당되며 put/printf/fprintf 등을 호출하면 버퍼에 문자가 입력됩니다. 일부 단계(예: 버퍼가 가득 차거나 개행 문자가 작성되고 스트림이 라인 버퍼 모드인 경우)에서 stdio 라이브러리 호출은 write커널에 버퍼에 쓰도록 요청합니다. 커널은 일반적으로 버퍼를 커널 버퍼에 복사하고 데이터를 대상으로 가져오는 데 필요한 모든 작업을 시작하고 반환합니다. 그러면 사용자 공간은 원하는 대로 사용자 공간 버퍼를 사용할 수 있습니다.

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

관련 정보