Linux虚拟文件系统简介 2015年08月08日 kernel

    Linux支持多种文件系统,为了让应用程序能够对所有系统不加区分的操作,提供了一个抽象层,这个抽象层介于应用程序和具体的文件系统之间,就像一个开关一样将用户请求转换到具体文件系统系统去,让具体文件系统去实现对应的操作,最后再将结果返回给用户。所以VFS就叫做虚拟文件系统开关,确切的也可称之为虚拟文件系统转换,不过我认为开关比较形象。

    另一方面,VFS是Linux所有子系统中的一员,其他还有子系统如IPC, SCHED, MM, NET等,它们只会和VFS打交道,而不会去针对具体的文件系统直接操作。也就是说不仅用户空间接受VFS服务,内核空间也接受VFS服务。

    STL关联容器 2015年08月04日 language

    STL关联容器包括setmap,二者底层都用红黑树实现,衍生体multisetmultimap也不例外。对应的有基于哈希表的实现,名字也很像,分别为: hash_sethash_maphash_multisethash_multimap

    关联容器内部是一个平衡二叉树,平衡二叉树包括AVL-tree、 RB-tree和AA-tree等等。红黑树应用比较广泛,Linux内核中内存管理也广泛用到红黑树。不同领域用到的树也是不尽相同的,如编译器需要表达式树,文件压缩要用哈夫曼编码树,数据库要用到复杂的B-tree。

    二叉搜索树在插入和删除操作之后失去平衡就会降低搜索效率,因此在实际应用中需要让结构保持平衡。

    Cmake Practice 2015年07月30日 tools

    对于比较大的项目手动去编写很多makefile是不合理的, Autotools是一种自动产生Makefile的工具集,我毕业设计就是用的这套工具,整体感觉还是比较繁琐。Cmake出现要晚一点,在效率和使用上都要好些。当然Cmake只能用来构建C++/Java。

    Makefile Introduction 2015年07月28日 tools

    Makefile最重要的三个概念是目标、依赖和命令,所有的目标都是通过命令来生成,而执行命令的顺序则是由依赖关系确定。基本语法如下所示。

    target: dependency
            command
    

    另外一个比较重要的是可以在Makefile中定义变量,定义的方式就是直接用等号赋值,引用变量则要用$(varname)来表示。

    算法习题2 2015年07月26日 algorithm

    1. 有限正整数排序问题,给定一个文件,包含正整数,最大值小于 \( 10^7 \),将其排序。
    2. 给定一个字符串数组,通过排序将变位词排到一起。
    3. 给定一个数组,数组是已经排序但经过旋转的,给定一个整数,用 \(O(lgn)\) 的效率查找。
    4. 给定一个字符串数组,该数组经过排序,但是中间随机插入了很多空字符串,如何从中搜索某个字符串。
    5. 给定一个 \(N \times N\) 的矩阵,行和列都是排序好的,查找给定数字。

    Git Introduction 2015年07月25日 tools

    Git是一个分布式版本控制软件,Linus Torvalds在2005年用十天时间编写出第一个git版本。相比于集中式版本控制软件,不需要服务端软件就能实现版本控制。 Git最出色的是其合并追踪能力,我在实际使用中发现,借助Emacs编辑器magit插件可以非常优雅的处理rebasemerge过程中产生的冲突。

    日常操作中,需要熟练的功能主要有:环境配置,远程管理,分支管理,错误追踪等。

    推荐在Emacs下利用magit插件做基本仓库管理,相比于直接用命令行,利用插件更加能够方便把代码和版本管理合二为一。例如差异区和代码之间跳转,选择性提交差异区等操作都比直接用命令行快捷很多。

    设计模式 2015年07月23日 language

    将可以基本元件定义为一组可以复用的类,要产生不同的元件,就可以用一个工厂函数来产生这些元件。这个函数就叫做工厂,这样的行为就叫做工厂模式。这样做的好处是元件可以随意替换,而不用对整体进行修改。

    抽象工厂提供创建一系列相关对象的接口。所谓抽象就是把一类对象抽象为一组,用一个工厂就能产生这一组中的对象。

    Go Introduction 2015年07月14日 language

    从Go语言的演化来看,可以分为三条主线:从C语言继承了基本数据类型、表达式语法、指针与函数。从Pascal-Oberon-2继承了包管理和面向对象声明语法。从CSP中继承管道通信。

    支持特性:代码规范 多返回值 静态类型 符合类型 匿名函数 垃圾回收 包管理系统 UTF8字符串 闭包 系统调用

    不支持特性:隐式类型转换 静态变量 指针算术 函数/运算符重载 默认参数 函数修饰构造/析构函数 继承 多态/泛型 异常 宏 线程局部存储 动态链接库

    UNIX Network Programming 2015年07月09日 network

    网络中进程之间要通信首先需要标识自己,本地是通过PID标识的,而网络中则是通过IP地址标识主机,通过协议和端口标识进程。使用TCP/IP协议的应用程序通常采用套接字通信,套接字源于UNIX。

    在网络编程中还需要注意字节序,网络字节序为大端,因此将CPU数据传递给网络接口的时候,需要进行字节序转换。常用的也就四个函数:hton[sl]()、ntoh[sl]()。几个字母的含义是Host、Network、Short、Long。