这本书其实不是面向python用户的,而是剖析python的运行时实现。更适合于进阶C程序员以提高C语言能力。
不过不知道是作者功底不够,还是时间太紧,很多地方作者罗里罗嗦的写了好几页纸,比人家源代码还长,可还没有源代码里的注释讲得清楚。
我仔细看过的有第十六章《Python的内存管理机制》,下面以这个为例。
这章只讲python的obmalloc.c这一个文件,很多内容直接是从注释中拷贝的(比如图16-1),可是注释中最关键的几个地方,书中都没说清楚。
关于struct pool_header,作者花了两页纸讲free block链表的管理,其实free block链表本身是《操作系统》课程中的基本概念,没有必要花这么大篇幅,更没有必要使用“你会发现freeblock开始成为一个苏醒的精灵”这类废话。
这一部分,真正令人迷惑的是pool_header中的nextoffset和maxnextoffset,这两个member是在pool初始阶段用于管理空闲block的,其功能完全可以被freeblock取代,但是为什么python实现要加上这两个member呢?
书中对这个疑惑不着一字,而看注释就非常明白:如果起始就构建一个完整的空闲block列表,会访问整个pool的所有block;而nextoffset则只需要访问pool的前段,这样可以利用机器的VM机制,达到“没有真实访问就不用OS真的分配从而节省内存”的目的。
又比如usedpool数组,代码设计得非常别扭。书中对其如何别扭的工作有讲述,但是对为什么要这么设计,没有说一句话;同样在注释中,注释的作者说“我也不清楚为什么要搞得这么复杂,也许是为了增加cache友好性,但是实在代价有点高”。
再有锁的问题,在源码中只有一句话“ * Python's threads are serialized, so object malloc locking is disabled.” 我不熟悉python的线程,理解不了为什么内存分配可以不用锁,想到书中找答案,结果书中也是完全忽略,一个字的评论都没有。
还有一个问题,陈儒总是把malloc和free说成是“操作系统提供的内存管理接口”,这个说法不太严谨,malloc和free是C库提供的,brk才是OS的接口。 在源码注释中,用的说法是“Underlying general-purpose allocator”,就非常准确。
不过话说回来,这本书在国产IT著作中算是不错了,至少看得出来作者是很诚恳的看过代码,也很诚恳的与读者分享。结合这本书看代码,我觉得自己的功力有明显提升 :)