Почему являются дескрипторы файлов таким дорогим ресурсом?

Существует сайт, названный Растяпы на направляющих , который записан несколькими разработчиками ex-.NET, которые могут быть несколько полезными. У них есть книга, названная направляющие для Разработчиков.NET выход за следующие несколько месяцев...

я начал на поле Windows с помощью плагин RadRails для Eclipse и расширение RubyWeaver для DreamWeaver (назад во время 1.x дни направляющих). С тех пор я переместил в выполнение Mac TextMate и не думал о возвращении.

Что касается книг, я запустил с Ruby Путь и Гибкую веб-разработку с направляющими. Это определенно помогает создать знания в Ruby, поскольку Вы начинаете превращать свой путь в разработку направляющих.

Определенно наблюдают серию Railscast Ryan Bates.

6
задан dsimcha 5 December 2009 в 01:02
поделиться

6 ответов

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

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

2
ответ дан 9 December 2019 в 20:44
поделиться

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

2
ответ дан 9 December 2019 в 20:44
поделиться

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

2
ответ дан 9 December 2019 в 20:44
поделиться

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

  • если утечка сотен или тысяч
  • , если открытие файла предотвращает выполнение других операций с этим файлом (другие приложения могут быть не в состоянии открыть или удалить файл)
  • это признак небрежности - если ваша программа не может отслеживать, чем она владеет, что использует или что уже прекратила использовать, какие еще проблемы будут у нее? Иногда небольшая утечка превращается в большую утечку, когда что-то незначительное изменяется или пользователь делает что-то немного иначе, чем раньше.
1
ответ дан 9 December 2019 в 20:44
поделиться

На практике, это невозможно сделать, потому что ОС придется выделять намного больше служебной памяти для отслеживания того, какие дескрипторы используются разными процессами. В примере кода 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 - это указатель на массив целых чисел, каждое целое число которого содержит местоположение (возможно, в кодированный формат) для смещения в таблице ОС, где файлы хранятся на диске.

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

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

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

5
ответ дан 9 December 2019 в 20:44
поделиться

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

0
ответ дан 9 December 2019 в 20:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: