Почему файловые дескрипторы такой дорогой ресурс? - PullRequest
6 голосов
/ 05 декабря 2009

В священных войнах о том, является ли сборка мусора хорошей вещью, люди часто указывают, что она не обрабатывает такие вещи, как освобождение файловых дескрипторов. Помещение этой логики в финализатор считается плохой вещью, потому что ресурс освобождается недетерминированным образом. Тем не менее, кажется, что для ОС было бы простым решением обеспечить доступность большого количества файловых дескрипторов, чтобы они были дешевым и обильным ресурсом, и вы можете позволить себе тратить несколько в любой момент времени. Почему это не делается на практике?

Ответы [ 6 ]

5 голосов
/ 05 декабря 2009

На практике это не может быть сделано, потому что ОС придется выделять намного больше памяти для отслеживания того, какие дескрипторы используются различными процессами. В примере кода C, как показано ниже, я продемонстрирую простую структуру процесса ОС, хранящуюся в циклической очереди для примера ...

struct ProcessRecord{
  int ProcessId;
  CPURegs cpuRegs;
  TaskPointer **children;
  int *baseMemAddress;
  int sizeOfStack;
  int sizeOfHeap;
  int *baseHeapAddress;
  int granularity;
  int time;
  enum State{ Running, Runnable, Zombie ... };
  /* ...few more fields here... */
  long *fileHandles;
  long fileHandlesCount;
}proc;

Представьте, что fileHandles - это указатель на массив целых чисел, каждое из которых содержит местоположение (возможно, в закодированном формате) для смещения в таблице ОС, где файлы хранятся на диске.

Теперь представьте, сколько памяти может поглотить и замедлить работу всего ядра, возможно, приведет к нестабильности, так как концепция многозадачности системы упадет из-за необходимости отслеживать, сколько файловых дескрипторов используются и предоставляют механизм для динамического увеличения / уменьшения указателя на целые числа, что может повлиять на замедление пользовательской программы, если ОС выдает файловые дескрипторы по требованию пользовательской программы.

Надеюсь, это поможет вам понять, почему оно не реализовано и не практично.

Надеюсь, это имеет смысл, С наилучшими пожеланиями, Том.

2 голосов
/ 05 декабря 2009

Я уверен, что будут получены более полные ответы, но, исходя из моего ограниченного опыта и понимания основной операции Windows, файловые дескрипторы (структуры, используемые для представления их в ОС) являются объектами ядра, и поэтому для них требуется определенный тип памяти должен быть доступен - не говоря уже об обработке в части ядра для поддержания согласованности и согласованности с несколькими процессами, требующими доступа к одним и тем же ресурсам (например, файлам)

2 голосов
/ 05 декабря 2009

Закрытие файла также сбрасывает записи на диск - ну, в любом случае, с точки зрения вашего приложения. После закрытия файла приложение может аварийно завершить работу, пока сама система не аварийно завершится, изменения не будут потеряны. Так что не стоит разрешать GC закрывать файлы на досуге. Даже если это может быть технически возможно в наше время.

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

2 голосов
/ 05 декабря 2009

Это не просто количество файловых дескрипторов, это то, что иногда, когда они используются в некоторых режимах, они могут помешать другим абонентам иметь доступ к тому же файлу.

1 голос
/ 05 декабря 2009

Я не думаю, что они обязательно дорогие - если ваше приложение содержит только несколько неестественных открытых приложений, оно не убьет систему. Точно так же, как если бы вы пропустили только несколько строк в C ++, никто не заметит, если они не выглядят очень осторожно. Где это становится проблемой:

  • если вы пропустите сотни или тысячи
  • если открытие файла предотвращает выполнение других операций с этим файлом (другие приложения могут не иметь возможности открыть или удалить файл)
  • это признак неряшливости - если ваша программа не может отследить, что она владеет и использует или перестала использовать, какие еще проблемы будут у программы? Иногда небольшая утечка превращается в большую утечку, когда что-то мало меняется или пользователь делает что-то немного иначе, чем раньше.
0 голосов
/ 04 марта 2010

В парадигме сокетов Linux есть дескрипторы файлов. Есть определенные преимущества для освобождения портов TCP как можно скорее.

...