2011年二月

linux中读写锁的rwlock介绍

读写锁比mutex有更高的适用性,可以多个线程同时占用读模式的读写锁,但是只能一个线程占用写模式的读写锁;

1,当读写锁是写加锁状态时, 在这个锁被解锁之前, 所有试图对这个锁加锁的线程都会被阻塞.

2,当读写锁在读加锁状态时, 所有试图以读模式对它进行加锁的线程都可以得到访问权,但是以写模式对它进行枷锁的线程将阻塞;

3,当读写锁在读模式锁状态时, 如果有另外线程试图以写模式加锁, 读写锁通常会阻塞随后的读模式锁请求, 这样可以避免读模式锁长期占用, 而等待的写模式锁请求长期阻塞;

这种锁适用对数据结构进行读的次数比写的次数多的情况下,因为可以进行读锁共享。

API接口说明:
1)初始化和销毁

#include <pthread.h>
 
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
 
成功则返回0, 出错则返回错误编号.

2)读加锁和写加锁
获取锁的两个函数是阻塞操作

#include <pthread.h>
 
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
 
成功则返回0, 出错则返回错误编号.

3)非阻塞获得读锁和写锁
非阻塞的获取锁操作, 如果可以获取则返回0, 否则返回错误的EBUSY.

#include <pthread.h>
 
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
 
成功则返回0, 出错则返回错误编号.
//


Web开发人员必备的20款超赞的jQuery插件【CSDN】

原文地址:http://sd.csdn.net/a/20110218/292102.html

收藏了

Creative Radical Web Typography

Lettering.js是一个轻量经的、易于使用的jQuery插件,可创造出极具个性的网页排版,是2010年最佳jQuery插件之一。

更多 >



json_encode的php实现

今天coding时,需要将php中的变量返回给第三方,第一个想到就是使用json格式,方便易用。于是用了json_encode,但是发现居然报语法错误,查了手册才发现,json_enode 是在5.2.0才作为标准扩展加入php的,而我们的机器上php的版本是5.1.6,原来该扩展还未加进来。由于这个应用比较小,而且本人赖得升级php的版本,而且再手工安装这个扩展也比较麻烦,所以想到了使用php实现json_encode,原理上应该不难,找到一段代码,共享之~
更多 >



信息分析工具之—$APPEALES【转】

$APPEALS 是一种市场需求和收集的方法,一般是使用在市场规划和产品规划的细分市场中,因为可以从多个维度,不同的权重来分析需求,所有$APPEALS一定会联系到细分市场,联系到竞争对手,涉及到差异化分析和蓝海的价值创新(减少,增加,剔除,创新)。差异化可以说是理解市场和分析市场中的一个重要内容,只有清楚了差异化才能够树立自己产品的核心竞争力。

$APPEALS方法是IBM在IPD总结和分析出来的客户需求分析的一种方法。它从8个方面对产品进行客户需求定义和产品定位。具体如下:

  • $-产品价格(Price);
  • A-可获得性(Availability);
  • P-包装(Packaging);
  • P-性能(Performance);
  • E-易用性(Easy to use);
  • A-保证程度(Assurances);
  • L-生命周期成本(Life cycle of cost);
  • S-社会接受程度(Social acceptance)。

使用客户$APPEALS框架来确定客户的欲望与需要,建立针对每一个细分市场的产品包对应图。客户$APPEALS框架的目的主要包括以下方面的内容:

  • 处理目标细分市场的全部客户欲望与需要
  • 建立客户驱动的需求集,作为投资的重点
  • 确定要想在所选细分市场获得成功必须达到的主要分界标准
  • 确定促使客户选择公司产品的主要差异

$价格
这个要素反映了客户为一个满意的产品/交付希望支付的价格。用这个标准来要求供应商时,要从实际和感觉这两方面来考虑客户能接受的购买价格。将包括以下的数据评估:技术、低成本制造、物料、人力成本、制造费用、经验、自动化程度、简易性、可生产性等。

A保证
这个要素通常反映了在可靠性、安全和质量方面的保证。用这个标准来要求供应商时,要考虑客户在可预测的环境下关于减少他/她关注确定的性能方面如何评价整个产品?这可以包括保证、鉴定、冗余度和强度。

P性能
这个要素描述了对这个交付期望的功能和特性。用这个标准来要求供应商时,要从实际和感觉这两方面来考虑有关功能和特性的产品性能。产品工作得怎样?产品是否具备所有的必须的和理想的特性?它是否提供更高的性能?从客户角度来衡量,如速度、功率、容量等。

P包装
这 个要素描述了期望的设计质量、特性和外观等视觉特征。就软件而言它描述了交付或提供的功能包。用这个标准来要求供应商时,要考虑客户对外形、设计等意见, 还有这些属性对交付的期望的贡献程度。关于包装的考虑应该包括样式、模块性、集成性、结构、颜色、图形、工艺设计等方面。

E易用
这个要素描述了交付的易用属性。用这个标准来要求供应商时,要考虑客户对产品的舒适、学习、文档、支持、人性化显示、感觉的输入/输出、接口、直观性等方面的考虑意见。

A可获得性
这个要素描述了客户在容易和有效两方面的购买过程(例如:让客户有他自己的方式)。用这个标准来要求供应商时,要考虑在整个购买过程的优秀程度,包括预售的技术支持和示范、购买渠道/供应商选择、交付时间、客户定制能力等。

L生命周期成本
这个要素描述了所有者在使用的整个生命周期的成本,用这个要素来要求供应商时,要考虑安装成本、培训、服务、供应、能源效率、价值折旧、处理成本等。

S社会接受程度
这个要素描述了影响购买决定的其他影响。用这个要素来要求供应商时,要考虑口头言论,第三方评价、顾问的报告、形象、政府或行业的标准、法规、社会认可、法律关系、产品义务等对购买决定起了怎样的促进作用。

对 于$APPEALS方法里面涉及到很多内容,首先是要通过用户调查收集具体的用户最关心哪个维度的问题,根据这些调查数据来确定每个维度的权重;其次是要 分析自己公司和竞争对手公司的产品在先阶段各个维度的评分,然后是画出相应的雷达图进行差异化分析。根据公司的战略目标和市场策略,应该重点关注哪些核心 功能和核心需求,如何减少自己的弱势并提升自我优势以体现差异化,如何进行价值创新等。



提高编程技能最有效的方法[转载]

看到这篇文章,感觉写的挺不错的,转载下

原文地址:http://coolshell.cn/articles/3698.html

StackExchange.com上有两个贴子(贴子一贴子二), 贴子名叫“What is the single most effective thing you did to improve your programming skills?” – 对你的编程技术提高最有效的一件事是什么?回复的人中给了很多很不错的建议,我把他们总结了一下,十条,相信一定会对你有用。(注意:顺序是我自己按我的 个人经验排的)

  • 和比自己聪明的能力比自己强的人工作。学习他们的代码,他们的做事方法,看一看那些人是怎么处理错误的。
  • 总是倾听别人怎么说,无论那个的资历和职位是什么样的。
  • 实践,实践,实践,总是不满意于一开始出来的事。
  • 多问问自己,现在在写什么代码?为什么要这样写成这样?还有没有更好的方法?
  • 学习多样的技术,多多比较他们,并一定要了解各种技术的优缺点。
  • 总是问别人问好的问题。
  • 多回头看看走过的路,做过的事,写过的程序,感觉一下他们有多烂。
  • 多读读那些大师写的书。
  • 不要总坐在电脑前编程序,多做做运动,多到户外走走,和非技术人多接触,向他们学习。
  • 把你的想法说出去,看看别人怎么回应的。从别人的回应中学习。

除了这些,下面是我个人想给你的建议——
可能只能算精神,不能算方法。我以前也写过一篇《五个方法成为更好的程序员》,《十条不错的编程观点》,还有《优秀程序员的十个习惯》这几篇文章也能给你一些启发。

  • 热情。对编程充满热情。这种热情会导致强烈地专研精神,和努力的精神。专研精神相当重要,它是畏难情绪的天敌
  • 知道。学习技术要“知其道,明其理”,而不仅仅只是了解知识。举例,为什么C++有“初始化例表”而Java却没有?为什么Java的没有多重继承?为会有了TCP还要UDP?对于一个事物,什么是好的,什么是不好的。不但要了解其表面,还要了解其思想。只有了解原始的初衷和目的,你才能真正“知道”
  • 犯错。不犯错误永远没有经验,从自己的错误和别人的错误中学习,只有自己犯了错,才会真正明白。犯错不可怕,可怕的是不会总结只有真正的摸爬滚打过的人才是强人。技能和经验总是用错误去换来的
  • 回顾。要多去回顾过去,看看 历史上发生过的事。这样你才能明白事物的发展规律,从面才能了解未来的路。举例:单机 -> Client/Server -> 中间应用层 -> 多层结构 -> 分布式结构。 C -> C++ -> Java,等等,等等。未来其实就在回顾过去之中
  • 质疑。质疑精神很重要。质疑通常会导致不同意见甚至反对意见。也许你会质疑错,也许你会被质疑,但是你的认知也会因为不同的观点而变得完整。有所同有所不同(“同”为同意及相同),观点因为不同才能迸发出火花,事物也此而发展,世界因为不同而精彩


C++中extern “c”深层含义

extern “C” 代表双重含义:从字面意思上看,一被修饰的目标是extern,二被修饰的目标是C。

1,首先被extern “C”限定的函数或变量是extern类型的,
extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。

2,被extern “C”修饰的变量和函数是按照C语言方式编译和连接的;

也就是说C和C++对于编译器来说编译的方式是不同的,作为面向对象程序语言,C++支持函数重载,而C语言不支持函数重载,即某个函数被C++编译器编译后和被C编译器编译后的名字是不同的。例如,函数的原型为:

void foo(int, int);

假如C++编译后的名字为:_foo_int_int

C编译后的名字为:_foo_

如果在C++中使用C语言提供的库函数时,在引用完头文件后,在链接时,可以无法再目标代码中找到_foo_int_int类似的函数,只能找到_foo_函数,所以会出现函数未定义的错误。

总的来说一句话:extern “C”的存在时为了C和C++能够进行混合编程。

关于extern “C” 的用途,请参看我的另一篇文章

C语言调用C++库接口的方法概述

参考资料:

http://www.cppblog.com/Macaulish/archive/2008/06/17/53689.html



Makefile学习笔记-wildcard notdir patsubst用法

在手写Makefile时,用上这三个函数非常方便,减少了很多人力劳动哈

用法介绍:

wildcard:  扩展通配符 例如将* 进行匹配

notdir:  去除目录 类似于basename的用法

patsubst: 替换通配符

说起来比较费劲,直接看例子的话,比较好理解

例子介绍:

在test目录下a.cpp和b.cpp,sub目录下c.cpp和d.cpp

建立一个简单的Makefile文件:

src=$(wildcard *.c ./sub/*.c)
dir=$(notdir $(src))
obj=$(patsubst %.c,%.o,$(dir) )
 
all:
 @echo $(src)
 @echo $(dir)
 @echo $(obj)
 @echo "end"

输出结果为:

#wildcard把 指定目录 ./ 和 ./sub/ 下的所有后缀是c的文件全部展开
a.cpp b.cpp ./sub/c.cpp ./sub/d.cpp
#notdir把展开的文件去除掉路径信息
a.cpp b.cpp c.cpp d.cpp
#patsubst把$(dir)中的变量符合后缀是.c的全部替换成.o
a.o b.o c.o d.o


sscanf函数的高级用法[转载]

原文地址:http://blog.csdn.net/eroswang/archive/2007/08/20/1751444.aspx

大家都知道sscanf是一个很好用的函数,利用它可以从字符串中取出整数、浮点数和字符串等等。它的使用方法简单,特别对于整数和浮点数来说。但新手可能并不知道处理字符串时的一些高级用法,这里做个简要说明吧。
名称:

sscanf() – 从一个字符串中读进与指定格式相符的数据.

函数原型:

Int sscanf( string str, string fmt, mixed var1, mixed var2 … );

int scanf( const char *format [,argument]… );

说明:

sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。
其中的format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ‘ ‘ | ‘\t’ | ‘\n’ | 非%符号}

注:

1、 * 亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)

2、{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。

3、width表示读取宽度。

4、{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。

5、type :这就很多了,就是%s,%d之类。

6、特别的:%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值

支持集合操作:

%[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)

%[aB'] 匹配a、B、’中一员,贪婪性

%[^a] 匹配非a的任意字符,贪婪性

1. 常见用法。

char str[512] = {0};

sscanf(“123456 “, “%s”, str);

printf(“str=%s\n”, str);

2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。

sscanf(“123456 “, “%4s”, str);

printf(“str=%s\n”, str);

更多 >



gdb调试程序之调试宏的方法[六]

在GCC编译程序的时候,加上-ggdb3参数,这样,你就可以调试宏了。

另外,你可以使用下述的GDB的宏调试命令 来查看相关的宏。

  • info macro_name – 查看这个宏在哪些文件里被引用了,以及宏定义是什么样的。
  • macro_name –       查看宏展开的样子。


1

KVM可扩展性测试报告

KVM可扩展性测试报告

by yaonli(http://www.yaronspace.cn/blog)

测试设计

对KVM虚拟机可扩展性测试,主要是指随着虚拟机的数量的增加,虚拟机的在CPU利用率、内存使用、磁盘IO和网络IO的性能是否表现良好,最后能够给出在物理机一定硬件条件下,可运行的虚拟机的数目的最佳指标。

在具体的设计方案上,在物理机上分别启动1到16个虚拟机,然后从CPU利用率、磁盘IO和网络IO三个方面进行分析,这里需要说明下没有测试内存使用的情况的原因:针对KVM来说,分配给虚拟机的内存大小是事先指定,加入分配512M内存,则虚拟机的物理内存就是512M内存,分析意义不大;

1,  CPU利用率测试上

在测试虚拟机CPU利用率方面,主要是CPU密集型的软件进行测试,计算最终的执行时间;例如内核的编译或者bzip2对大文件进行压缩,都是CPU计算性。本次测试选用bzip2 对1.8G的镜像文件进行压缩,计算最终的执行时间。

date+%s.%N && bzip2 –9 windows_2003_server.img && date +%s.%N

2,  磁盘IO测试

测试磁盘IO的话,我选择用的是Bonnie++ 软件,并发地从虚拟机1台到16台的进行测试,执行命令如下:

./bonnie++ -d ~/test –s 1000

3,  网络IO测试

鉴于如果使用网卡类型如rtl8139或者e1000,效率非常低,所以本次测试网卡类型都是基于virtio网卡类型,然后并发地从物理机到1到16台虚拟机进行并发通信,主要是利用nertperf软件进行测试.

测试环境

物理主机硬件配置

1,  8核Intel(R) Xeon(R) CPU           E5410  @ 2.33GHz

2,  16G内存

3,  1.4T硬盘

4,  千兆以太网卡

物理主机的软件配置

1,64Bit CentOS 5.3  2.6.18-128.el5

2,kvm-88

虚拟机分配的硬件配置

1,  单核CPU

2,  512M内存

3,  Virtio 网卡

4,  qcow2 format 增量镜像

虚拟机的软件配置

1,8.04 ubuntu系统

更多 >