Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.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
Ruby on rails Ruby中子进程/分叉进程的垃圾收集_Ruby On Rails_Ruby_Process_Garbage Collection - Fatal编程技术网

Ruby on rails Ruby中子进程/分叉进程的垃圾收集

Ruby on rails Ruby中子进程/分叉进程的垃圾收集,ruby-on-rails,ruby,process,garbage-collection,Ruby On Rails,Ruby,Process,Garbage Collection,今天我准备好了一篇关于Ruby的GC垃圾收集的文章,但有几点让我感到困惑 假设我们正在使用Unicorn为我们的站点提供服务。Unicorn使用工作进程来处理请求。工作进程通常是父进程/主进程的分叉进程。现在我的问题是GC发生在哪里?我的意思是,每个分叉进程都有自己的Ruby进程运行副本,并且每个分叉进程单独进行GC,还是每个分叉进程都使用相同的Ruby进程,即从主进程开始,GC在那里进行?若后者为真,那个么分叉进程如何从父进程共享Ruby之类的东西呢 据我所知,每个分叉进程都有自己的Ruby运

今天我准备好了一篇关于Ruby的GC垃圾收集的文章,但有几点让我感到困惑

假设我们正在使用Unicorn为我们的站点提供服务。Unicorn使用工作进程来处理请求。工作进程通常是父进程/主进程的分叉进程。现在我的问题是GC发生在哪里?我的意思是,每个分叉进程都有自己的Ruby进程运行副本,并且每个分叉进程单独进行GC,还是每个分叉进程都使用相同的Ruby进程,即从主进程开始,GC在那里进行?若后者为真,那个么分叉进程如何从父进程共享Ruby之类的东西呢

据我所知,每个分叉进程都有自己的Ruby运行版本,当子进程分叉时会被复制

非常感谢您的帮助


谢谢

每个分叉进程都有自己的父进程的整个内存空间副本,这一点过去是正确的。这就是为什么Ruby基于进程的web服务器直到最近还需要如此多的内存

但是,从Ruby 2.0开始,分叉进程现在遵循写时拷贝原则。也就是说,分叉进程与其父进程共享尽可能多的数据。这意味着子进程使用的内存比以前少得多,因为它们不再需要复制父进程的整个内存空间。当子进程需要修改其与父进程共享的内存的一部分,或者父进程需要修改其与子进程共享的内存的一部分时,子进程将仅复制该部分。这就是为什么它被称为“写时复制”:


关于垃圾收集,这发生在每个Ruby进程中。希望以上解释能够清楚地说明这种方法的工作原理。

感谢您的回复,并以清晰的方式对此进行了解释。关于奶牛原则,你们是对的,我知道,但你们确实简明扼要地解释了这一点。因此,每个子进程都将运行自己的Ruby进程,每个进程将分别进行垃圾收集。这意味着在工作进程模型中,若系统有更多的内核,即使是MRI也可以受益于并行执行,因为每个进程都是独立运行和处理的。我说得对吗?你说得对。进程并行化是由操作系统完成的,因此不会像Ruby线程那样有同样的缺点,因为GIL,在同一进程中运行的线程不会并行执行。