是否打开/读/写缓冲?

时间:2012-03-18 14:14:53

标签: c linux

我的程序中只使用了打开/读/写功能,但oprofile向我显示:

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

generic_file_buffered_write是如何出现的,并且是开放/读/写函数缓冲?

2 个答案:

答案 0 :(得分:5)

这取决于缓冲的意思。当C程序员说这些函数是无缓冲的时,意味着应用程序进程本身没有缓冲区,这可能会阻止其他进程以一致的方式查看数据。这些函数的实现(在内核中)可以自由地执行尽可能多的缓冲,只要它以对应用程序进程透明的方式完成(即不会干扰它们是否或何时看到数据上的数据)文件)。

另一方面,stdio(通常)是缓冲的,这意味着如果使用stdio(FILE *中的stdio.h函数)来访问文件,则可以从底层文件描述符中读取数据并且在你的进程的内存空间中缓冲,其他进程在你真正打算阅读和使用它之前无法看到它,或者你编写的数据可能会保留在进程的内存空间中,其他进程看不到它在你写完之后(除非你打电话给fflush)。

答案 1 :(得分:0)

readwrite系统调用具有完全相同的语义,完全取决于您正在与之交互的设备。

read函数可以执行各种操作。例如,如果您在熟模式下读取TTY驱动程序(“规范输入处理”)并请求1个字节,read将不会返回该字节,直到实际可用完整行。但即使在原始模式下,当然仍有缓冲区。即使您的进程未调用read并且位于缓冲区中,也会从键盘或串行端口以中断驱动的方式接收数据。

read功能可以丢弃数据。如果您正在从传统的Unix原始磁带设备读取扇区,或者从数据报套接字读取数据报,并且您提供的缓冲区太小而无法容纳整个扇区或数据包,则会截断多余的数据。

文件的

write可以在数据实际传出到磁盘之前很久就返回。