C语言中指针变量和数组的组合

int a[10];
int * p;
C语言规定数组名代表数组中第一个元素(即序号为0的元素)的地址,因此,下面两个语句等价:

p = &a[0];
p = a;

 

摘自:C语言程序设计(第二版)p211
(5)指针变量的值是可以改变的,见下例。

例10.20 改变指针变量的值。

#include <stdio.h>
void main()
{
char *a = "I love China!":
a = a + 7;
printf("%s", a);
}

运行结果如下:

China!

指针变量a的值是可以变化的,输出字符串是地从a当时所指向的单元开始输出各个字符,起码到遇'\0'为止。而数组名虽然代表地址,但它是常量,它的值是不能改变的。下面的用法是错误的:

char str[] = {"I love China!"};
str = str + 7;
printf("%s", str);

需要说明,若定义了一个指针变量, 并使它指向一个字符串,就可以用下标形式引用指针变量所指的字符串中的字符。

例10.21 用带下标的字符指针变量引用字符串中的字符:

#include <stdio.h>
void main()
{
char *a = "I love China!";
int i;
printf("The sixth character is %C\n", a[5] );
for(i=0; a[i] != '\0'; i++)
printf(%c" a[i]);

printf("\n");
}

运行结果如下:

The sixth character is e
I love China!

程序中虽然并未定义数组a,但字符串在内存中是以字符数组形式存放的。a[5] 按*(a+5)处理,即从a当前所指向的元素下移5个元素位置,取出其单元中的值。

用指针变量指向一个格式字符串,可以用它代替printf函数中的格式字符串。

例如:

char *format;
format = "a=%d,b=%f\n";
printf(format,a,b);

它相当于:

printf("a=%d,b=%f\n",a,b);

因此只要改变指针变量format所指向的字符串,就可以改变输入输出的格式。这种printf函数称为可变格式输出函数。也可以用数组实现。例如:

char format[]="a=%d,b=%f\n";
printf(format,a,b);

但由于不能采用赋值语句对数组整体赋值,例如:

char format[];
format = "a=%d,b=%d\n";

因此,用指针变量指向字符串的方式更为方便。

你是个软件架构师吗?

编者按: 本文作者 Simon Brown ,在三月的QCon London上发表了同样主题的演讲《Software Architecture for Developers》。

开发和架构的界限难以捉摸。有些人告诉你它根本不存在,架构只是开发者们所做的设计过程的简单扩展。 另外一些人认为这是一个鸿沟,它只能由那些做到高度抽象,而且不会陷入实现细节的开发者才能跨越。通常,在这两个极端的观点中间某处有个可操作的平衡点;不论如何,怎么从开发转换为架构师都是个有趣的问题。

经常被用来区分软件架构和软件设计开发的关键几点包括 伸缩性和抽象程度的增加以及作出正确设计决策意义的增强。软件架构是通过一个全局的观点,宏观的视角来理解软件系统作为一个整体如何工作。

即使这能够帮助区分软件开发和架构,它并不能帮助理解某人如何从开发提升到架构。 并且,它也不能帮助识别谁能够成为一个好的软件架构师,如果你想雇人的话你如何去寻找他们以及你是否是一个软件架构师。 Continue reading

开源消息队列FastMQ V0.1.0 发布

FastMQ是一款高性能,高扩展性,开源产品。FastMQ基于libevent(网络层)和TC(队列存储),使用C开发而成,目前服务器端只支持linux,暂不支持windows(并且无支持windows计划时间表)。

FastMQ使用TCP/IP协议通讯,所以客户端可以支持任何支持TCP/IP的操作系统(linux,windows),并且几乎支持任何语言(java,C#,c,c++,python等等)。

目前FastMQ发布了V0.1.0版本,此版本还不能很好的支持thread safe,属于预览版本,预计2010年10月底发布V0.1.1,v0.1.1版本将对thread safe有一个完美的支持。

FastMQ的客户端,目前考虑发布linux的C和windows的net版本,java版本也在考虑之中,但是暂无时间表。 Continue reading

Web应用中的轻量级消息队列

作者:老王
Web应用中为什么会需要消息队列?主要原因是由于在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的insert,update之类的请求同时到达mysql,直接导致无数的行锁表锁,甚至最后请求会堆积过多,从而触发too many connections错误。通过使用消息队列,我们可以异步处理请求,从而缓解系统的压力。在Web2.0的时代,高并发的情况越来越常见,从而使消息队列有成为居家必备的趋势,相应的也涌现出了很多实现方案,像Twitter以前就使用RabbitMQ实现消息队列服务,现在又转而使用Kestrel来实现消息队列服务,此外还有很多其他的选择,比如说:ActiveMQ,ZeroMQ等。
上述消息队列的软件中,大多为了实现AMQP,STOMP,XMPP之类的协议,变得极其重量级,但在很多Web应用中的实际情况是:我们只是想找到一个缓解高并发请求的解决方案,不需要杂七杂八的功能,一个轻量级的消息队列实现方式才是我们真正需要的。 Continue reading

又拍网架构中的分库设计

又拍网是一个照片分享社区,从2005年6月至今积累了260万用户,1.1亿张照片,目前的日访问量为200多万。5年的发展历程里经历过许多起伏,也积累了一些经验,在这篇文章里,我要介绍一些我们在技术上的积累。

又拍网和大多数Web2.0站点一样,构建于大量开源软件之上,包括MySQLPHPnginxPythonmemcachedredisSolrHadoopRabbitMQ等等。又拍网的服务器端开发语言主要是PHPPython,其中PHP用于编写Web逻辑(通过HTTP和用户直接打交道), 而Python则主要用于开发内部服务和后台任务。在客户端则使用了大量的Javascript, 这里要感谢一下MooTools这个JS框架,它使得我们很享受前端开发过程。 另外,我们把图片处理过程从PHP进程里独立出来变成一个服务。这个服务基于nginx,但是是作为nginx的一个模块而开放REST API。

开发语言

图1:开发语言

Continue reading

解剖Twitter:Twitter系统架构设计分析

随着信息爆炸的加剧,微博客网站Twitter横空出世了。用横空出世这个词来形容Twitter的成长,并不夸张。从2006年5月Twitter上线,到2007年12月,一年半的时间里,Twitter用户数从0增长到6.6万。又过了一年,2008年12月,Twitter的用户数达到5百万。[1]

Twitter网站的成功,先决条件是能够同时给千万用户提供服务,而且提供服务的速度要快。[2,3,4]

有观点认为,Twitter的业务逻辑简单,所以竞争门槛低。前半句正确,但是后半句有商榷余地。Twitter的竞争力,离不开严谨的系统架构设计。

【1】万事开头易

Twitter的核心业务逻辑,在于Following和Be followed。[5]

进入Twitter个人主页,你会看到你following的那些作者,最近发表的微博客。所谓微博客,就是一则短信,Twitter规定,短信的长度不得超过140个字。短信不仅可以包含普通文字信息,也可以包含URL,指向某个网页,或者照片及视频等等。这就是following的过程。

当你写了一则短信并发表以后,你的followers会立刻在他们的个人主页中看到你写的最新短信。这就是be followed的过程。

实现这个业务流程似乎很容易。 Continue reading

基于HTTP协议的轻量级开源简单队列服务:HTTPSQS

[文章作者:张宴 本文版本:v1.6.0 最后修改:2011.04.21 转载请注明原文链接:http://blog.s135.com/httpsqs/]

HTTPSQS(HTTP Simple Queue Service)是一款基于 HTTP GET/POST 协议的轻量级开源简单消息队列服务,使用 Tokyo Cabinet 的 B+Tree Key/Value 数据库来做数据的持久化存储。

项目网址:http://code.google.com/p/httpsqs/

使用文档:http://blog.s135.com/httpsqs/

使用环境:Linux(同时支持32位、64位操作系统,推荐使用64位操作系统)

软件作者:张宴

队列(Queue)又称先进先出表(First In First Out),即先进入队列的元素,先从队列中取出。加入元素的一头叫“队头”,取出元素的一头叫“队尾”。利用消息队列可以很好地异步处理数据传送和存储,当你频繁地向数据库中插入数据、频繁地向搜索引擎提交数据,就可采取消息队列来异步插入。另外,还可以将较慢的处理逻辑、有并发数量限制的处理逻辑,通过消息队列放在后台处理,例如FLV视频转换、发送手机短信、发送电子邮件等。 Continue reading

软件架构设计中的同步与异步问题(修改版)

内容概要:本文分析了大型程序系统设计中经常需要面对的同步和异步结构问题。列举异步结构模式实现手段,论证异步模式效率远远优越于同步模式,证明在硬件资源理想情况下,对同步模式而言并发量对计算机系统的平均交易处理时间没有影响,对异步模式而言平均交易处理时间会随着并发量的增大而急剧下降,最终也趋向一个恒定值。在实际有限计算机资源情况下,程序设计必须设置最大并发量以控制并发程度,否则过多并发量会形成交易对硬件资源的竞争,造成交易的拥塞。

关键词:同步,异步,消息队列,效率,并发

一.基本概念

同步和异步问题是大型程序设计中需要慎重等待的问题,但目前这方面的讨论很少,本文就试图进行有关方面讨论。

一个大型的程序系统常常是由很多不能功能模块组成的。程序系统运行时不同功能模块要按一定顺序执行,以协同完成一件任务。功能模块协作运行完成一件任务存在同步和异步两种方式。如果在某一时间段,这个程序系统的所有功能模块都在为完成相同的一件任务而服务,某一个功能模块在完成一件任务的子任务后,需要等待其他功能模块完成子任务,这样只有当全部功能模块按顺序完成一件任务后,程序系统才能接收下一个任务,功能模块是串行运行,这称之为同步模式。反之,在某一时间段,这个程序系统的不同功能模块可以独立运行完成一件任务的子任务,无须等待其他功能模块完成子任务就可以继续处理下一件任务的子任务,功能模块是并行运行,这称之为异步模式。 Continue reading

IPVS---LVS On FreeBSD的安装,配置

虽然LVS很早就出来了.不过近日听朋友提起,觉得比较有意思,就看了一下,顺便装来玩一下.因为是看文档操作的,过程有点闷.
但幸庆的是,终于是配置成功了.

测试环境:
VMWare 4.5.2
Load-Balancer : FreeBSD 6.1 (IPVS-0.4.0_2)
Real Server-01 : FreeBSD 6.1 (Apache 2, ModPerl 2, Mysql 5 Client)
Real Server-02 : FreeBSD 6.1 (Apache 2, ModPerl 2, Mysql 5 Client)

过程:
freebsd-lb#cd /usr/ports/net/ipvs/
freebsd-lb#make install clean
上面的过程会出现错误,于是我将ipvs-0.4.0_2.tar.gz拷贝到/tmp目录下.
freebsd-lb#cp /usr/ports/distfiles/ipvs-0.4.0_2.tar.gz /tmp/
再解压
freebsd-lb#tar -vzxf
ipvs-0.4.0_2.tar.gz
这样只是巧合不用再到指定地方下载ipvs-0.4.0_2.tar.gz这个包哈.
按照官方文档,正确过程应该是对内核打补丁,再重新编译后安装IPVS的. Continue reading

FreeBSD 单网卡绑定多个IP

假设网卡lnc0原IP地址为192.168.0.2,现在为它绑定另一个IP:

# ifconfig lnc0 192.168.0.3 netmask 255.255.255.255 alias

解释:

如果别名IP地址和网卡原IP地址在同一个子网上,就需要设置掩码为255.255.255.255

如果位于不同的子网,就直接使用相应子网的正常网络掩码

从TCP/IP的角度来看,这样做意味着什么呢?

网络掩码的所有位都设置成1,就会保证ICP/IP栈这样来看待包: Continue reading