2012-03-18 1 views
0

만 개방// 쓰기 기능 내 프로그램에서 사용되지만, OProfile은 그 나에게 보여줍니다 읽어열기/읽기/쓰기가 버퍼링 되었습니까?

이 generic_file_buffered_write 나오면, 오픈 얼마나
20537  2.9883 tyn_indexer    tyn_indexer    nodes_term32_flush 
11966  1.7411 vmlinux     vmlinux     jbd2_journal_commit_transaction 
11733  1.7072 vmlinux     vmlinux     __strnlen_user 
10741  1.5629 vmlinux     vmlinux     nobh_truncate_page 
9728  1.4155 vmlinux     vmlinux     generic_file_buffered_write 
9443  1.3740 vmlinux     vmlinux     mpage_da_map_and_submit 
9023  1.3129 vmlinux     vmlinux     do_get_write_access 
7283  1.0597 vmlinux     vmlinux     invalidate_interrupt31 
5894  0.8576 vmlinux     vmlinux     write_cache_pages_da 
5332  0.7758 vmlinux     vmlinux     journal_submit_commit_record 
5316  0.7735 vmlinux     vmlinux     hugetlbfs_symlink 

// 쓰기 기능은 버퍼 읽기?

+2

버퍼링은 여러 수준에서 발생합니다. 어떤 수준에 대해 물어 보는거야? –

+0

{stdin, stdout, stderr}은 항상 버퍼링됩니다. 프로그램 fprintf()를 stdout 또는 stderr로 설정하면 출력이 버퍼링됩니다. – wildplasser

+0

나는'open'이 버퍼되지 않은 시스템 호출이 될 것이라고 기대하지만,'generic_file_buffered_write'는 뭔가 다른 것으로 끌어 들여질 수도 있습니다. oprofile 명령은 무엇을 사용 했습니까? 프로그램이 정적으로 링크되어 있습니까? 아니면 동적으로 링크되어 있습니까? 프로그램에서'nm'을하면,'generic_file_buffered_write'라는 이름이 보입니까? – gbulmer

답변

3

버퍼링의 의미에 따라 다릅니다. C 프로그래머가 이러한 함수가 버퍼링되지 않는다고 말하면, 다른 프로세스가 일관된 방식으로 데이터를 볼 수 없도록 막을 수있는 버퍼 응용 프로그램 프로세스이 없다는 것을 의미합니다. 커널에서 이러한 기능을 구현하는 것은 애플리케이션 프로세스에 투명하게 수행되는 한 (즉, 커널에서 데이터를 볼지 여부를 방해하지 않는 한) 버퍼링을 원하는만큼 자유롭게 수행 할 수 있습니다. 파일). 한편

는, 표준 입출력은 파일에 액세스 표준 입출력 ( stdio.h에서 FILE * 기능)를 사용하는 경우, 데이터가 기본 파일 기술자로부터 읽고 프로세스의 메모리 공간에 버퍼링 될 수 있음을 의미한다 (보통) 버퍼링 다른 프로세스가 실제로을 읽고 사용하기 전에 을 볼 수없는 경우 또는 작성한 데이터는 다른 프로세스가 작성한 후 오랫동안 볼 수없는 (사용자가 fflush을 호출하지 않는 한) 프로세스의 메모리 공간에 버퍼링 된 상태로있을 수 있습니다.

0

readwrite 시스템 호출은 상호 작용하는 장치에 전적으로 의존하는 매우 임의적 인 의미를 가지고 있습니다.

read 함수는 다양한 작업을 수행 할 수 있습니다. 예를 들어, 조리 모드에서 TTY 드라이버 ("표준 입력 처리")를 읽고 1 바이트를 요구하는 경우 read은 전체 라인을 실제로 사용할 수있을 때까지 해당 1 바이트를 반환하지 않습니다. 그러나 원시 모드에서도 물론 버퍼가 남아 있습니다. 프로세스가 read을 호출하지 않아도 키보드 또는 직렬 포트에서 인터럽트 방식으로 데이터를 수신하고 버퍼에 저장합니다.

read 함수는 데이터를 삭제할 수 있습니다. 전통적인 Unix 원시 테이프 장치 또는 데이터 그램 소켓의 데이터 그램에서 섹터를 읽는 경우 공급하는 버퍼가 너무 작아서 전체 섹터 나 패킷을 저장할 수 없으면 초과 데이터가 잘립니다.

write은 데이터가 실제로 디스크로 출력되기 훨씬 전에 반환 할 수 있습니다.