| 良's profileTang Liang's notebookPhotosBlogLists | Help |
Tang Liang's notebookEnjoying life June 15 6.14游黑龙滩March 20 关于数据库系统的学习前段时间加入TopLanguage的Group,发现这里圈子的还有不少朋友认得我。不少朋友从本科就开始关注,虽然我们并不相识。原以为我的blog会是孤岛,看来自己还是应该花不少时间去更新一下自己的blog了。写blog更多也是对自己生活,学习和工作的总结。记得最早接触blog的还在是04年初,还记得那个时候因为获得了Microsoft的MVP,认识了微软的Grace,在和她的交流中才知道原来这个世界上有个叫做blog的东西。 这段时间一直都很忙,因为除了毕业论文外,还在准备参加一个数据库开发的比赛。不过我们可不是用数据库,而是真正地开发数据库系统DBMS。硕士阶段做的东西主要是Data Mining,KDD方面的比较多。而数据库DBMS应该更多倾向于是System方向。港科大的同学也提议我应该可以去尝试做做System方面,因为我在做系统实现方面还是有一定的经验和技术。07年在微软的时候,做的东西也是偏向于System,这块领域的确是很实在,做出来的东西都是直接影响工业界和社会的。后来发现,诸如MIT,Berkerley等牛校在数据库方面都是做System较多。Data Mining,KDD则更多是偏向于机器学习,需要更多的数学理论,而非编程技巧。我本人在此之前发表的3篇学术论文也都是Data Mining方面(我的主页http://cs.scu.edu.cn/~tangliang上可以直接下载到pdf)。虽说自己的研究方向是数据库与数据挖掘,其实学了3年下来,感觉无论是数据库还是数据挖掘都学得不太好。数据挖掘是一个很大的领域,硕士3年学不好情有可原。而数据库系统,从本科就在学习,到了硕士阶段又学了一次,可是自己也不敢说真的理解清楚数据库系统。为了参加数据库的开发比赛,又重新拿起那本经典的教材《Database System Concepts》反复研究,逐步体会到了数据库系统很多以前没有体会到的精髓。 以前的数据库学习,把过多的精力放在了关系代数,关系表设计,范式,SQL等等。而真正属于数据库系统的就只有B+Tree。我相信,现在很多人都写不出来真正的B+Tree。B+Tree的Insert和Search都比较简单,而最复杂的还是Deletion。在SIGMOD1995上甚至还有一篇专门讲解B+Tree的Deletion的论文,《Implementing Deletion in B+ Tree》,这篇文章可以在Stanford的著名女大牛教授Jennifer Wisdom的网站可以下载http://infolab.stanford.edu/~widom/cs346/jannink.pdf。 除开B+Tree外,数据库系统另外一个复杂而重要的部分就是concurrency control。之前参加比赛之前,港科大的同学就劝我去看看Postgres SQL源代码。其中最复杂的部分不是Indexing,而是Concurrency Control混合的代码。记得当年Berkeley的Micheal Stonebraker开启了这个Postgres的项目,后来霸占了数据库最顶尖的SIGMOD八十年代无数篇papers,于是PostgresSQL也获得一个学院派的数据库称号。而我个人是在看不过来PostgresSQL的源代码了,自从在cygwin上编译成功之后,看了一些heap file之后,就再也没有碰过了。这次参加的数据库开发比赛的发起人也是这位传说中的神人Micheal Stonebraker,不过他现在已经到了MIT。这里的concurrency control应该分成两部分来看,一部分是indexing,cache, heap file的同步访问,另外一部分就是保持ACID(Atomic,Consistent,Isolation, Duarable)的事务(Transaction)控制。说到Transaction事务的提起,就不得不提到曾经为此拿到图灵奖的微软的另一位神人,Jim Grey。可能很多人提到这位神人,都会想起他前年在太平洋上失踪的事件。我想,或许他真的是某个外星球派到地球上的神人,帮助人类完成数据库上Transaction的设计,大功告成后回到自己的星球去了。官方的可信的说法是,他在太平洋上遇到了海盗。海盗可不管他是不是什么数据库神人,还是微软的首席科学家什么的。在第一部分的数据部分的同步访问,主要涉及到对复杂的数据结构加锁,多线程的技巧等等。它是提高并发性的关键。在网上有很多关于索引加锁的PPT教程,需要注意的就是加锁的顺序。因为保持加锁顺序是防止死锁的根本保障。比如说,我在实现我们的数据库系统的时候,对索引树加锁的顺序始终保持从根结点到叶子结点。这里还会涉及到“乐观锁”和“悲观锁”的加锁策略。这些在数据库的教材上都有详细讲解。在控制事物的ACID方面,数据库的书上主要讲解了两阶段锁(Two-Phase Locking)的策略。这也是现在大部分数据库,SQL SERVER,ORACLE等默认的事物控制原则。一般的教材都有比较严格的讲解。两阶段的协议本身是很简单的,不过要证明两阶段能够实现真正的ACID却要花掉教材上很多篇幅的讲解。个人感觉两阶段锁在很多时候都过于严格。去年2008年的SIGMOD best paper: Serializable Isolation for Snapshot Databases(http://www.sigmod.org/sigmodinfo/awards/#bestpaper)都还在研究多版本控制,snapshot的事物控制方式。其实说到多版本控制的事务实现,最直观的体会就是大家常用的源代码版本控制软件CVS,SVN。它能够保证大家任何时候都能读和写其中源代码,只是最后commit的时候提示你冲突。对于数据库系统来说,如果commit冲突了,无非也就abort其中一个transaction,再执行一遍。而CVS,SVN则要求用户自己去解决这个冲突。 除开索引和事务控制外,数据库系统其他部分的东西就是Cache和Heap file,而这两部分相对简单一些。因为在其他很多存储系统上,Cache都经常用到,诸如什么最近最少的替换原则,在操作系统的课程上都讲了很多。其实,国外某些大学甚至把操作系统和数据库系统两门课程放到一起来讲解。而Heap file似乎很少在国内的数据库教材上看到。Heap file本身也没多大的技术含量,只是我们不能忘了,真的数据都是存在heap file内的。以前还有人提出sort file。不过sort file虽然search时候更快,但是插入删除的时候需要移动的数据实在太多。不要忘了Heap File和Sort File都是在外存的介质上,移动数据的效率是十分低的。所以现在所有的数据库系统SQL SERVER,ORACLE,MYSQL等都用Heap file。 国内的数据库系统课程设计,几乎都只是讲讲书本上的东西。而国外诸如MIT这些牛校,将每门课程的时候都要求学生动手去做一个实际的系统出来。MIT在他们的OpenCourse网站上的Database System课程里面,就要求学生动手实现一个叫做TinyDB的小数据库系统。
February 03 朋友说我不应该喜欢《Revolutionary Road》
《Revolutionary Road》是一部很平常的生活片,没有惊险刺激的剧情,浪漫的爱情邂逅,但是却有任何人都能体会到的中年压抑。影片开头展现出来的boring的工作,没有了新鲜感的婚姻,家庭子女的负担,几乎是每个中年人都经历过的困惑。唯一的出路就是为生活寻找新的方向。这个方向或许是工作上的突破,也或许是居地的搬迁,孩子的诞生,甚至可能是婚姻的出轨。不同的选择造就了家庭的冲突,而在欧美男女平等的家庭里面,这种冲突并非是那么容易解决的,必需有一方的妥协。 我始终觉得,《Revolutionary Road》里面最好的角色是老邻居家里的精神病儿子。一个Mathematics的PhD,绝对的天才,但却始终被精神病困扰着,被锁在家或者精神院里。其实,大家都可以想到这种人恰恰是因为严重自闭,导致了思想与外界脱离,就正如《飞跃疯人院》里面的诸多病人。然而,导演的巧妙之处,却恰恰是让这个看似自闭与外界脱离的精神病人,道出了对男女主角的选择的评判。是“众人皆醒,唯我独醉”,还是“众人皆醉,唯我独醒”? February 02 《亡命之徒》的名字其实取得很好纵贯线在春晚压轴的节目表演的歌曲明明是《亡命之徒》,而CCTV居然把别人歌曲的名字改成《出发》。或许《亡命之徒》这个名字是在不太和谐,但是如果细细听一下这首歌曲的词意,其实还是很上进健康的意义,而且特别真实。个人感觉还是《亡命之徒》更合适。这个世界的确有太多疯狂的地方,如果想一个人已经开始出发了,他必须得跟这个世界一样疯狂,在外人眼里必然一个亡命之徒。 不知道从什么时候开始,本人听歌曲更喜欢现场演唱会了。因为现场演唱会不会带有录音棚,苹果软件的调整,音乐更接近真实的情感。纵贯线,还有伍佰们,现场的歌曲始终比出来的唱片更有激情。
January 20 The Road of Hacking PostgreSQL (1)最近在写一些大规模数据存储和查询的小程序,发现很多核心的技术还是来自于我们的数据库技术。然后,真正到做的时候才晓得原来自己对于数据库很多本质的东西的理解并不透彻。我感觉,数据库技术真正核心的是数据的物理存储,外存内存交互,索引这些东西。而关系代数,SQL语言这些都是其次的。诸如现在的Google的bigTable等东西,其实最本质的技术还是在数据库领域。和真正做数据库的同学聊了一会,觉得自己真的应该好好研究一下现在已经成熟的数据库产品。作为学习数据库的同学都知道PostgreSQL在数据库界的地位了,同时它又是开源的。 在Windows上安装PostgreSQL已经很简单了,因为官方网站已经提供了Windows版本的下载。不过我的目的是学习PostgreSQL的源代码,那么肯定是要下原始的代码,然后自己编译,安装,运行。整个编译运行环境还是必须得是Unix/Linux,所以我首先尝试再Cygwin下安装。 Cygwin的安装最好齐全,诸如什么flex,bison,g++,readline,cygserver,perl这些肯定是要安装的了。我下的PostgreSQL版本是最新的postgresql-8.3.5。接下来的configure,make和make install都比较正常。不过奇怪的是,cygwin的bash执行时间长了,居然和卡巴斯基2009冲突,卡巴斯基的avp.exe一直占用50%左右的CPU,并且使得cygwin的bash始终卡住。后来我关掉卡巴斯基就OK了。编译过程也不算太长,比起之前编译的insight好短很多了。 网上有很多《Cygwin下面安装postgreSQL》文章,都抄来抄去的那一篇。于是我也按上面的办法开始安装。不过有点奇怪的就是我执行cygserver-config的时候居然找不到cygrunsrv.exe。通过Google找到它,然后copy都cygwin/bin目录下。initdb都OK了。接下来又发生奇怪的事情。pg_ctl.exe,createuser.exe,createdb.exe执行之后都直接返回,没有任何提示信息。但是数据库并没有启动起来。后来在Windows命令控制台下执行,提示说什么PQMesssege**函数再cygpg.dll定位不到。在cygwin/bin目录的确已经有cygpg.dll啊。难道是PostgreSQL和当前的cygwin版本不匹配? 然后我又从cygwin的setup下了cygwin自带的postgreSQL-8.2.9。似乎它要通过什么cygport来打patch,compile,install。敲入命令之后,再执行,结果到了后来还是遇到error了,中止了。这个时候我就快崩溃了。。。 我能想到唯一的解决方案就是装一个纯正的Linux算了。于是下了Ubuntu 8.10和VMWare。不过我没有装VMWare Workstation,那个家伙光是安装文件都有500MB,而且盗版还要招破解序号,太麻烦了。我装的是VMWare Player 2.5.1,只有40多M,免费软件。它除了不能制作vmx虚拟机文件外,其他的功能都齐全。至于vmx虚拟机文件可以从http://www.easyvmx.com 在线订做,1分钟就搞定了,下载之后也只有几K的空文件。用VMWare Player打开就可以安装Ubuntu了。下面就是我的VMWare Player跑起来的一个截图,做得小巧,不错! 默认的Ubuntu安装之后,还有很多软件没有安装齐备。就连g++都没有,VIM也只有tiny common文件。那么又要开始漫长的下载和安装必要的Ubuntu程序文件了。。。这个时候我再回到Windows下试试我的cygwin。发现,pqsql目录下,除了bin外,还有一个lib,里面有很多dll,而且居然还有刚报错的那个cygpq.dll。我估计pg_ctl.exe等需要的应该是这里面的dll,于是拷贝所有的dll到了bin目录下。然后pg_ctl.exe,createuser.exe,createdb.exe都work了!!! 搞了我一个晚上和一个上午,总算把postgreSQL跑通了。这里附带一篇psql的用法(http://www.chinalinuxpub.com/doc/psql/app-psql.html),否则进入psql都还不知道怎么敲命令呢。 好了,从下一篇《The Road of Hacking PostgreSQL》开始,我就深入PostgreSQL源代码的内部做分析和介绍了。最近我还再继续看我最钟爱的《X档案》,最后借用它的结束语也是:To be continued…. January 17 做一个专业的coder(1)学习coding技能数十载,大部分局限于Windows与Java平台。趁现在有点时间,还是从专业点的Linux C/C++开发以及环境学习。其实早在几年前,本人还是接触过Linux平台下的C/C++开发,不过始终没有做过什么正式项目,所以不足挂齿。最近一直在写一个开源的高维空间的近似搜索引擎,于是就拿这个开源项目作为练手的项目了。 首先汇报一下自己的开发平台: 下面是我配置的第一个_vimrc:
现在一方面要学习VIM的编辑方式,还要学习GDB的调试。幸好以前学习ucLinux的时候,对Makefile,gcc的使用还比较了解。最后贴上一张GVIM开发工作时候的贴图作为纪念: |
|
|||||
|
|