研究:Ruby进程&操作系统之碎碎念

Ruby为什么对Window不够友好

不知道这算不算月经贴。我想从我的课外研究的角度,来谈这个问题。

这要从一个奇怪的地方讲起。

先介绍背景:

最近想用ruby做一个 类似 master+worker 形式的程序。于是研究了一下,顺着网线找到了 《理解Unix进程》。书非常棒!

但是产生了一些问题。那本书有很多地方不理解,就是 fork之类的,信号之类的。

这本书里面介绍到有一段,比如 CHILD信号,发N个,如果你正在处理其中一个,后面陆陆续续来的N-1个,你只能wait留住1个,N-2个都是无法捕获的。 So 为什么会这样???(黑人问号.jpg)为啥要那样做?

原谅我不是科班出身,我没有学习过操作系统,编译原理,甚至是数据结构与算法。 我一直是靠着个人兴趣在这个方向上自由徒步。

好吧,其实我现在知道了,这部分属于操作系统。已经超出了Ruby的范畴了。Ruby是C语言编写的,Ruby的api本质上就是底层C的封装。Ruby其实是一个搬运工。可以参考Ruby的源码,C里面就是简单的使用了系统调用。

接着上面信号丢失的问题,因为这种性质的存在。于是,每次处理一个信号,代码里面都是 以非阻塞的形式去 读取一个缓存队列。因为 CHILD的信号,你可能收不到。但是缓存的信息,系统帮你托管了。循环一定能拿到。所以一旦用了fork写进程的代码,就会出现各种循环。而没有这个背景的人,根本无法理解这种存在。然后这部分的问题也不再属于 Ruby,而是属于 Linux/UNIX。

好了,我觉得我已经够啰嗦了。背景也介绍差不多了。

那么,我们应该至少明白一个道理:

HTML,Css,JavaScript 可以说是面向浏览器去写程序,因为浏览器负责解读他们。 Python是面向Python解释器写的程序。因为CPython解析他们。

Ruby作为一个语言也可以是一个解释器。解释器和系统交互的部分本质上是面向操作系统写的程序。它跑在操作系统中。Ruby刚开始其实是在面向Linux/Unix编写的程序。虽然后面增加了一些支持Windows的。

Linux由于其开放性,API兼容Unix任何人都可以学习研究。Linux上诞生了好多语言、编译器,数不胜数。Ruby的底层非常友好的封装了Linux/Unix的底层调用。名字也很优雅。 很显然Ruby是作者当时为了研究,在Linux上开发的一个语言程序。正如和很多程序的发展类似,Python,Perl……

他们根本没有考虑Windows因为它并不开放。所以在windows下,运行就直接借助Cygwin(一个在windows上模拟 linux的一个东西)。

站在这个角度不知道有没有讲清楚这件事情。这是我在看资料过程中的随心一想。 如果站在作者和历史的角度,能够很容易理解为什么一些软件根本不考虑windows。其实具有天然合理性。


最近在三分钟热度依然向我的目标迈进。 这里安利 《操作系统导论》,这本书竟然是一对夫妻写的,真的是有趣。

研究学习的过程中,我觉得除了书里写的东西。还有很多我自己的碎碎念,我觉得也有意思。就随便记录一下。

Mark24

Everything can Mix.