C/C++
刘爱贵
中科院博士,TaoCloud首席科学家,专注软件定义存储,聚焦智能存储、分布式全闪存、信创存储方向。GlusterFS技术专家,长期从事存储领域研发工作,分布式存储资深理论研究与实践者。
展开
-
Linux下C程序命令行参数处理
Linux下开发C程序,甚至是GUI程序,都可能需要处理复杂的命令行参数。健全、可靠的复杂命令行参数处理机制,可使程序方便使用,也更显专业。Linux下几乎所有的命令都提供了参数处理机制,包括短选项和长选项。 POSIX标准中对程序名、参数作了如下相关约定: * 程序名不宜少于2个字符且不多于9个字符; * 程序名应只包含小写字母和阿拉伯数字; * 选项名应该是单原创 2008-04-05 11:34:00 · 9707 阅读 · 2 评论 -
动态分配二维数组
C/C++程序中经常需要使用malloc / new 来生成数组。对于一维数组,这非常简单,而二维数组,动态分配要稍微复杂一点。这里给出动态分配二维数组的两种方法。 #include #include #define X 100#define Y 100// 方法一:数组空间不连续,两次调用mallocint ** alloc_2d_array_1(int ro原创 2009-05-09 15:54:00 · 2671 阅读 · 8 评论 -
KMP算法深度解析
摘要:KMP算法是字符串匹配的经典算法,由于其O(m+n)的时间复杂度,至今仍被广泛应用。大道至简,KMP算法非常简洁,然而,其内部却蕴含着玄妙的理论,以至许多人知其然而不知其所以然。本文旨在解开KMP算法的内部玄妙所在,希望能够有助于学习与理解。 1、KMP算法 一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此称之为KMP算法原创 2009-08-04 22:59:00 · 68586 阅读 · 40 评论 -
输出集合所有子集的算法
算法描述:把求子集运算转换为组合问题。假设集合中包含N个元素, 子集合数 = C(N, 0) + C(N, 1) + ... + C(N, N-1) + C(N, N),对于任一个子集合,可以用一个N元组表示,即 , 其中Si取值范围为(0, 1),0表示不该子集合不包含该元素,1表示该子集合包含该元素。因此,求子集合就转换成了罗列所示可能组合的算法。子集合数 = 2^n。 void原创 2009-06-08 20:49:00 · 6507 阅读 · 1 评论 -
谨防define宏陷阱
最近在研究Deduplication(重复数据删除)存储技术,实现一个dedup原型系统,结果在Coding中遇到了一个莫名其妙的问题。简略代码如下:#include "dedup.h"#ifndef BLOCK_LEN#define BLOCK_LEN 32 * 1024 /* 32K Bytes */#endif#define BACKET_SIZE 1原创 2009-12-20 13:28:00 · 2477 阅读 · 3 评论 -
字符串Hash函数评估
Hash查找因为其O(1)的查找性能而著称,被对查找性能要求高的应用所广泛采用。它的基本思想是:(1) 创建一个定长的线性Hash表,一般可以初始化时指定length;(2) 设计Hash函数,将关键字key散射到Hash表中。其中hash函数设计是最为关键的,均匀分布、冲突概率小全在它;(3) 通常采用拉链方法来解决hash冲突问题,即散射到同一个hash表项的关键字,以链表形式来表示(原创 2009-12-21 21:29:00 · 20314 阅读 · 27 评论 -
WSIO - 基于WEB服务的远程文件I/O
WSIO - 基于WEB服务的远程文件I/O团队名称:IHEPer作者:刘爱贵 电子邮箱:liuag@ihep.ac.cn 单位:中科院高能物理研究所 计算中心 PDF下载:http://download.csdn.net/source/2143070摘要WSIO是一个基于Web Service技术实现的、与POSIX标准兼容的文件I/O,实现了存储系统的远程原创 2010-03-19 11:48:00 · 16049 阅读 · 14 评论 -
基于Dedup的数据打包技术
基于Dedup的数据打包技术作者简介 :刘爱贵,研究方向为网络存储、数据挖掘和分布式计算;毕业于中科院,目前从事存储软件研发工作。 Email: Aigui.Liu@gmail.com注: 作者学识和经验水平有限,如有错误或不当之处,敬请批评指正。 0、引言 Tar, winrar, winzip是最为常见的数据打包工具软件,它们把文件集体封装成一个单独的数据包,从而原创 2010-01-09 20:39:00 · 12093 阅读 · 17 评论 -
SourceForge上发布dedup util
dedup util是一款开源的轻量级文件打包工具,它基于块级的重复数据删除技术,可以有效缩减数据容量,节省用户存储空间。目前已经在Sourceforge上创建项目,并且源码正在不断更新中。https://sourceforge.net/projects/deduputil原创 2010-06-02 12:20:00 · 11810 阅读 · 10 评论 -
数据相似性检测算法
本文研究了数据相似性的计算方法,对Bloom filter和LCS两种常用相似性检测算法进行剖析、实现和分析比较。原创 2010-09-08 10:57:00 · 9564 阅读 · 17 评论 -
网络数据同步开发库libsync
"数据同步算法研究"一文提出了一种改进的数据同步算法,我在实现的原型系统基础上,将文件切分、差异编码、文件同步等关键算法抽取出来封装成动态开发库libsync,方便自己的开发应用。在本人开发的deduputil,WSIO, wsync等软件中,均使用了libsync动态函数库,现已将libsync发布至google code。原创 2010-10-18 23:30:00 · 7778 阅读 · 12 评论 -
关于Gluster稳定性的一个BUG
这一段时间一直在研究Gluster集群文件系统,其技术架构和大原理请参考前面的一篇文章“Gluster集群文件系统研究”。为了验证其所声称的高扩展、高可用、高性能的特点,我部署了一个较大规模的测试环境,4个I/O节点(即brick servers,DELL R原创 2011-07-06 15:41:55 · 9952 阅读 · 20 评论 -
C语言中函数参数的入栈顺序
对技术执着的人,比如说我,往往对一些问题,不仅想做到“知其然”,还想做到“知其所以然”。C语言可谓博大精深,即使我已经有多年的开发经验,可还是有许多问题不知其所以然。某天某地某人问我,C语言中函数参数的入栈顺序如何?从右至左,我随口回答。为什么是从右至左呢?我终究没有给出合理的解释。于是,只好做了个作业,于是有了这篇小博文。#include void foo(int x, int y, int z原创 2009-05-02 15:50:00 · 6801 阅读 · 12 评论 -
GNU C中x++是原子操作吗?
什么是原子操作? 所谓原子操作,就是"不可中断的一个或一系列操作" 。在确认一个操作是原子的情况下,多线程环境里面,我们可以避免仅仅为保护这个操作在外围加上性能开销昂贵的锁,甚至借助于原子操作,我们可以实现互斥锁。 那么,GNU C中x++是原子操作吗?请看下面一段代码:#include #include static int x;void inc(){ x++;原创 2009-05-01 11:20:00 · 4460 阅读 · 3 评论 -
C程序中的存储分配
C程序中的存储分配(刘爱贵 - Aiguille.LIU) C程序设计中,经常需要使用malloc/free动态管理内存,在需要的时候向操作系统申请空间,适合的时候释放不再使用的空间。那么,C库中malloc/free是如何实现的呢?参考"The C Programming Language",我们设计了自己的存储分配程序。 由于程序中某些地方可能不通过malloc调用申请空间,因此,ma原创 2008-04-12 17:55:00 · 3161 阅读 · 4 评论 -
C语言复杂声明的解析
C语言复杂声明的解析(刘爱贵 Aiguille.LIU) C语言是一种通用的程序设计语言,它与UNIX系统之间具有非常密切的联系,C语言是在UNIX系统上开发的,并且,无论是UNIX系统本身还是运行其上的大部分程序,都是用C语言编写编写的。C语言很适合用来编写编译器和操作系统以及各种系统底层软件,因此被称为“系统编程语言”,但它同样适合于编写不同领域中的大多数程序。 C语言中,指针的使用非常广原创 2008-04-10 18:13:00 · 3671 阅读 · 3 评论 -
C存储类型和类型限定符
C存储类型和类型限定符(刘爱贵 - Aiguille.LIU) C存储类分为两类:自动存储类(automatic)和静态存储类(static)。声明对象时使用的存储类说明符以及声明的上下文共同决定了对象的存储类。 自动存储类对象对于一个程序块来说是局部的,在退出程序块时该对象将消失。 (1) 如果没有使用存储类说明符,或者如果使用了auto限定符,则程序块中的声明生成的都是自动存原创 2008-04-11 20:22:00 · 4911 阅读 · 1 评论 -
散列表设计
散列表设计(刘爱贵 - Aiguille.LIU)1、基本概念 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。2、常用的构造散列函数的方法 散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数原创 2008-04-14 13:09:00 · 5757 阅读 · 6 评论 -
API函数库的构造与编程应用
API函数库的构造与编程应用(刘爱贵 - Aiguille.LIU) 函数库是一组执行特定功能操作的函数集合,可以独立提供给第三方进行程序开发,通常又称为API(Application Programming Interface),即应用程序编程接口。Linux下,函数库一般有两种形式:静态函数库和动态函数库。应用函数库进行编程时,如果使用静态函数库,则需要将其链接进应用程序中;而使用动态共原创 2008-04-27 18:02:00 · 2109 阅读 · 2 评论 -
函数的线程安全与可重入
函数的线程安全与可重入刘爱贵 / Aiguille.LIU线程安全的(Thread-Safe):如果一个函数在同一时刻可以被多个线程安全地调用,就称该函数是线程安全的。线程安全函数解决多个线程调用函数时访问共享资源的冲突问题。可重入(Reentrant):函数可以由多于一个线程并发使用,而不必担心数据错误。可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。可重入性解决函数运行结果的原创 2008-05-05 14:41:00 · 2994 阅读 · 0 评论 -
GNU C中的零长度数组
随手翻阅"linux内核设计与实现"一书,看到一个关于进程的结构体:struct thread_info { struct task_struct *task; struct exec_domain *exec_domain; unsigned long flags; __u32 status; __u32 cp原创 2009-01-01 21:36:00 · 8421 阅读 · 11 评论 -
一种程序界面文字换肤方法
一种程序界面文字换肤方法Aiguille.LIU2008-11-23 对于GUI程序,界面上会呈现许多图片和文字信息。图片一般都是运行时从外部载入的,更换比较容易。然而,文字信息大多情况下都是直接写在程序代码中的。这种情况下,如果想更换文字,就需要重新编译程序,非常不方便。这里介绍一种程序界面文字换肤方法,可以无须重新编译程序而实现方便的文字换肤功能,可用于OEM或多语言情形。1、字典库 所有原创 2008-11-23 20:12:00 · 1581 阅读 · 0 评论 -
Linux下的C/C++开发与调试工具
Linux开发环境相当完善,且功能完整,它主要由GNU的编译器和库,以及大量的系统例程及库组成,能够支持C++、C和汇编语言程序,重点是针对C++和C语言。因为Linux的源代码主要是用C语言实现的,开发人员可以方便地获取并进行修改和重新编译,因此为Linux操作系统提供了一个强大的C语言开发环境至关重要。Linux开发环境包括GNU编译工具集、调试工具和相关的实用工具。 1.GNU编译工具原创 2008-12-20 11:47:00 · 4275 阅读 · 0 评论 -
Windows性能计数器
一、性能计数器概述 性能监视,是Windows NT提供的一种系统功能。Windows NT一直以来总是集成了性能监视工具,它提供有关操作系统当前运行状况的信息,针对各种对象提供了数百个性能计数器。性能对象,就是被监视的对象,典型例子有Processor、Process、Memory、TCP/UDP/IP/ICMP、PhysicalDisk等。计数器通常提供操作系统、应用程序、服务、驱动程序等的原创 2009-03-30 21:03:00 · 20844 阅读 · 5 评论 -
设计新Xlator扩展GlusterFS
1. GlusterFS概述GlusterFS是一个开源的分布式文件系统,具有强大的Scale-Out横向扩展能力,通过扩展能够支持数PB存储容量和处理数千客户端。GlusterFS借助TCP/IP或InfiniBand RDMA网络将物理分布的存储资源聚集在一起,使用单一全局命名空间来管理数据。GlusterFS基于可堆叠的用户空间设计,可为各种不同的数据负载提供优异的性能。Glus原创 2012-07-25 20:16:18 · 15363 阅读 · 17 评论