Pal*_*ini 9 garbage-collection operating-system programming-languages memory-management
我想知道这是因为操作系统负责内存管理.为什么编程语言必须实现自己的垃圾收集器?
我想知道那是因为OS不负责内存管理吗?
仅在操作系统为程序分配内存的意义上,程序然后决定如何使用自己的内存管理器来使用它.在操作系统中进一步集中内存管理是有问题的,因为它会很慢:程序具有不同的内存访问模式,因此为它们提供所有相同的GC将使程序员更难以使用自定义内存管理模式.例如,不同的语言运行时需要不同的垃圾收集器以有效的方式支持语言的习语.它还会要求操作系统管理程序中的内存,从而使操作系统设计复杂化.
实际上,在某种意义上,操作系统已经提供了GC:当程序退出时,典型的OS将清理其内存.但只要程序运行,它就负责管理操作系统提供的内存.
编辑:关于什么构成操作系统的其他答案有一些讨论.我考虑过一个狭义的定义,其中OS是一个内核,一个为进程提供调度和服务的运行程序.这与您典型的Windows/Linux/Unix桌面/服务器操作系统相匹配.
操作系统如何知道什么是垃圾,什么不是?
每种编程语言都有其规则来定义数据结构是什么以及何时数据结构被另一个数据结构引用.每种编程语言实现(即编译器,解释器,运行时)都有其表示内存中数据结构的方式.垃圾收集器需要知道如何表示数据:它需要知道什么是指针,以及指针指向的是什么.
通常,指针是存储器中的地址.但是没有办法知道哪个存储器单元包含指针以及哪些存储器单元包含一些非指针数据,这些非指针数据恰好具有正确的位模式作为有效指针.此外,需要附加信息来了解指针引用的数据的大小.
有保守的垃圾收集器,它假设每个可以解释为指针的存储器单元都是指针.即使这样,垃圾收集器也需要知道指针所指向的数据的开始和停止位置,因此垃圾收集器需要知道编程语言环境使用的内存表示.此外,垃圾收集器必须假设没有隐藏指针(例如,写入磁盘,压缩,......).
如果允许程序包含任意机器代码(大多数操作系统就是这种情况),则必须将垃圾收集留给每个编程环境.有一些专门的操作系统会强制所有程序使用相同的运行时环境(例如,所有程序都必须在JVM或.NET中运行)并且包含垃圾收集器.
操作系统通常包括特殊形式的垃圾收集器,通常基于引用计数,例如,当打开文件的进程数减少到0时关闭文件,或者同样用于共享内存区域.