6

在有关垃圾回收是否是好事的神圣战争中,人们经常指出,它并不处理诸如释放文件句柄之类的东西。把这个逻辑放入终结器被认为是一件坏事,因为资源会被非确定性地释放。但是,对于操作系统来说,这似乎是一个简单的解决方案,可以确保提供大量和大量的文件句柄,以便它们成为便宜且丰富的资源,并且您可以在任何给定时间浪费一些资源。为什么在实践中没有这样做?为什么文件处理如此昂贵的资源?

回答

2

关闭文件也会刷新写入磁盘 - 无论如何,从您的应用程序的角度来看。关闭文件后,应用程序可能会崩溃,只要系统本身不会崩溃,更改就不会丢失。所以让GC关闭文件并不是一个好主意。即使现在技术上可能也是如此。

另外,说实话,老习惯很难消退。文件句柄过去很昂贵,并且由于历史原因可能仍被认为是这样。

2

这不仅仅是文件句柄的数量,它有时候在某些模式下使用它们时,可能会阻止其他调用者访问相同的文件。

+1

没错。问题通常不是句柄总数有限,而是可以打开*到特定文件*的专用句柄数量非常有限,通常为* ONE *。 – supercat 2011-01-03 21:57:28

+0

@supercat这听起来像是Windows特有的限制。 – binki 2016-10-24 13:59:12

+1

@binki:可以对任何特定文件打开的* exclusive *句柄的数量在任何非破坏的实现中将被限制为一个。 – supercat 2016-10-24 16:29:27

2

我确信会有更全面的答案,但基于我对Windows底层操作的有限经验和理解,文件句柄(用于表示它们到OS的结构)是内核对象,因此它们需要某种类型的内存可用 - 更不用说在内核部分处理以保持与需要访问相同资源的多个进程的一致性和一致性(即文件)

+0

如果您的意思是内核空间内存,64位内核的功能与现在和可预见的未来可能需要的一样多。 – 2009-12-05 01:18:58

1

我不认为它们必然很昂贵 - 如果你的应用程序只保留一些不合理的应用程序,它不会杀死系统。就像在C++中只泄漏了几个字符串一样,没有人会注意到,除非他们看起来很小心。当它成为一个问题是:

  • 如果您泄漏数百或数千
  • 如果有文件打开阻止在该文件上发生的(其他应用程序可能无法打开或删除文件)
  • 等操作
  • 这是一个不稳定的迹象 - 如果您的程序无法追踪它拥有的内容,并且正在使用或已停止使用,那么该程序还会有哪些其他问题?有时候,当一些小的变化或用户做了一些与以前不同的事情时,一个小小的泄漏就会变成一个大泄漏。
+0

当然,除非您的缓冲区没有正确编写,因为您的泄漏文件句柄没有正确关闭。在这种情况下 - 很常见的情况是,单个泄漏的手柄可能是一个调试噩梦。 – 2009-12-05 04:15:14

5

在实践中,它不能完成,因为操作系统将不得不分配更多的内存开销来跟踪哪些句柄被不同进程使用。在如下所示我将展示存储在用于一个示例的循环队列的简单OS处理结构的一例的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; 

试想一下,文件句柄是一个指针,指向一个整数数组,其中每个整数包含位置(可能是编码格式),用于将文件存储在磁盘上的操作系统表的偏移量。

现在想象一下,有多少内存会吃掉并且可能会减慢整个内核,可能会导致不稳定,因为系统的“多任务”概念会由于必须跟踪多少文件句柄正在使用中,并提供一种机制来动态增加/减少指向整数的指针,如果操作系统在用户程序的需求基础上抛出文件句柄,这可能会减慢用户程序的效果。

我希望这可以帮助你理解为什么它没有实现,也不切实际。

希望这是有道理的, 最好的问候, 汤姆。

+0

你可以留下评论为什么这是downvoted?谢谢。 :| – t0mm13b 2009-12-05 01:27:54

+0

不知道为什么这是downvoted ... +1 – RCIX 2009-12-05 01:28:49

+0

@RCIX:谢谢 - 这是令人难以置信的速度张贴我downvoted没有留下评论... – t0mm13b 2009-12-05 01:32:09

0

在Linux范例中,套接字是文件描述符。尽快释放TCP端口有一定的优势。