~에서리눅스 프로그래밍 인터페이스:(
관련 부분을 읽었습니다. 설명을 위해 이 요약 다이어그램을 붙여넣었습니다.)
나는 그것이 사용하는 직접 IO read
와 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 라이브러리에 의해 할당되며 put/printf/fprintf 등을 호출하면 버퍼에 문자가 입력됩니다. 일부 단계(예: 버퍼가 가득 차거나 개행 문자가 작성되고 스트림이 라인 버퍼 모드인 경우)에서 stdio 라이브러리 호출은 write
커널에 버퍼에 쓰도록 요청합니다. 커널은 일반적으로 버퍼를 커널 버퍼에 복사하고 데이터를 대상으로 가져오는 데 필요한 모든 작업을 시작하고 반환합니다. 그러면 사용자 공간은 원하는 대로 사용자 공간 버퍼를 사용할 수 있습니다.
다르게 수행되는 다른 stdio 구현을 갖는 것이 가능합니다(일반적이지는 않음).SFIOstdio 호환성 레이어가 있습니다. zero copy
등 다양한 방안이 제안되었습니다 . 요점은 stdio
효과가 어떻게 이루어졌는지 알려주는 것이 아니라 효과가 무엇인지 알려주는 것입니다.