Размер буфера по умолчанию для файла в Linux

В документации говорится, что значение по умолчанию для буферизации: If omitted, the system default is used, В настоящее время я использую Red Hat Linux 6, но не могу определить буферизацию по умолчанию, установленную для системы.

Кто-нибудь может подсказать, пожалуйста, как определить буферизацию для системы?

3 ответа

Решение

Поскольку вы связались с 2,7 документами, я предполагаю, что вы используете 2,7. (В Python 3.x все это становится намного проще, потому что гораздо больше буферизации предоставляется на уровне Python.)

Все open на самом деле (в системах POSIX) это вызов fopen и затем, если вы что-то передали для buffering, setvbuf, Так как вы ничего не передаете, вы просто получаете буфер по умолчанию от fopen, что до вашей стандартной библиотеки C. (См. Источник для деталей. Без buffering, он передает -1 в PyFile_SetBufSize, который ничего не делает, если bufsize >= 0.)

Если вы читаете glibc setvbuf manpage, это объясняет, что если вы никогда не вызываете ни одну из функций буферизации:

Обычно все файлы имеют блочную буферизацию. Когда первая операция ввода-вывода происходит с файлом, malloc (3) называется, и буфер получен.

Обратите внимание, что в нем не указано, какой размер буфера получен. Это намеренно; это означает, что реализация может быть разумной и выбирать разные размеры буфера для разных случаев. (E сть BUFSIZ константа, но это используется только при вызове унаследованных функций, таких как setbuf; Это не гарантируется для использования в любом другом случае.)

Итак, что же происходит? Ну, если вы посмотрите на исходный код glibc, в конечном итоге он вызывает макрос _IO_DOALLOCATE, который может быть перехвачен (или переопределен, потому что glibc объединяет буферизацию C++ streambuf и C stdio), но в конечном итоге он выделяет buf _IO_BUFSIZE, который является псевдонимом для макроса платформы _G_BUFSIZE, который 8192,

Конечно, вы, вероятно, хотите отследить макросы в вашей собственной системе, а не доверять универсальному источнику.


Вы можете удивиться, почему не существует хорошего документированного способа получить эту информацию. Предположительно, это потому, что ты не должен заботиться. Если вам нужен определенный размер буфера, вы устанавливаете его вручную; если вы уверены, что система знает лучше, просто верьте ей. Если вы на самом деле не работаете над ядром или libc, кого это волнует? Теоретически, это также оставляет открытой возможность того, что система может сделать что-то умное здесь, например, выбрать размер буфера, основанный на размере блока для файловой системы файла, или даже основываясь на данных статистики, хотя это не похоже на linux/glibc., FreeBSD или OS X делают что-то кроме использования константы. И, скорее всего, это потому, что это не имеет значения для большинства приложений. (Возможно, вы захотите проверить это сами - используйте явные размеры буфера в диапазоне от 1 КБ до 2 МБ в сценарии с буферизованным вводом-выводом и посмотрите, каковы различия в производительности.)

Я не уверен, что это правильный ответ, но библиотека Python 3.0 и библиотека Python 20 описывают io.DEFAULT_BUFFER_SIZE так же, как это описано по умолчанию в документации для open(), Стечение обстоятельств?

Если нет, то ответ для меня был:

$ python
>>> import io
>>> io.DEFAULT_BUFFER_SIZE
8192

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.1 LTS
Release:        14.04
Codename:       trusty
#include <stdio.h>

int main(int argc, char* argv[]){
  printf("%d\n", BUFSIZ);
  return 0;
}

Я сделал 'man setvbuf', чтобы найти это. setvbuf - это сноска [2] страницы документации.

Другие вопросы по тегам