记录学习过程中的点点滴滴
2011年二月
linux中读写锁的rwlock介绍
二 28th
读写锁比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】
二 25th
原文地址:http://sd.csdn.net/a/20110218/292102.html
收藏了
Creative Radical Web Typography
Lettering.js是一个轻量经的、易于使用的jQuery插件,可创造出极具个性的网页排版,是2010年最佳jQuery插件之一。
更多 >
json_encode的php实现
二 25th
今天coding时,需要将php中的变量返回给第三方,第一个想到就是使用json格式,方便易用。于是用了json_encode,但是发现居然报语法错误,查了手册才发现,json_enode 是在5.2.0才作为标准扩展加入php的,而我们的机器上php的版本是5.1.6,原来该扩展还未加进来。由于这个应用比较小,而且本人赖得升级php的版本,而且再手工安装这个扩展也比较麻烦,所以想到了使用php实现json_encode,原理上应该不难,找到一段代码,共享之~
更多 >
信息分析工具之—$APPEALES【转】
二 23rd
$APPEALS 是一种市场需求和收集的方法,一般是使用在市场规划和产品规划的细分市场中,因为可以从多个维度,不同的权重来分析需求,所有$APPEALS一定会联系到细分市场,联系到竞争对手,涉及到差异化分析和蓝海的价值创新(减少,增加,剔除,创新)。差异化可以说是理解市场和分析市场中的一个重要内容,只有清楚了差异化才能够树立自己产品的核心竞争力。
- $-产品价格(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方法里面涉及到很多内容,首先是要通过用户调查收集具体的用户最关心哪个维度的问题,根据这些调查数据来确定每个维度的权重;其次是要 分析自己公司和竞争对手公司的产品在先阶段各个维度的评分,然后是画出相应的雷达图进行差异化分析。根据公司的战略目标和市场策略,应该重点关注哪些核心 功能和核心需求,如何减少自己的弱势并提升自我优势以体现差异化,如何进行价值创新等。
提高编程技能最有效的方法[转载]
二 23rd
看到这篇文章,感觉写的挺不错的,转载下
原文地址: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”深层含义
二 22nd
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用法
二 22nd
在手写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函数的高级用法[转载]
二 19th
原文地址: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调试程序之调试宏的方法[六]
二 17th
在GCC编译程序的时候,加上-ggdb3参数,这样,你就可以调试宏了。
另外,你可以使用下述的GDB的宏调试命令 来查看相关的宏。
- info macro_name – 查看这个宏在哪些文件里被引用了,以及宏定义是什么样的。
- macro_name – 查看宏展开的样子。

KVM可扩展性测试报告
二 16th
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系统
近期评论