에서Linux 프로그래밍 인터페이스:
(관련 내용을 읽어봤습니다. 설명을 위해 이 요약 다이어그램을 붙여넣었습니다.)
나는 시스템 호출을 read
사용 하는 직접 IO에 대해 알고 있습니다 . write
버퍼링에는 2가지 수준이 있습니다. read/write buffer
+ kernel buffer
.
stdio
직접 시스템 IO 호출 위에 구축된 라이브러리 호출을 사용하는 경우
stdio buffer
+read/write buffer
+kernel buffer
, 3단계 버퍼링,
또는
stdio
write/read
동일한 버퍼를 공유합니다. 2가지 수준의 버퍼링
stdio calls
<---> user buffer
<------> read/write
+kernel buffer
?
(버퍼링 2단계인거 같은데 확실히 확인하고 싶습니다.)
답변1
일반적인 경우에는 두 가지 수준이 있습니다. 사용자 공간의 버퍼는 stdio 라이브러리에 의해 할당되며 puts/printf/fprintf 등에 대한 호출은 이 버퍼에 문자를 넣습니다. 어떤 단계에서(예: 버퍼가 가득 찼거나 줄 바꿈이 기록되고 스트림이 라인 버퍼 모드에 있는 경우) stdio 라이브러리는 write
커널에 버퍼 쓰기를 요청하기 위해 호출합니다. 커널은 일반적으로 버퍼를 커널 버퍼에 복사하고 데이터를 대상으로 가져오는 데 필요한 모든 것을 시작하고 반환합니다. 그러면 사용자 공간은 원하는 대로 사용자 공간 버퍼를 자유롭게 사용할 수 있습니다.
이를 다르게 수행하는 stdio의 다른 구현을 갖는 것이 가능합니다(그러나 일반적이지 않습니다).SFIOstdio 호환성 레이어가 있습니다. 등을 위해 다양한 계획이 제안되었습니다 zero copy
. 요점은 stdio
효과가 어떻게 이루어지는지 알려주는 것이 아니라 효과가 무엇인지 알려주는 것입니다.