在有关垃圾回收是否是好事的神圣战争中,人们经常指出,它并不处理诸如释放文件句柄之类的东西。把这个逻辑放入终结器被认为是一件坏事,因为资源会被非确定性地释放。但是,对于操作系统来说,这似乎是一个简单的解决方案,可以确保提供大量和大量的文件句柄,以便它们成为便宜且丰富的资源,并且您可以在任何给定时间浪费一些资源。为什么在实践中没有这样做?为什么文件处理如此昂贵的资源?
回答
关闭文件也会刷新写入磁盘 - 无论如何,从您的应用程序的角度来看。关闭文件后,应用程序可能会崩溃,只要系统本身不会崩溃,更改就不会丢失。所以让GC关闭文件并不是一个好主意。即使现在技术上可能也是如此。
另外,说实话,老习惯很难消退。文件句柄过去很昂贵,并且由于历史原因可能仍被认为是这样。
这不仅仅是文件句柄的数量,它有时候在某些模式下使用它们时,可能会阻止其他调用者访问相同的文件。
我确信会有更全面的答案,但基于我对Windows底层操作的有限经验和理解,文件句柄(用于表示它们到OS的结构)是内核对象,因此它们需要某种类型的内存可用 - 更不用说在内核部分处理以保持与需要访问相同资源的多个进程的一致性和一致性(即文件)
如果您的意思是内核空间内存,64位内核的功能与现在和可预见的未来可能需要的一样多。 – 2009-12-05 01:18:58
我不认为它们必然很昂贵 - 如果你的应用程序只保留一些不合理的应用程序,它不会杀死系统。就像在C++中只泄漏了几个字符串一样,没有人会注意到,除非他们看起来很小心。当它成为一个问题是:
- 如果您泄漏数百或数千
- 如果有文件打开阻止在该文件上发生的(其他应用程序可能无法打开或删除文件) 等操作
- 这是一个不稳定的迹象 - 如果您的程序无法追踪它拥有的内容,并且正在使用或已停止使用,那么该程序还会有哪些其他问题?有时候,当一些小的变化或用户做了一些与以前不同的事情时,一个小小的泄漏就会变成一个大泄漏。
当然,除非您的缓冲区没有正确编写,因为您的泄漏文件句柄没有正确关闭。在这种情况下 - 很常见的情况是,单个泄漏的手柄可能是一个调试噩梦。 – 2009-12-05 04:15:14
在实践中,它不能完成,因为操作系统将不得不分配更多的内存开销来跟踪哪些句柄被不同进程使用。在如下所示我将展示存储在用于一个示例的循环队列的简单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;
试想一下,文件句柄是一个指针,指向一个整数数组,其中每个整数包含位置(可能是编码格式),用于将文件存储在磁盘上的操作系统表的偏移量。
现在想象一下,有多少内存会吃掉并且可能会减慢整个内核,可能会导致不稳定,因为系统的“多任务”概念会由于必须跟踪多少文件句柄正在使用中,并提供一种机制来动态增加/减少指向整数的指针,如果操作系统在用户程序的需求基础上抛出文件句柄,这可能会减慢用户程序的效果。
我希望这可以帮助你理解为什么它没有实现,也不切实际。
希望这是有道理的, 最好的问候, 汤姆。
在Linux范例中,套接字是文件描述符。尽快释放TCP端口有一定的优势。
- 1. 为什么分页如此资源昂贵?
- 2. 为什么Wpf的DrawingContext.DrawText如此昂贵?
- 3. 为什么File.Open如此昂贵?
- 4. 为什么alpha混合如此昂贵?
- 5. 什么让文件读取没有缓冲区如此昂贵?
- 6. 什么构成昂贵的方法或资源?
- 7. 为什么NHibernate的AutoFlush检查如此昂贵?
- 8. 为什么擦除()函数如此昂贵?
- 9. 为什么签名密钥如此昂贵?
- 10. 为什么试块价格昂贵?
- 11. 此属性调用昂贵
- 12. 处理碰撞 - 阵列查找昂贵
- 13. 什么更昂贵?作业或声明?
- 14. 阵列优化:什么更昂贵?
- 15. 昂贵的StaticResource
- 16. 在不使用Singleton的情况下封装昂贵的资源
- 17. 在Java中什么更昂贵?序列化或写入文件?
- 18. 嘲讽验收测试中的昂贵资源(rspec,黄瓜)
- 19. Hadoop流媒体---昂贵的共享资源(COOL)
- 20. 为什么Elasticsearch服务提供商那么昂贵?
- 21. 你什么时候处理GDI +资源?
- 22. 为什么分配或初始化NSDateFormatter被视为“昂贵”?
- 23. 为什么谷歌Android做昂贵的alpha混合?
- 24. sklearn中的矢量化似乎非常昂贵。为什么?
- 25. 为什么字符串出了名的昂贵
- 26. MySQL事件有多昂贵?
- 27. 如何昂贵或昂贵是用C++继承
- 28. 为什么移动比通过const&?更加昂贵?
- 29. 为什么autorelease对iPhone应用程序特别危险/昂贵?
- 30. 为什么创建一个新线程昂贵?
没错。问题通常不是句柄总数有限,而是可以打开*到特定文件*的专用句柄数量非常有限,通常为* ONE *。 – supercat 2011-01-03 21:57:28
@supercat这听起来像是Windows特有的限制。 – binki 2016-10-24 13:59:12
@binki:可以对任何特定文件打开的* exclusive *句柄的数量在任何非破坏的实现中将被限制为一个。 – supercat 2016-10-24 16:29:27