在关于垃圾收集是否是一件好事的神圣战争中,人们经常指出它不会处理诸如释放文件句柄之类的事情。将此逻辑放在终结器中被认为是一件坏事,因为资源会被非确定性地释放。然而,似乎一个简单的解决方案是操作系统只需要确保有大量的文件句柄可用,这样它们就是一个便宜而丰富的资源,你可以在任何给定的时间浪费一些。为什么这在实践中没有完成?
答案 0 :(得分:5)
实际上,它无法完成,因为操作系统必须分配更多的内存开销来跟踪不同进程正在使用哪些句柄。在如下所示的示例C代码中,我将演示存储在循环队列中的简单OS过程结构,以示例...
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是一个指向整数数组的指针,每个整数都包含位于操作系统表中文件存储在磁盘上的位置的位置(可能采用编码格式)。
现在想象一下,由于不得不跟踪文件句柄的数量,因为系统的“多任务”概念会丢失多少内存会占用并可能减慢整个内核的速度,从而导致不稳定正在使用并提供一种机制来动态地增加/减少指向整数的指针,如果操作系统在用户程序的需求基础上抛出文件句柄,这可能会对减慢用户程序产生影响。
我希望这可以帮助您理解为什么它没有实现也不实用。
希望这是有道理的, 最好的祝福, 汤姆。
答案 1 :(得分:2)
这不仅仅是文件句柄的数量,有时当它们在某些模式下使用时,它们可以阻止其他调用者访问同一文件。
答案 2 :(得分:2)
关闭文件也会将写入刷新到磁盘 - 从应用程序的角度来看也是如此。关闭文件后,应用程序可能会崩溃,只要系统本身没有崩溃,更改就不会丢失。所以让GC关闭文件并不是一个好主意。即使现在在技术上可行。
另外,说实话,旧习惯很难。文件句柄曾经很昂贵,但由于历史原因,它们仍然可能被认为是这样。
答案 3 :(得分:2)
我确信会有更全面的答案,但基于我对Windows底层操作的有限经验和理解,文件句柄(用于向操作系统表示它们的结构)是内核对象,因此它们需要一个某种类型的内存可用 - 更不用说内核部分的处理,以保持与需要访问相同资源(即文件)的多个进程的一致性和一致性
答案 4 :(得分:1)
我不认为它们一定是昂贵的 - 如果你的应用程序只保留一些不合理的应用程序,它就不会杀死系统。就像你在C ++中只泄漏一些字符串一样,没有人会注意到,除非他们看起来非常仔细。它成为问题的地方是:
答案 5 :(得分:0)
在Linux范例中,套接字是文件描述符。尽快释放TCP端口有一定的优势。