摘要: 阅读开源项目的源代码是提高自己编程能力的好方法,而有一个好的源代码阅读工具无疑能够让你在阅读源代码时事半功倍。之前找过不少源代码阅读工具,像SourceInsight、sourcenav、scitools等,但是这些工具要么是收费的,要么只有windows版本。sourcenav虽然是开源的,但是个人觉得不是很好用。直到最近毕设时老师要求用doxygen生成代码文档,在使用doxygen的过程中,突然发现这个东西配合上浏览器其实就是一个很好的源码阅读工具,所以给大家推荐一下。废话不多说,相信大家都知道doxygen是一个用来生成源码文档的工具,不少有名的开源项目想opencv,boost都是用 阅读全文
posted @ 2014-03-23 11:10 Benjamin-T 阅读(4175) 评论(1) 推荐(2) 编辑
摘要: 作为一个英语学习爱好者,我发现我们学了那么多年英语,虽然现在看英语文章已经不怎么吃力,但是如果要自己写一篇英语文章,就总是感觉单词虽然都懂,可要拼出一句有水平的句子就很难。其原因我觉得是我们平时虽然做了不少的阅读,但只是在被动地将英语信息转化成大概的中文意思理解,而没有试着反过来训练一下从中文怎么表达成英文。作为一个程序员有一个好处就是,当你发现一个需求的时候可以自己试着做个东西来玩玩,为了做这个学习工具,我首先想到了有些新闻网站会提供双语新闻(比如酷优网http://www.cuyoo.com/home/portal.php),然后我的思路就简单成型了,先搞个网络爬虫,把一些双语新闻网页抓取 阅读全文
posted @ 2013-09-21 10:46 Benjamin-T 阅读(5608) 评论(13) 推荐(14) 编辑
摘要: 个人认为,外部排序是我们在学习过程中接触到的一个比较重要的算法,它既包含了基本的排序算法,又考察了对文件IO以及内存的理解,还展示了最基本的程序优化思想,可以说能够写好一个外部排序,就说明基本的编程能力已经过关了。本文将对整个外部排序的过程进行详细的分析,并介绍两个经典算法,最后附上完整的程序代码。1. 问题描述 由于在现实环境中,有时候需要对一个非常大的文件进行排序,而计算机内存是有限的,当数据无法完全存入内存时,则无法使用正常的排序算法一次完成排序,而必须利用磁盘空间的辅助进行外部排序,即利用有限的内存每次读入部分数据排序后得到一个顺串后暂时放到磁盘,最后将多个顺串进行归并直到最终完成排. 阅读全文
posted @ 2013-09-16 22:57 Benjamin-T 阅读(5898) 评论(4) 推荐(3) 编辑
摘要: 前文主要讲了我们的程序是通过虚拟地址进行内存访问的,那么操作系统是如何实现了虚拟地址到实际物理地址的转换,又是如何对有限的物理内存进行管理,才能让多个进程共同在有限的内存里跑起来的呢?总的来说,系统要做的工作包括:监控物理内存的使用情况、在程序需要更多内存时进行内存分配、把不同进程的地址空间映射到物理内存的不同区域、动态地把程序运行需要的资源移进内存或把暂时不需要的资源移出内存以腾出空间,接下来将对Linux是通过怎样的机制完成这些工作做一个简要的介绍。1、分页和页表首先,分页的概念相信很多人都不陌生,我这里想说的是“分”的思想,学习计算机两年多,我最大的感受是计算机就是在利用有限的资源干.. 阅读全文
posted @ 2013-05-21 23:09 Benjamin-T 阅读(2290) 评论(4) 推荐(0) 编辑
摘要: 关于内存,最直观的理解可以将其想象成一个个格子,每个格子由一个地址标记出来并且存了一个字节的数据,对于32位的机器,可以有2^32个地址,也就是理论上可以存4GB的数据(实际的机器不一定是4G的物理内存)。的确,对于程序员而言这样的理解已经足以满足我们编写程序的要求了,而内存实际的物理模型也是这个样子的。但是,对于系统而言,这样简单的模型是不够的,因为正常情况下系统中都会运行着多个程序,如果这些程序都可以直接对任意一个内存地址进行操作,那么一个程序就很有可能直接的修改了另外一个程序保存在内存中的数据,这种情况下会发生什么,不好说,但肯定会悲剧。所以操作系统必须实现一些机制,来保证各个进程可.. 阅读全文
posted @ 2013-05-14 09:19 Benjamin-T 阅读(2211) 评论(5) 推荐(4) 编辑
摘要: 在前文我们大致了解了程序中如何使用系统调用实现我们想要的进程管理方式,在本文中我们将要看看linux系统内核又是如何实现进程的管理的。正如在概述中讲的,操作系统本身也只是一个计算机程序,只要是程序,就会有数据结构和算法,就同样会利用到内存空间甚至磁盘空间,在往下看之前,读者不妨先根据自己的知识思考一下可以用什么样的方式来实现,说不定就搞出了一个新的系统哦~1、进程的表示方式 linux将一个个进程抽象为一个个任务,并定义了一个结构体task_struct用于表示一个任务,对于每一个进程,在其生命周期里都会有一个相应task_struct类型的进程描述符存在于内存中,保存了内核用于管理进程所.. 阅读全文
posted @ 2013-05-09 15:56 Benjamin-T 阅读(1987) 评论(3) 推荐(0) 编辑
摘要: 在前文完成了概述之后,本文就要开始进入戏肉了,之前我们将操作系统的内核结构分成了三个模块,现在就先从进程管理模块来开始深入探讨一下。1、进程间的关系我们知道一个Linux系统里同时运行着大量的进程,当你在shell终端里输入ps -ef命令时,你会看到像下面这样一长串的东西,有很多我就截了一部分。这些进程之间是什么关系呢?首先,我们从最基本的父子关系说起,我们知道在一个程序里只要调用fork函数就可以创建一个新的进程,在这种情况下,调用fork函数的就是父进程,新创建的进程就是子进程,而子进程又可以创建子进程,这样层层往下延伸,就构成了一棵进程树。然后看上图,每个进程都对应了一个PID和一个P 阅读全文
posted @ 2013-05-06 15:00 Benjamin-T 阅读(1974) 评论(0) 推荐(0) 编辑
摘要: 通过Linux理解操作系统(一):概述用了那么多年电脑,操作系统从WinXP,Vista, 再到Win7, 然后是现在用的Ubuntu,这么长的时间里,一直没有搞明白这操作系统是个什么东西,为什么这么神奇,只要点一点,按一按,那些一块一块的硬件就可以完成我们的工作。直到学了操作系统这门课程,才开始有点朦朦胧胧的理解,最近又看了一些linux系统设计的资料,觉得有些领悟,所以写出来跟大家分享一下。先声明,本人不是linux技术极客,所以本文不会讲一些很酷的linux使用技术,也不会讲一些很深入的linux内核分析,这些都有相应的书籍和资料可以学习,比如鸟哥的linux私房菜和Linux内核源码剖 阅读全文
posted @ 2013-05-05 14:28 Benjamin-T 阅读(2706) 评论(8) 推荐(5) 编辑