为什么操作系统没有垃圾收集器?

Pal*_*ini 9 garbage-collection operating-system programming-languages memory-management

我想知道这是因为操作系统负责内存管理.为什么编程语言必须实现自己的垃圾收集器?

Fre*_*Foo 7

我想知道那是因为OS不负责内存管理吗?

仅在操作系统为程序分配内存的意义上,程序然后决定如何使用自己的内存管理器来使用它.在操作系统中进一步集中内存管理是有问题的,因为它会很慢:程序具有不同的内存访问模式,因此为它们提供所有相同的GC将使程序员更难以使用自定义内存管理模式.例如,不同的语言运行时需要不同的垃圾收集器以有效的方式支持语言的习语.它还会要求操作系统管理程序中的内存,从而使操作系统设计复杂化.

实际上,在某种意义上,操作系统已经提供了GC:当程序退出时,典型的OS将清理其内存.但只要程序运行,它就负责管理操作系统提供的内存.

编辑:关于什么构成操作系统的其他答案有一些讨论.我考虑过一个狭义的定义,其中OS是一个内核,一个为进程提供调度和服务的运行程序.这与您典型的Windows/Linux/Unix桌面/服务器操作系统相匹配.

  • 这不仅仅是性能问题.通才OS无法知道特定运行时环境认为是什么参考. (3认同)
  • @Gilles:几乎所有提供分配内存的方法的语言也提供了释放它的方法.即使C有`free()`,尽管该语言不支持GC仍然允许它使用OS强制的GC工具. (2认同)

Gil*_*il' 7

操作系统如何知道什么是垃圾,什么不是?

每种编程语言都有其规则来定义数据结构是什么以及何时数据结构被另一个数据结构引用.每种编程语言实现(即编译器,解释器,运行时)都有其表示内存中数据结构的方式.垃圾收集器需要知道如何表示数据:它需要知道什么是指针,以及指针指向的是什么.

通常,指针是存储器中的地址.但是没有办法知道哪个存储器单元包含指针以及哪些存储器单元包含一些非指针数据,这些非指针数据恰好具有正确的位模式作为有效指针.此外,需要附加信息来了解指针引用的数据的大小.

有保守的垃圾收集器,它假设每个可以解释为指针的存储器单元都是指针.即使这样,垃圾收集器也需要知道指针所指向的数据的开始和停止位置,因此垃圾收集器需要知道编程语言环境使用的内存表示.此外,垃圾收集器必须假设没有隐藏指针(例如,写入磁盘,压缩,......).

如果允许程序包含任意机器代码(大多数操作系统就是这种情况),则必须将垃圾收集留给每个编程环境.有一些专门的操作系统会强制所有程序使用相同的运行时环境(例如,所有程序都必须在JVM或.NET中运行)并且包含垃圾收集器.

操作系统通常包括特殊形式的垃圾收集器,通常基于引用计数,例如,当打开文件的进程数减少到0时关闭文件,或者同样用于共享内存区域.

  • -1没有证据,没有相关资源的链接和误导性答案.Microsoft Windows DCOM是OS提供的分布式引用计数垃圾收集器.请参阅[Wikipedia:分布式组件对象模型](http://en.wikipedia.org/wiki/Distributed_Component_Object_Model)和[Windows→开发人员中心 - 桌面→组件对象模型→管理内存分配](http://msdn.microsoft .COM/EN-US /库/窗/桌面/ ms688453(v = vs.85)的.aspx) (3认同)
  • @xmojmr DCOM仅为DCOM对象提供GC,而不是一般数据. (3认同)
  • "COM是一个独立于平台,分布式,面向对象的系统,用于创建可以交互的二进制软件组件".任何通用数据都可以(轻松)包装并插入COM生态系统.许多OO编程语言可以(本机)连接它.此处提供了普通C示例:http://www.codeproject.com/Articles/13601/COM-in-plain-C.OP没有询问"一般数据",OP询问"OS提供的垃圾收集器".你的观点是操作系统无法管理它,因为它无法知道这个或那个......是无效的(IMO) (3认同)
  • @xmojmr是的,您可以将所有数据包装到垃圾收集框架中.我提到了一些环境示例,其中所有数据都包含在我的倒数第二段中.像Windows这样的通用平台不会强迫**程序使用COM或类似的框架,这就是为什么它们无法提供通用GC的原因.它们当然可以为使用COM的程序子集提供GC. (3认同)