Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory management 为什么';操作系统没有垃圾收集器吗?_Memory Management_Garbage Collection_Operating System_Programming Languages - Fatal编程技术网

Memory management 为什么';操作系统没有垃圾收集器吗?

Memory management 为什么';操作系统没有垃圾收集器吗?,memory-management,garbage-collection,operating-system,programming-languages,Memory Management,Garbage Collection,Operating System,Programming Languages,我想知道这一点,因为操作系统负责内存管理。为什么编程语言必须实现自己的垃圾收集器?垃圾收集将由自己的软件在软件编程或编码时进行,但这很复杂,需要开发人员的高级经验 通常,用C和C++编写的程序不具有像java或PHP那样的程序的自动内存管理。这意味着C++编写的程序要求程序员定义软件使用的数据将在不再使用时从内存中删除。 所以,你使用的很多程序都是用C和C++编写的,而且大多数情况下内存管理效率不高。当运行这些程序时,您的内存将包含许多不再使用的片段,这是程序的故障。我知道唯一的选择就是重启电脑

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

垃圾收集将由自己的软件在软件编程或编码时进行,但这很复杂,需要开发人员的高级经验

通常,用C和C++编写的程序不具有像java或PHP那样的程序的自动内存管理。这意味着C++编写的程序要求程序员定义软件使用的数据将在不再使用时从内存中删除。 <>所以,你使用的很多程序都是用C和C++编写的,而且大多数情况下内存管理效率不高。当运行这些程序时,您的内存将包含许多不再使用的片段,这是程序的故障。我知道唯一的选择就是重启电脑

我同意SO本身应该有一些工具来“清理未使用的内存空间”,就像Android(例如Ccleaner)一样

我很好奇,因为操作系统不负责内存管理吗

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

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


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

操作系统如何知道哪些是垃圾,哪些不是垃圾

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

通常,指针是内存中的地址。但是,没有办法先验地知道哪些存储单元包含指针,哪些存储单元包含一些非指针数据,而这些数据恰好具有正确的位模式作为有效指针。此外,需要额外的信息来了解指针引用的基准的大小

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

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

操作系统通常包括特殊形式的垃圾收集器,通常基于引用计数,例如,当打开文件的进程数降至0时关闭文件,或者对于共享内存区域也是如此。

确实如此。 垃圾收集要求操作系统知道什么是垃圾,什么不是垃圾,最简单的方法是某种类型的安全保证。一些实验性操作系统,如和,在内核级别提供类型安全语言运行时:Es中的JavaScript和Singularity中的C#变体。但是大多数内核都是为了允许应用在流行的不安全语言,如C++中运行的。在这种情况下,内核所能做的就是回收已终止的进程所占用的内存

因此,大多数内核将属于特定进程的内存管理委托给语言运行时。所有主要桌面操作系统的默认安装都包括多个垃圾收集语言运行时,应用程序可以在其中运行

  • NET Framework附带所有受支持的Windows桌面版本
  • Python附带了OSX和流行的GNU/Linux发行版
  • Android包括Dalvik VM,它实现了与Java相同的垃圾收集
  • 此外,所有桌面和移动操作系统都附带了实现JavaScript的web浏览器

性能原因。@IgnacioVazquez Abrams不,一点也不。这个问题似乎离题了,因为它是关于操作系统设计的,并没有提出实际的编程问题。也许对这个问题来说是个更好的地方。这不仅仅是性能的问题。通才操作系统无法知道特定的运行时环境认为什么是引用。@Gilles:这只是在语言运行时提供适当的挂钩的问题。@IgnacioVazquez Abrams这就像说解决交通堵塞“只是”我的问题