新闻  |   论坛  |   博客  |   在线研讨会
QNX分布式小测试
xinjinlong | 2011-05-12 23:55:24    阅读:1903   发布文章
这两天研究了一下QNX的分布式性能,测试例子就是计算圆周率,为了好计算,就是使用了BBP算了,下面是我编码过程中遇到的一个问题,总结一下也算是经验,不管是不是你用分布式或许可以用上:

my_sem = sem_open(sem, O_EXCL);//充当互斥作用,多台机子
my_data = sem_open(data, O_EXCL);//充当全局变量,本来想用share memory,但是share memory只能对单机可以,多机无法map到

int n = 2;

//第一次代码

while( 1 )
{
sem_wait(my_sem);//加锁
sem_getval(my_data, &n);//得到全局值
sem_wait(my_data);//充当--操作
sem_post(my_sem);//解锁
Output(n);//计算函数
if( n - 1 < 0 )
{
break;
}
}

有些机子计算进程无法退出,一台机子算完了,另外一台机子还在跑,ps一下该进程还在,只有手工kill了
原因就是所粒度大,而且存在网络延时,有可能就挂在sem_wait()在了,还没有post就有wait了
还有就是sem_wait(my_data)没有办法才这样,他本来就有阻塞功能,如果只是0就挂了

//第二次代码

while( 1 )
{
sem_getval(my_data, &n);//得到全局值
sem_wait(my_sem);//加锁
sem_wait(my_data);//充当--操作
sem_post(my_sem);//解锁
Output(n);//计算函数
if( n - 1 < 0 )
{
break;
}
}

第一种现象还有,只是少,原因就是锁粒度小了,但是sem_wait(my_data)如果阻塞还是无法break,while就只有挂那了
还有就是计算粒度太小

//第三次代码

while( 1 )
{
if( n - 1 < 0 )
{
break;
}
sem_getval(my_data, &n);//得到全局值
sem_wait(my_sem);//加锁
sem_wait(my_data);//充当--操作
sem_post(my_sem);//解锁
for(i = 0; i < 10; i++)//放大计算粒度
{
Output(n--);//计算函数
}
}

问题总算解决了,锁粒度和计算粒度都合适,多台机子都很好的合作干完分到的任务

这个东西中感觉以后再写程序中,用信号量扮演了share memory的角色,我也没有办法啊,还有多台机子之间的互斥貌似只有用信号量了,这不是重点,重点是在类似这种while中,判断还是放在前面,处理放在后面
当然了,网络的延时在分布式中你不能不考虑,不过这个可以用算法保证,还有真正分布式不可能全用C来写程序,比如流行的ErLang等,但这是一种意识,可供参考!

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
fellow  2011-05-13 10:14:41 

博主好人,经验分享

五湖四海皆朋友
最近文章
浅谈MIPS的MMU(二)
2016-08-16 19:33:41
浅谈MIPS的MMU(一)
2016-05-05 10:55:06
推荐文章
最近访客