系统程序员成长计划
文章平均质量分 86
李先静
Only those who attempt the absurd can achieve the impossible.
展开
-
《系统程序员成长计划》成长过程
转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 《系统程序员成长计划》的起源应该追溯到六年前了。04年我进入恒基伟业深圳研发部,参与商务通隐形手机开发。在此之前我是做服务器软件开发的,对嵌入式软件开发非常好奇,所以想方设法进入这个行业。恒基伟业在嵌入式方面的实力也是相当高的,很多在消费类设备方面的开原创 2010-04-12 20:40:00 · 11440 阅读 · 22 评论 -
系统程序员成长计划-算法与容器(三) (下)
系统程序员成长计划-算法与容器(三) (下) 转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 在继续学习之前,我们先介绍几个概念:静态库:在Linux下,静态库的扩展名为.a,a代表archive的意思。正常情况下一个C源文件编译之后生成一个目标文件(.o),目标文件里存放的是程序原创 2009-03-26 08:05:00 · 3231 阅读 · 0 评论 -
系统程序员成长计划-算法与容器(三) (上)
系统程序员成长计划-算法与容器(三) (上) 转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 前面我们通过容器接口抽象了双向链表和动态数组,这样队列的实现就不依赖于具体的容器了。但是作为队列的使用者,它仍然要在编译时决定使用哪个容器。队列的测试程序就是队列的使用者之一,它的实现代原创 2009-03-24 07:27:00 · 2816 阅读 · 0 评论 -
系统程序员成长计划-容器与算法(二)(下)
系统程序员成长计划-容器与算法(二)(下) 转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 这个反序函数的原理很简单,有的读者很快就写出来了:Ret invert(LinearContainer* linear_container){ int i = 0; int j = 0; void*原创 2009-03-20 07:22:00 · 2933 阅读 · 0 评论 -
系统程序员成长计划-容器与算法(二)(上)
系统程序员成长计划-容器与算法(二)(上) 转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 容器用来存储数据,算法用来处理数据。容器有多种,算法的种类更多,两者的组合数目就数不胜数了。如果同样的算法要为每种容器都写一遍,写的时候单调不说,维护起来也很困难。所以我们一直在寻找让算法独立原创 2009-03-16 21:49:00 · 3772 阅读 · 0 评论 -
系统程序员成长计划-并发(四)(上)
转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 读写锁在前面的实现中,像dlist_length这类的查询函数也要加锁,那样才能保证在查询过程中对象的状态不会被其它线程所改变。加锁阻止了其它线程修改对象,也阻止其它线程查询对象。如果大多数情况下,线程只是查询对象的状态而不修改它,这种设计不是一种高效的方法,原创 2008-12-29 07:46:00 · 3575 阅读 · 0 评论 -
系统程序员成长计划-容器与算法(一)(上)
系统程序员成长计划-容器与算法(一)(上) Sunday, March 08th, 2009 | Author: admin | » Edit « 转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 系统程序员成长计划-容器与算法(一)(上)前面我们通过组合的方法,用双向链表实现了队原创 2009-03-09 07:25:00 · 5527 阅读 · 0 评论 -
系统程序员成长计划-并发(三)(下)
转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 嵌套锁与装饰模式嵌套锁的实现算法加锁: o如果没有任何线程加锁,就直接加锁,并且记录下当前线程的ID。 o如果是当前线程加过锁了,就不用加锁了,只是将加锁的计数增加一。 o如果其它线程加锁了,那就等待直到加锁成功,后继步骤与第一种情况相同。原创 2008-12-23 07:43:00 · 3919 阅读 · 3 评论 -
系统程序员成长计划-容器与算法(一)(下)
系统程序员成长计划-容器与算法(一)(下) 转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 容器在运行时动态选择实现方式,这个问题可是有点难度的。我很少见人能独立完成,最常见的做法是:用一个参数来决定调用双向链表的函数还是动态数组的函数。如:Ret queue_head原创 2009-03-11 07:38:00 · 6056 阅读 · 1 评论 -
系统程序员成长计划-组合的威力(四)
转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 哈希表前面我们已经体会到了组合的威力,用短短几十行代码就搞定了队列和栈。现在轮到哈希表了,在此之前已经有几位读者向我抱怨,哈希表太难写了!其实哈希表也很简单,前面我们说了队列和栈只不过是链表或者数组的特殊情况而已,哈希表当然不再是链表或者数组的特殊情况了,但是我们同原创 2009-03-04 07:38:00 · 5645 阅读 · 0 评论 -
系统程序员成长计划-并发(三)(上)
转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 嵌套锁与装饰模式在生产者-消费者的练习中,当由双向链表的实现者负责加锁时,一般都会遇到莫名其妙的死锁问题。有的读者可能已经查出来了原因是嵌套的加锁。比如在dlist_insert中调用了dlist_length,进入dlist_insert时已经加了一次锁,再原创 2008-12-19 07:54:00 · 3481 阅读 · 0 评论 -
系统程序员成长计划-并发(二)(下)
转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 面对这个需求,一些初学者可能有点蒙了。以前在学校的时候,对于课本后面的练习,我总是信心百倍,原因很简单,我确信这些练习不管它的出现方式有多么不同,但总是与前面学过的知识有关。记得《如何求解问题—现代启发式方法》中说过,正是这种练习的方式妨碍了我们解决问题的能力原创 2008-12-18 07:23:00 · 4730 阅读 · 2 评论 -
系统程序员成长计划-组合的威力(三)
转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 栈栈是一种后进先出(LIFO, last in firstout)的数据结构,与队列的先进先出(FIFO)相比,这种规则似乎不太公平,计算机可不管这个。事实上,栈是最重要的数据结构之一:没有栈,基于下推自动机的编译器不能工作,我们只能写汇编程序。没有栈,无法实现原创 2009-03-02 07:34:00 · 3936 阅读 · 0 评论 -
系统程序员成长计划-并发(二)(上)
转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 在生产者-消费者的练习中,大部分人选择了由调用者来加锁:作为生产者,往双向链表里插入数据时,先加锁,插入数据,然后解锁。作为消费者,从双向链表里取数据时,先加锁,删除数据,然后解锁。这是合理的,不过有点麻烦:每个调用者都要做这些动作,如果其中一个调用者忘记了解原创 2008-12-17 07:13:00 · 4635 阅读 · 0 评论 -
系统程序员成长计划-工程管理(一)
系统程序员成长计划-工程管理(一) 转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 到目前为止本书的上半部分已经完成了。在上半部分中,我们学习了基本的数据结构、算法和设计思想。在进行深入学习之前,我们把前面所写的代码整理成一个通用的函数库,这个函数可能在以后的工作中用得着。前面我们写的Makefile非常简单原创 2009-03-31 07:22:00 · 4528 阅读 · 1 评论 -
系统程序员成长计划-工程管理(二)
系统程序员成长计划-工程管理(二) 转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 系统程序员成长计划-工程管理(二)HelloWorldautomake比起IDE要复杂很多,这里我们先写一个Hello World例子,明白其中的基本概念后,再用它来管理实际的工程。o目录结构原创 2009-04-02 07:51:00 · 3609 阅读 · 0 评论 -
系统程序员成长计划-工程管理(三)
转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 系统程序员成长计划-工程管理(三)函数库现在我们用automake来管理我们前面所建立的函数库,这是一个基础的函数库,我们就把它命名为base吧。o 目录结构base 根目录base/src 源代码目录o 创建Makefile模板base/Mak原创 2009-04-10 09:10:00 · 5135 阅读 · 2 评论 -
Android中的NotificationManager
转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 NotificationManager支持Toast和Notification两种通知方式,前者相当于一个定时关闭的对话框,后者是在状态栏上显示一条消息。Toast和Notification都可以随时取消。INotificationManager的接口定义如下:原创 2009-11-12 09:24:00 · 6469 阅读 · 1 评论 -
系统程序员成长计划-管道过滤器(Pipe-And-Filter)模式
系统程序员成长计划-文本处理(三) Sunday, June 28th, 2009 | Author: admin | » Edit « 转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 系统程序员成长计划-文本处理(三)管道过滤器(Pipe-And-Filter)原创 2009-06-29 20:32:00 · 13305 阅读 · 10 评论 -
系统程序员成长计划-文本处理(二)
系统程序员成长计划-文本处理(二) Thursday, June 25th, 2009 | Author: admin | » Edit « 转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 Builder模式前面我们学习了状态机,并利用它来解析各种格式的文本数据。原创 2009-06-25 21:21:00 · 5776 阅读 · 7 评论 -
系统程序员成长计划-文本处理(XML解析器)
系统程序员成长计划-文本处理(一) Sunday, June 07th, 2009 | Author: admin | » Edit « 转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 系统程序员成长计划-文本处理(一)状态机(4)XML解析器XML(Ex原创 2009-06-11 21:19:00 · 7567 阅读 · 8 评论 -
系统程序员成长计划-文本处理(INI解析器)
系统程序员成长计划-文本处理(一) Sunday, June 07th, 2009 | Author: admin | » Edit « 转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 系统程序员成长计划-文本处理(一)状态机(3)o INI解析器上面我们原创 2009-06-09 20:35:00 · 9305 阅读 · 13 评论 -
系统程序员成长计划-文本处理(一)状态机(1)
系统程序员成长计划-文本处理(一)状态机(1) Sunday, June 07th, 2009 | Author: admin | » Edit « 转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 系统程序员成长计划-文本处理(一)状态机(1)o 有穷状态机的原创 2009-06-07 16:26:00 · 8762 阅读 · 4 评论 -
系统程序员成长计划-文本处理(一)状态机(2)
系统程序员成长计划-文本处理(一) Sunday, June 07th, 2009 | Author: admin | » Edit « 转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 系统程序员成长计划-文本处理(一)状态机(2)o 用有穷状态机解一道面试题原创 2009-06-07 16:28:00 · 6766 阅读 · 8 评论 -
系统程序员成长计划-像机器一样思考(三)
系统程序员成长计划-像机器一样思考(三)作者联系方式:李先静 系统程序员成长计划-像机器一样思考(三)hello world的密秘hello world是最经典的入门程序,该程序因Brian Kernighan 和DennisRitchie编写的《C语言程序设计》(The C Programming Language)而广泛流传。helloworld同样也是深原创 2009-05-26 07:07:00 · 7458 阅读 · 30 评论 -
系统程序员成长计划-像机器一样思考(二)
转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 谁在call我-backtrace的实现原理显示函数调用关系(backtrace/callstack)是调试器必备的功能之一,比如在gdb里,用bt命令就可以查看backtrace。在程序崩溃的时候,函数调用关系有助于快速定位问题原创 2009-05-21 21:13:00 · 4731 阅读 · 15 评论 -
系统程序员成长计划-像机器一样思考(一)
系统程序员成长计划-像机器一样思考(一) Sunday, May 10th, 2009 | Author: admin 转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 变参函数的实现原理C语言要求函数调用者按照函数原型进行调用,如果调用参数与函数原型不一致,编译器就会发出原创 2009-05-10 16:16:00 · 5741 阅读 · 8 评论 -
系统程序员成长计划-内存管理(四)
系统程序员成长计划-内存管理(四) 转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 惯用手法 《POSA(面向模式的软件架构)》中根据模式粒度把模式分为三类:架构模式、设计模式和惯用手法。其中把分层模式、管道过滤器和微内核模式等归为架构模式,把代理模式、命令模式和出版-订阅模式等归为设计模式,而把引用计数原创 2009-04-29 08:01:00 · 4203 阅读 · 2 评论 -
系统程序员成长计划-内存管理(一)
系统程序员成长计划-内存管理(一) Wednesday, April 22nd, 2009 | Author: admin | » Edit « 转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 共享内存 大家都知道,进程的地址空间是独立的,它们之间互不影响。比如同样地址为0xab原创 2009-04-22 08:25:00 · 4499 阅读 · 2 评论 -
系统程序员成长计划-内存管理(三)
转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 内存管理器在前面学习共享内存的时候,我们重新实现了循环队列,两个实现的不同之处只是在于内存分配和释放上。对比一下 fifo_ring_create的实现:第一种实现用malloc分配内存。FifoRing* fifo_ring_create(size_t len原创 2009-04-24 08:46:00 · 6510 阅读 · 4 评论 -
系统程序员成长计划-写得又快又好的秘诀(六)
转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 Save your work“Ernst和Young所在的小组决定使用正规的开发理论—他们常用削减法,分阶段进行开发并具有中途交付能力。他们的步骤包括细致的分析和设计—正如本章描写的基本原则一样。而其他竞争者径直开始了编码,在开始几个小时里,Ernst和You原创 2008-12-12 07:22:00 · 6954 阅读 · 0 评论 -
系统程序员成长计划-并发(一)(下)
转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 Linux下的多线程编程使用pthread(POSIXThread)函数库,使用时包含头文件pthread.h,链接共享库libpthread.so。这里顺便说一下gcc链接共享库的方式:-L用来指定共享库所在目录,系统库目录不用指定。-l用来指定要链接的原创 2008-12-16 07:45:00 · 5580 阅读 · 0 评论 -
系统程序员成长计划-Don’t Repeat Yourself(DRY)(上)
转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 需求简述这里我们请读者实现下列功能:对一个存放整数的双向链表,找出链表中的最大值。对一个存放整数的双向链表,累加链表中所有整数。多写多练,不要偷懒,写完之后请仔细思考一下有无改进的余地。欢迎到Linux mobile development上交流原创 2008-11-20 07:00:00 · 3865 阅读 · 0 评论 -
系统程序员成长计划-动态数组(一)(上)
转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 双向链表和动态数组是最简单的两种数据结构,在研读大量源代码之后,我发现正是这两种最简单的数据结构有着最广泛的应用。像平衡二叉树这样的复杂数据结构,除了学习之外,你永远都不会写第二遍,甚至连使用的机会都没有,而双向链表和动态数组则会在开发中反复的运用。也正是由于原创 2009-01-14 07:51:00 · 5461 阅读 · 0 评论 -
系统程序员成长计划-拥抱变化(上)
转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 需求简述大部分初学者在编写双向链表时,为了验证相关函数工作是否正常,都会编写一个dlist_print的函数,它的功能是在屏幕上打印出整个双向链表中的数据。从客观上讲,用dlist_print输出的信息来判断dlist的正确性不是最好的办法,不过脑袋里有质量概念总是值得表扬的。当把专用原创 2008-11-16 18:45:00 · 4768 阅读 · 1 评论 -
系统程序员成长计划-拥抱变化(下)
转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 在专用双向链表中,dlist_printf的实现非常简单,如果里面存放的是整数,用”%d”打印,存放的字符串,用”%s”打印。现在的麻烦在于双向链表是通用的,我们无法预知其中存在的数据类型,也就是我们要面对数据类型的变化。怎么办呢?初学者常见的做法有:1.实现多个原创 2008-11-18 07:08:00 · 5230 阅读 · 3 评论 -
系统程序员成长计划-Write once, run anywhere(WORA)(上)
转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 需求简述Write Once, DebugEverywhere。据说这是流传于JAVA程序员中间的一句笑话,Sun公司用来形容JAVA的跨平台性的原话是Write once, runanywhere(WORA) 。后者是理想的,前者才是现实。如果我们的原创 2008-11-10 07:46:00 · 4527 阅读 · 0 评论 -
系统程序员成长计划-并发(五)
转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 无锁(lock-free)数据结构提到并行计算通常都会想到加锁,事实却并非如此,大多数并发是不需要加锁的。比如在不同电脑上运行的代码编辑器,两者并发运行不需要加锁。在一台电脑上同时运行的媒体播放放器和代码编辑器,两者并发运行不需要加锁(当然系统调用和进程调度是原创 2008-12-31 07:57:00 · 5806 阅读 · 6 评论 -
系统程序员成长计划-并发(四)(下)
转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 读写锁读写锁在加锁时,要区分是为了读而加锁还是为了写而加锁,所以和递归锁不同的是,它无法兼容Locker接口了。不过为了做到不依赖于特定平台,我们可以利用Locker的接口来抽象锁的实现。利用现有的锁来实现读写锁。读写锁的可变的部分已经被Locker隔离了,所以读写锁本身不需要做成接口原创 2008-12-30 07:25:00 · 4054 阅读 · 3 评论 -
系统程序员成长计划-谁动了你的隐私(下)
转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 1.什么封装?人有隐私,程序也有隐私。有隐私不是什么坏事,没有隐私人就不是人了,程序也不成其为程序了。问题是隐私不应该让别人知道,否则伤害的不仅仅是自己,相关人物也会跟着倒霉,“艳照门”就是个典型的例子。程序隐私的暴露,造成的伤害不一定有“艳照门”大,也不一定原创 2008-11-04 07:11:00 · 8239 阅读 · 0 评论